Package com.dotmarketing.portlets.report.action

Source Code of com.dotmarketing.portlets.report.action.RunReportAction

/**
* Copyright (c) 2000-2004 Liferay, LLC. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package com.dotmarketing.portlets.report.action;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.dotcms.repackage.javax.portlet.ActionRequest;
import com.dotcms.repackage.javax.portlet.ActionResponse;
import com.dotcms.repackage.javax.portlet.PortletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;

import com.dotcms.repackage.org.apache.struts.action.ActionForm;
import com.dotcms.repackage.org.apache.struts.action.ActionMapping;

import com.dotcms.repackage.bsh.EvalError;

import com.dotmarketing.business.Role;
import com.dotmarketing.db.DbConnectionFactory;
import com.dotmarketing.exception.DotHibernateException;
import com.dotmarketing.portal.struts.DotPortletAction;
import com.dotmarketing.portlets.report.businessrule.ReportParamterBR;
import com.dotmarketing.portlets.report.factories.ReportFactory;
import com.dotmarketing.portlets.report.factories.ReportParameterFactory;
import com.dotmarketing.portlets.report.model.Report;
import com.dotmarketing.portlets.report.model.ReportParameter;
import com.dotmarketing.portlets.webforms.action.GenerateWebFormsReportAction;
import com.dotmarketing.util.Config;
import com.dotmarketing.util.Logger;
import com.dotmarketing.util.Parameter;
import com.dotmarketing.util.UtilMethods;
import com.liferay.portal.model.User;
import com.liferay.portal.util.Constants;
import com.liferay.portlet.ActionRequestImpl;
import com.liferay.portlet.ActionResponseImpl;
import com.liferay.util.servlet.SessionMessages;

/**
*
* @author  Jason Tesser
*
*/

public class RunReportAction extends DotPortletAction {

    public static final String CMD_RUN = "run";
    public static final String CMD_WEBFORM_RUN = "webform_run";
    public static final String PARAMETERS_SUBMITTED = "parsSubmitted";
    private String referrer;
    private boolean pdf = false;
    private boolean xls = false;
    private boolean rtf = false;
    private boolean html = false;
   
    private ArrayList<ReportParameter> reportParameters = new ArrayList<ReportParameter>();
   
