com.netsteadfast.greenstep.bsc.webservice.impl.ApiWebServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.netsteadfast.greenstep.bsc.webservice.impl.ApiWebServiceImpl.java

Source

/* 
 * Copyright 2012-2016 bambooCORE, greenstep of copyright Chen Xin Nien
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * -----------------------------------------------------------------------
 * 
 * author:    Chen Xin Nien
 * contact: chen.xin.nien@gmail.com
 * 
 */
package com.netsteadfast.greenstep.bsc.webservice.impl;

import java.util.LinkedList;
import java.util.List;

import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.netsteadfast.greenstep.base.AppContext;
import com.netsteadfast.greenstep.base.Constants;
import com.netsteadfast.greenstep.base.SysMessageUtil;
import com.netsteadfast.greenstep.base.exception.ServiceException;
import com.netsteadfast.greenstep.base.model.ChainResultObj;
import com.netsteadfast.greenstep.base.model.DefaultResult;
import com.netsteadfast.greenstep.base.model.GreenStepSysMsgConstants;
import com.netsteadfast.greenstep.base.model.YesNo;
import com.netsteadfast.greenstep.base.service.logic.BscBaseLogicServiceCommonSupport;
import com.netsteadfast.greenstep.bsc.command.KpiReportBodyCommand;
import com.netsteadfast.greenstep.bsc.model.BscStructTreeObj;
import com.netsteadfast.greenstep.bsc.service.IEmployeeService;
import com.netsteadfast.greenstep.bsc.service.IOrganizationService;
import com.netsteadfast.greenstep.bsc.service.IVisionService;
import com.netsteadfast.greenstep.bsc.util.BscReportSupportUtils;
import com.netsteadfast.greenstep.bsc.util.PerformanceScoreChainUtils;
import com.netsteadfast.greenstep.bsc.vo.BscApiServiceResponse;
import com.netsteadfast.greenstep.bsc.webservice.ApiWebService;
import com.netsteadfast.greenstep.model.UploadTypes;
import com.netsteadfast.greenstep.po.hbm.BbEmployee;
import com.netsteadfast.greenstep.po.hbm.BbMeasureData;
import com.netsteadfast.greenstep.po.hbm.BbOrganization;
import com.netsteadfast.greenstep.po.hbm.BbVision;
import com.netsteadfast.greenstep.sys.WsAuthenticateUtils;
import com.netsteadfast.greenstep.util.ApplicationSiteUtils;
import com.netsteadfast.greenstep.util.HostUtils;
import com.netsteadfast.greenstep.util.JFreeChartDataMapperUtils;
import com.netsteadfast.greenstep.util.UploadSupportUtils;
import com.netsteadfast.greenstep.vo.DateRangeScoreVO;
import com.netsteadfast.greenstep.vo.EmployeeVO;
import com.netsteadfast.greenstep.vo.KpiVO;
import com.netsteadfast.greenstep.vo.ObjectiveVO;
import com.netsteadfast.greenstep.vo.OrganizationVO;
import com.netsteadfast.greenstep.vo.PerspectiveVO;
import com.netsteadfast.greenstep.vo.VisionVO;
import com.thoughtworks.xstream.XStream;

@Service("bsc.webservice.ApiWebService")
@WebService
@SOAPBinding
@Path("/")
@Produces("application/json")
public class ApiWebServiceImpl implements ApiWebService {
    private static final int MeterChart_width = 320;
    private static final int MeterChart_height = 280;
    private WebServiceContext webServiceContext;

    public WebServiceContext getWebServiceContext() {
        return webServiceContext;
    }

    @Autowired
    @Resource(name = "webServiceContext")
    public void setWebServiceContext(WebServiceContext webServiceContext) {
        this.webServiceContext = webServiceContext;
    }

    private int getMeterChartLowerBound(float score, float min) {
        if (score < min) {
            return (int) score;
        }
        return (int) min;
    }

    private int getMeterChartUpperBound(float score, float target) {
        if (score > target) {
            return (int) score;
        }
        return (int) target;
    }

    private void processForScorecard(BscApiServiceResponse responseObj, HttpServletRequest request,
            String visionOid, String startDate, String endDate, String startYearDate, String endYearDate,
            String frequency, String dataFor, String measureDataOrganizationOid, String measureDataEmployeeOid,
            String contentFlag) throws ServiceException, Exception {

        org.apache.commons.chain.Context context = PerformanceScoreChainUtils.getContext(visionOid, startDate,
                endDate, startYearDate, endYearDate, frequency, dataFor, measureDataOrganizationOid,
                measureDataEmployeeOid);
        ChainResultObj result = PerformanceScoreChainUtils.getResult(context);
        if (result.getValue() == null || ((BscStructTreeObj) result.getValue()).getVisions() == null
                || ((BscStructTreeObj) result.getValue()).getVisions().size() == 0) {
            return;
        }
        String meterChartBaseUrl = ""; //  Meter Chart 
        String barChartBaseUrl = ""; //  BAR Chart 
        String pieChartBaseUrl = ""; //  PIE Chart 
        String url = ""; //  HTML 
        if (request != null) {
            url = ApplicationSiteUtils.getBasePath(Constants.getSystem(), request);
        } else {
            url = HostUtils.getHostAddress() + ":" + HostUtils.getHttpPort() + "/"
                    + ApplicationSiteUtils.getContextPath(Constants.getSystem());
        }
        if (!url.endsWith("/")) {
            url += "/";
        }
        meterChartBaseUrl = url + "bsc.commonMeterChartAction.action";
        barChartBaseUrl = url + "bsc.commonBarChartAction.action";
        pieChartBaseUrl = url + "bsc.commonPieChartAction.action";
        BscStructTreeObj resultObj = (BscStructTreeObj) result.getValue();
        KpiReportBodyCommand reportBody = new KpiReportBodyCommand();
        reportBody.execute(context);
        Object htmlBody = reportBody.getResult(context);
        if (htmlBody != null && htmlBody instanceof String) {
            String htmlUploadOid = UploadSupportUtils.create(Constants.getSystem(), UploadTypes.IS_TEMP, false,
                    String.valueOf(htmlBody).getBytes(), "KPI-HTML-REPORT.html");
            url += "bsc.printContentAction.action?oid=" + htmlUploadOid;
            responseObj.setHtmlBodyUrl(url);
        }
        VisionVO visionObj = resultObj.getVisions().get(0);
        //  Meter Chart 
        for (PerspectiveVO perspective : visionObj.getPerspectives()) {
            String perspectiveMeterChartOid = JFreeChartDataMapperUtils.createMeterData(perspective.getName(),
                    perspective.getScore(),
                    this.getMeterChartLowerBound(perspective.getScore(), perspective.getMin()),
                    this.getMeterChartUpperBound(perspective.getScore(), perspective.getTarget()), MeterChart_width,
                    MeterChart_height);
            responseObj.getPerspectivesMeterChartUrl().add(meterChartBaseUrl + "?oid=" + perspectiveMeterChartOid);
            for (ObjectiveVO objective : perspective.getObjectives()) {
                String objectiveMeterChartOid = JFreeChartDataMapperUtils.createMeterData(objective.getName(),
                        (int) objective.getScore(),
                        this.getMeterChartLowerBound(objective.getScore(), objective.getMin()),
                        this.getMeterChartUpperBound(objective.getScore(), objective.getTarget()), MeterChart_width,
                        MeterChart_height);
                responseObj.getObjectivesMeterChartUrl().add(meterChartBaseUrl + "?oid=" + objectiveMeterChartOid);
                for (KpiVO kpi : objective.getKpis()) {
                    String kpiMeterChartOid = JFreeChartDataMapperUtils.createMeterData(kpi.getName(),
                            kpi.getScore(), this.getMeterChartLowerBound(kpi.getScore(), kpi.getMin()),
                            this.getMeterChartUpperBound(kpi.getScore(), kpi.getTarget()), MeterChart_width,
                            MeterChart_height);
                    responseObj.getKpisMeterChartUrl().add(meterChartBaseUrl + "?oid=" + kpiMeterChartOid);
                }
            }
        }

        //  Perspectives Bar/Pie chart
        String barUploadOid = "";
        String pieUploadOid = "";
        List<String> names = new LinkedList<String>();
        List<Float> values = new LinkedList<Float>();
        List<String> colors = new LinkedList<String>();
        for (PerspectiveVO perspective : visionObj.getPerspectives()) {
            names.add(perspective.getName() + "(" + BscReportSupportUtils.parse2(perspective.getScore()) + ")");
            values.add(perspective.getScore());
            colors.add(perspective.getBgColor());
        }
        barUploadOid = JFreeChartDataMapperUtils.createBarData(visionObj.getTitle(), "Score", "", names, values,
                colors, 480, 280, false);
        pieUploadOid = JFreeChartDataMapperUtils.createPieData(visionObj.getTitle(), names, values, colors, 480,
                280);
        responseObj.setPieChartUrl(pieChartBaseUrl + "?oid=" + pieUploadOid);
        responseObj.setBarChartUrl(barChartBaseUrl + "?oid=" + barUploadOid);

        PerformanceScoreChainUtils.clearExpressionContentOut(visionObj);
        responseObj.setSuccess(YesNo.YES);
        if (YesNo.YES.equals(contentFlag)) {
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonData = objectMapper.writeValueAsString(visionObj);
            XStream xstream = new XStream();
            xstream.setMode(XStream.NO_REFERENCES);
            xstream.alias("vision", VisionVO.class);
            xstream.alias("perspective", PerspectiveVO.class);
            xstream.alias("objective", ObjectiveVO.class);
            xstream.alias("kpi", KpiVO.class);
            xstream.alias("measureData", BbMeasureData.class);
            xstream.alias("dateRangeScore", DateRangeScoreVO.class);
            xstream.alias("employee", EmployeeVO.class);
            xstream.alias("organization", OrganizationVO.class);
            String xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + xstream.toXML(visionObj);
            responseObj.setOutJsonData(jsonData);
            responseObj.setOutXmlData(xmlData);
        }
    }