    @Override
  public void processAction(ActionMapping mapping, ActionForm form, PortletConfig config, ActionRequest req, ActionResponse res) throws Exception {
  Logger.debug(this, "Running report");
  req.setAttribute(ViewReportsAction.REPORT_EDITOR_OR_ADMIN, false);
  User user = _getUser(req);
  List<Role> roles = com.dotmarketing.business.APILocator.getRoleAPI().loadRolesForUser(user.getUserId());
  req.setAttribute(ViewReportsAction.REPORT_EDITOR_OR_ADMIN, true);

  ActionRequestImpl reqImpl = (ActionRequestImpl) req;
  HttpServletRequest httpReq = reqImpl.getHttpServletRequest();
  ActionResponseImpl resImpl = (ActionResponseImpl) res;
  HttpServletResponse httpRes = resImpl.getHttpServletResponse();
  reportParameters = new ArrayList<ReportParameter>();
  String cmd = req.getParameter(Constants.CMD);
  pdf = Parameter.getBooleanFromString(req.getParameter("pdf"),false);
  xls = Parameter.getBooleanFromString(req.getParameter("xls"),false);
  rtf = Parameter.getBooleanFromString(req.getParameter("rtf"),false);
  html = Parameter.getBooleanFromString(req.getParameter("html"),false);
  String reportId = req.getParameter("reportId");
  Long pageIndex = UtilMethods.parseLong(req.getParameter("pageIndex"), 0);
 
  //set default referrer
  referrer = req.getParameter("referrer");
  if(referrer == null || referrer.equals("")){
      java.util.Hashtable params = new java.util.Hashtable ();
      params.put("struts_action", new String [] {"/ext/report/view_reports"} );
      //      params.put("pageNumber",new String[] { pageNumber + "" });
     
      referrer = com.dotmarketing.util.PortletURLUtil.getRenderURL(httpReq, com.dotcms.repackage.javax.portlet.WindowState.MAXIMIZED.toString(), params);
  }
  Logger.debug(this, "Inside RunReportAction cmd=" + cmd);
  File reportFile;
  Report report;
  if ((cmd != null) && cmd.equals(CMD_RUN)) {
      try{
    report = ReportFactory.getReport(reportId);
    ArrayList<String> adminRoles = new ArrayList<String>();
    adminRoles.add("CMS Administrator");
    _checkReadPermissions(report,user, httpReq, adminRoles);
      }catch(DotHibernateException he){
    Logger.error(this, "Unable to Load Report " + he.toString());
    HashMap<String, String[]> params = new HashMap<String, String[]>();
    SessionMessages.add(req,"message.report.run.load.report.error");
    params.put("struts_action", new String [] {"/ext/report/view_reports"} );
    _sendToReferral(req, res, referrer);
    return;
      }
     
      String filePath = null;
      if (UtilMethods.isSet(Config.getStringProperty("ASSET_REAL_PATH"))) {
        filePath = Config.getStringProperty("ASSET_REAL_PATH") + File.separator + Config.getStringProperty("REPORT_PATH") + File.separator + report.getInode() + ".jasper";
      } else {
        filePath = httpReq.getSession().getServletContext().getRealPath(File.separator + Config.getStringProperty("ASSET_PATH") + File.separator + Config.getStringProperty("REPORT_PATH") + File.separator + report.getInode() + ".jasper");
      }
     
     
      reportFile = new File(filePath);
      if(!reportFile.exists()){
    Logger.error(this, "Unable to Load Jasper File: " + filePath);
    HashMap<String, String[]> params = new HashMap<String, String[]>();
    SessionMessages.add(req,"error","message.report.run.load.jasper.error");
    params.put("struts_action", new String [] {"/ext/report/view_reports"} );
    _sendToReferral(req, res, referrer);
    return;
      }
      if(report.isRequiresInput()){
    ReportParameterFactory.getReportParameters(report);
    reportParameters = report.getParameters();
    httpReq.setAttribute("reportParameters", reportParameters);
    if(!Parameter.getBooleanFromString(req.getParameter(PARAMETERS_SUBMITTED), false)){
        _setExportAttribute(httpReq);
        setForward(req, "portlet.ext.report.get_parameters");
        return;
    }
      }
      try{
    _generateReport(report, reportFile, pageIndex.intValue(), httpReq, reportParameters);
      }catch(Exception ex){
    SessionMessages.add(req,"error", "message.report.run.error");
    Logger.error(this, "Unable to Run Report 3: " + ex.toString());
    HashMap<String, String[]> params = new HashMap<String, String[]>();
    params.put("struts_action", new String [] {"/ext/report/view_reports"} );
    _sendToReferral(req, res, referrer);
    return;
      }
      if(pdf){
    res.sendRedirect("/servlets/pdf");
      }else if(xls){
    res.sendRedirect("/servlets/jxl");
      }else if(rtf){
    res.sendRedirect("/servlets/rtf");
      }else{
    setForward(req, "portlet.ext.report.run_report");
      }
      return;
  }
 
  if ((cmd != null) && cmd.equals(CMD_WEBFORM_RUN)) {
    GenerateWebFormsReportAction generateWebFormsReportAction = new GenerateWebFormsReportAction();
    generateWebFormsReportAction.processAction(mapping, form, config, reqImpl, resImpl);
    setForward(req, "portlet.ext.report.run_report");
    return;
  }
    }