    /**
     * SOAP  SoapUI 
     * ==================================================================================
       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.bsc.greenstep.netsteadfast.com/">
     <soapenv:Header/>
     <soapenv:Body>
         
        <web:getScorecard1>
            
           <visionOid>1089abb5-3faf-445d-88ff-cd7690ac6743</visionOid>
           <startDate></startDate>
           <endDate></endDate>
           <startYearDate>2015</startYearDate>
           <endYearDate>2016</endYearDate>
           <frequency>6</frequency>
           <dataFor>all</dataFor>
           <measureDataOrganizationOid></measureDataOrganizationOid>
           <measureDataEmployeeOid></measureDataEmployeeOid>
           <contentFlag></contentFlag>
               
        </web:getScorecard1>
            
     </soapenv:Body>
       </soapenv:Envelope>
     * ==================================================================================
     * 
     * 
     * REST :
     * curl -i -X GET "http://127.0.0.1:8080/gsbsc-web/services/jaxrs/scorecard1?visionOid=1089abb5-3faf-445d-88ff-cd7690ac6743&startDate=&endDate=&startYearDate=2015&endYearDate=2016&frequency=6&dataFor=all&measureDataOrganizationOid=&measureDataEmployeeOid=&contentFlag="
     * 
     */
    @WebMethod
    @GET
    @Path("/scorecard1/")
    @Override
    public BscApiServiceResponse getScorecard1(
            @WebParam(name = "visionOid") @QueryParam("visionOid") String visionOid,
            @WebParam(name = "startDate") @QueryParam("startDate") String startDate,
            @WebParam(name = "endDate") @QueryParam("endDate") String endDate,
            @WebParam(name = "startYearDate") @QueryParam("startYearDate") String startYearDate,
            @WebParam(name = "endYearDate") @QueryParam("endYearDate") String endYearDate,
            @WebParam(name = "frequency") @QueryParam("frequency") String frequency,
            @WebParam(name = "dataFor") @QueryParam("dataFor") String dataFor,
            @WebParam(name = "measureDataOrganizationOid") @QueryParam("measureDataOrganizationOid") String measureDataOrganizationOid,
            @WebParam(name = "measureDataEmployeeOid") @QueryParam("measureDataEmployeeOid") String measureDataEmployeeOid,
            @WebParam(name = "contentFlag") @QueryParam("contentFlag") String contentFlag) throws Exception {

        HttpServletRequest request = null;
        if (this.getWebServiceContext() != null && this.getWebServiceContext().getMessageContext() != null) {
            request = (HttpServletRequest) this.getWebServiceContext().getMessageContext()
                    .get(MessageContext.SERVLET_REQUEST);
        }
        Subject subject = null;
        BscApiServiceResponse responseObj = new BscApiServiceResponse();
        responseObj.setSuccess(YesNo.NO);
        try {
            subject = WsAuthenticateUtils.login();
            this.processForScorecard(responseObj, request, visionOid, startDate, endDate, startYearDate,
                    endYearDate, frequency, dataFor, measureDataOrganizationOid, measureDataEmployeeOid,
                    contentFlag);
        } catch (Exception e) {
            responseObj.setMessage(e.getMessage());
        } finally {
            if (!YesNo.YES.equals(responseObj.getSuccess())) {
                responseObj.setMessage(SysMessageUtil.get(GreenStepSysMsgConstants.SEARCH_NO_DATA));
            }
            WsAuthenticateUtils.logout(subject);
        }
        subject = null;
        return responseObj;
    }