    private void _generateReport(Report report, File reportFile, int pageIndex, HttpServletRequest request, ArrayList<ReportParameter> rPars)
  throws JRException, EvalError{
  Logger.debug(this, "Executing _generateReport");
  JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
  HashMap<String, String> submittedPars = new HashMap<String, String>();
  Map<String, Object> parameters = new HashMap<String, Object>();
  //    parameters.put("ReportTitle", "Jira Reporter Report");
  parameters.put("BaseDir", reportFile.getParentFile());
 
  for (ReportParameter par : rPars) {
      if(ReportParamterBR.isDateParameter(par.getClassType())){
    Logger.debug(this, "Getting date parameter" + par.getName());
    Calendar c = Calendar.getInstance();
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DATE);
    int year = c.get(Calendar.YEAR);
    String date = request.getParameter(par.getName() + "date");
    if(date.matches(com.dotmarketing.util.Constants.REG_EX_VALIDATION_DATE_WITH_FORWARDSLASH) && date != null){
        String[] splitDate = date.split("/");
        month = Integer.valueOf(splitDate[0]) - 1;
        day = Integer.valueOf(splitDate[1]);
        year = Integer.valueOf(splitDate[2]);
    }
    int hour = Parameter.getInt(request.getParameter(par.getName() + "hour"), 0) == 0 || Parameter.getInt(request.getParameter(par.getName() + "hour")) == 12 ? 0 : Parameter.getInt(request.getParameter(par.getName() + "hour"));
    int min = Parameter.getInt(request.getParameter(par.getName() + "min"), 0);
    int sec = Parameter.getInt(request.getParameter(par.getName() + "sec"), 0);
    int partOfDay;
    if(request.getParameter(par.getName() + "dayPart").equalsIgnoreCase("am")){
        partOfDay = Calendar.AM;
        submittedPars.put(par.getName() + "dayPart", "am");
    }else{
        partOfDay = Calendar.PM;
        submittedPars.put(par.getName() + "dayPart", "pm");
    }
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DATE, day);
    c.set(Calendar.YEAR, year);
    c.set(Calendar.HOUR, hour);
    c.set(Calendar.MINUTE, min);
    c.set(Calendar.SECOND, sec);
    c.set(Calendar.AM_PM, partOfDay);
    parameters.put(par.getName(), c.getTime());
    Date d = c.getTime();
    submittedPars.put(par.getName() + "date", (month + 1) + "/" + day + "/" + year);
    submittedPars.put(par.getName() + "year", String.valueOf(c.get(Calendar.YEAR)));
    submittedPars.put(par.getName() + "month", String.valueOf(c.get(Calendar.MONTH)));
    submittedPars.put(par.getName() + "day", String.valueOf(c.get(Calendar.DAY_OF_MONTH)));
    submittedPars.put(par.getName() + "hour", Parameter.getString(request.getParameter(par.getName() + "hour"),"0"));
    submittedPars.put(par.getName() + "min", Parameter.getString(request.getParameter(par.getName() + "min"),"0"));
    submittedPars.put(par.getName() + "sec", Parameter.getString(request.getParameter(par.getName() + "sec"),"0"));
   
      }else if(ReportParamterBR.isStringParameter(par.getClassType())){
    Logger.debug(this, "Getting string parameter " + par.getName());
    parameters.put(par.getName(), new com.dotcms.repackage.bsh.Interpreter().eval("new " + par.getClassType() + " (\"" + Parameter.getString(request.getParameter(String.valueOf(par.getName())) + "\")","")));
    submittedPars.put(String.valueOf(par.getName()), Parameter.getString(request.getParameter(String.valueOf(par.getName())),"0"));
      }else if(ReportParamterBR.isBooleanParameter(par.getClassType())){
    Logger.debug(this, "Getting boolean parameter " + par.getName());
    parameters.put(par.getName(), new com.dotcms.repackage.bsh.Interpreter().eval("new " + par.getClassType() + " (" + Parameter.getString(request.getParameter(String.valueOf(par.getName())) + ")","false")));
    submittedPars.put(String.valueOf(par.getName()), Parameter.getString(request.getParameter(String.valueOf(par.getName())),"false"));
      }else if(ReportParamterBR.isObjectParameter(par.getClassType())){
    Logger.debug(this, "Getting object parameter " + par.getName());
    Logger.debug(this, "Object parameter: " + request.getParameter(String.valueOf(par.getName())));
    Logger.debug(this, "Object parameter of type: " + request.getParameter(String.valueOf(par.getName())).getClass());
    if (UtilMethods.isSet(par.getDefaultValue()) &&
      par.getDefaultValue().contains("SelectParameter") &&
      par.getDefaultValue().contains("multiple")) {
      Object param = request.getParameterValues(String.valueOf(par.getName()));
      if (param instanceof String[]) {
        String[] stringParam = (String[]) param;
        StringBuilder params = new StringBuilder(256);
        params.ensureCapacity(128);
        for (int i = 0; i < stringParam.length; ++i) {
          if (params.length() == 0)
            params.append(stringParam[i]);
          else
            params.append(", " + stringParam[i]);
        }
       
        parameters.put(par.getName(), new com.dotcms.repackage.bsh.Interpreter().eval("new String (\"" + Parameter.getString(params.toString() + "\")","")));
      }
    } else {
      Object param = request.getParameter(String.valueOf(par.getName()));
      if (param instanceof String) {
        parameters.put(par.getName(), new com.dotcms.repackage.bsh.Interpreter().eval("new String (\"" + Parameter.getString(request.getParameter(String.valueOf(par.getName())) + "\")","")));
        submittedPars.put(String.valueOf(par.getName()), Parameter.getString(request.getParameter(String.valueOf(par.getName())), "0"));
      }
    }
      }else{
    Logger.debug(this, "Getting parameter " + par.getName());
    parameters.put(par.getName(), new com.dotcms.repackage.bsh.Interpreter().eval("new " + par.getClassType() + " (" + Parameter.getString(request.getParameter(String.valueOf(par.getName())) + ")","0")));
    submittedPars.put(String.valueOf(par.getName()), Parameter.getString(request.getParameter(String.valueOf(par.getName())),"0"));
      }
  }
 
  Logger.debug(this, "Call to fillReport with Data Source: " + report.getDs());
  JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, DbConnectionFactory.getConnection(report.getDs()));
 
  Logger.debug(this, "Creating exporter");
  JRHtmlExporter exporter = new JRHtmlExporter();
 
  Logger.debug(this, "Getting pages");
  int lastPageIndex = 0;
  if (jasperPrint.getPages() != null) {
      lastPageIndex = jasperPrint.getPages().size() - 1;
  }
 
  if (!(pageIndex >= 0)) {
      pageIndex = 0;
  }
 
  if (pageIndex > lastPageIndex) {
      pageIndex = lastPageIndex;
  }
 
  StringBuffer sbuffer = new StringBuffer();
 
  request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);

  Logger.debug(this, "Setting parameters");
  exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
  exporter.setParameter(JRExporterParameter.OUTPUT_STRING_BUFFER,  sbuffer);
  if (jasperPrint.getPages() != null && jasperPrint.getPages().size()>0){
      exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex));
  }
  exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER, "");
  exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
  exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER, "");
  exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/servlets/jrimage?image=");
 
  request.getSession().setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);
 
  Logger.debug(this, "Exporting report");
  exporter.exportReport();
  request.setAttribute("reportSB", sbuffer);
  request.setAttribute("pageIndex", pageIndex);
  request.setAttribute("lastPageIndex", lastPageIndex);
  request.setAttribute("reportId", report.getInode());
  request.setAttribute("submittedPars", submittedPars);
 
    }
    private void _setExportAttribute(HttpServletRequest req){
  req.setAttribute("pdf", pdf);
  req.setAttribute("xls", xls);
  req.setAttribute("rtf", rtf);
  req.setAttribute("html", html);
    }
}
TOP

Related Classes of com.dotmarketing.portlets.report.action.RunReportAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.