    @WebMethod
    @GET
    @Path("/scorecard2/")
    @Override
    public BscApiServiceResponse getScorecard2(@WebParam(name = "visionId") @QueryParam("visionId") String visionId,
            @WebParam(name = "startDate") @QueryParam("startDate") String startDate,
            @WebParam(name = "endDate") @QueryParam("endDate") String endDate,
            @WebParam(name = "startYearDate") @QueryParam("startYearDate") String startYearDate,
            @WebParam(name = "endYearDate") @QueryParam("endYearDate") String endYearDate,
            @WebParam(name = "frequency") @QueryParam("frequency") String frequency,
            @WebParam(name = "dataFor") @QueryParam("dataFor") String dataFor,
            @WebParam(name = "measureDataOrganizationId") @QueryParam("measureDataOrganizationId") String measureDataOrganizationId,
            @WebParam(name = "measureDataEmployeeId") @QueryParam("measureDataEmployeeId") String measureDataEmployeeId,
            @WebParam(name = "contentFlag") @QueryParam("contentFlag") String contentFlag) throws Exception {

        HttpServletRequest request = null;
        if (this.getWebServiceContext() != null && this.getWebServiceContext().getMessageContext() != null) {
            request = (HttpServletRequest) this.getWebServiceContext().getMessageContext()
                    .get(MessageContext.SERVLET_REQUEST);
        }
        Subject subject = null;
        BscApiServiceResponse responseObj = new BscApiServiceResponse();
        responseObj.setSuccess(YesNo.NO);
        try {
            subject = WsAuthenticateUtils.login();
            @SuppressWarnings("unchecked")
            IVisionService<VisionVO, BbVision, String> visionService = (IVisionService<VisionVO, BbVision, String>) AppContext
                    .getBean("bsc.service.VisionService");
            @SuppressWarnings("unchecked")
            IEmployeeService<EmployeeVO, BbEmployee, String> employeeService = (IEmployeeService<EmployeeVO, BbEmployee, String>) AppContext
                    .getBean("bsc.service.EmployeeService");
            @SuppressWarnings("unchecked")
            IOrganizationService<OrganizationVO, BbOrganization, String> organizationService = (IOrganizationService<OrganizationVO, BbOrganization, String>) AppContext
                    .getBean("bsc.service.OrganizationService");
            String visionOid = "";
            String measureDataOrganizationOid = "";
            String measureDataEmployeeOid = "";
            DefaultResult<VisionVO> visionResult = visionService.findForSimpleByVisId(visionId);
            if (visionResult.getValue() == null) {
                throw new Exception(visionResult.getSystemMessage().getValue());
            }
            visionOid = visionResult.getValue().getOid();
            if (StringUtils.isBlank(measureDataOrganizationId)) {
                measureDataOrganizationOid = BscBaseLogicServiceCommonSupport
                        .findEmployeeDataByEmpId(employeeService, measureDataOrganizationId).getOid();
            }
            if (StringUtils.isBlank(measureDataEmployeeId)) {
                measureDataEmployeeOid = BscBaseLogicServiceCommonSupport
                        .findOrganizationDataByUK(organizationService, measureDataEmployeeId).getOid();
            }
            this.processForScorecard(responseObj, request, visionOid, startDate, endDate, startYearDate,
                    endYearDate, frequency, dataFor, measureDataOrganizationOid, measureDataEmployeeOid,
                    contentFlag);
        } catch (Exception e) {
            responseObj.setMessage(e.getMessage());
        } finally {
            if (!YesNo.YES.equals(responseObj.getSuccess())) {
                responseObj.setMessage(SysMessageUtil.get(GreenStepSysMsgConstants.SEARCH_NO_DATA));
            }
            WsAuthenticateUtils.logout(subject);
        }
        subject = null;
        return responseObj;
    }

}