Package org.projectforge.web.scripting

Source Code of org.projectforge.web.scripting.ScriptingPage

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////

package org.projectforge.web.scripting;

import java.io.File;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.common.DateHelper;
import org.projectforge.common.FileHelper;
import org.projectforge.core.ConfigXml;
import org.projectforge.excel.ExportWorkbook;
import org.projectforge.export.ExportJFreeChart;
import org.projectforge.export.ExportJson;
import org.projectforge.export.ExportZipArchive;
import org.projectforge.fibu.kost.reporting.ReportGeneratorList;
import org.projectforge.fibu.kost.reporting.ReportStorage;
import org.projectforge.scripting.GroovyExecutor;
import org.projectforge.scripting.GroovyResult;
import org.projectforge.scripting.ScriptDao;
import org.projectforge.user.PFUserContext;
import org.projectforge.user.ProjectForgeGroup;
import org.projectforge.web.fibu.ReportObjectivesPage;
import org.projectforge.web.fibu.ReportScriptingStorage;
import org.projectforge.web.wicket.DownloadUtils;
import org.projectforge.web.wicket.JFreeChartImage;

public class ScriptingPage extends AbstractScriptingPage
{
  private static final long serialVersionUID = -1910145309628761662L;

  private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(ScriptingPage.class);

  private transient ReportScriptingStorage reportScriptingStorage;

  @SpringBean(name = "scriptDao")
  private ScriptDao scriptDao;

  @SpringBean(name = "groovyExecutor")
  private GroovyExecutor groovyExecutor;

  private final ScriptingForm form;

  private Label availableScriptVariablesLabel;

  private WebMarkupContainer imageResultContainer;

  private transient Map<String, Object> scriptVariables;

  protected transient ReportStorage reportStorage;

  public ScriptingPage(final PageParameters parameters)
  {
    super(parameters);
    form = new ScriptingForm(this);
    body.add(form);
    form.init();
    initScriptVariables();
    body.add(imageResultContainer = (WebMarkupContainer) new WebMarkupContainer("imageResult").setVisible(false));
  }

  private void initScriptVariables()
  {
    if (scriptVariables != null) {
      // Already initialized.
      return;
    }
    scriptVariables = new HashMap<String, Object>();
    scriptVariables.put("reportStorage", null);
    scriptVariables.put("reportScriptingStorage", null);
    scriptDao.addScriptVariables(scriptVariables);
    final SortedSet<String> set = new TreeSet<String>();
    set.addAll(scriptVariables.keySet());
    final StringBuffer buf = new StringBuffer();
    buf.append("scriptResult"); // first available variable.
    for (final String key : set) {
      buf.append(", ").append(key);
    }
    if (availableScriptVariablesLabel == null) {
      body.add(availableScriptVariablesLabel = new Label("availableScriptVariables", buf.toString()));
    }
    scriptDao.addAliasForDeprecatedScriptVariables(scriptVariables);
    // buf = new StringBuffer();
    // boolean first = true;
    // for (final BusinessAssessmentRowConfig rowConfig : AccountingConfig.getInstance().getBusinessAssessmentConfig().getRows()) {
    // if (rowConfig.getId() == null) {
    // continue;
    // }
    // if (first == true) {
    // first = false;
    // } else {
    // buf.append(", ");
    // }
    // buf.append('r').append(rowConfig.getNo()).append(", ").append(rowConfig.getId());
    // }
    // if (businessAssessmentRowsVariablesLabel == null) {
    // body.add(businessAssessmentRowsVariablesLabel = new Label("businessAssessmentRowsVariables", buf.toString()));
    // }
  }

  protected void execute()
  {
    accessChecker.checkIsLoggedInUserMemberOfGroup(ProjectForgeGroup.FINANCE_GROUP, ProjectForgeGroup.CONTROLLING_GROUP);
    accessChecker.checkRestrictedOrDemoUser();
    imageResultContainer.setVisible(false);
    ReportGeneratorList reportGeneratorList = new ReportGeneratorList();
    initScriptVariables();
    scriptVariables.put("reportStorage", getReportStorage());
    scriptVariables.put("reportScriptingStorage", getReportScriptingStorage());
    scriptVariables.put("reportList", reportGeneratorList);
    if (StringUtils.isNotBlank(getReportScriptingStorage().getGroovyScript()) == true) {
      groovyResult = groovyExecutor.execute(new GroovyResult(), getReportScriptingStorage().getGroovyScript(), scriptVariables);
      if (groovyResult.hasException() == true) {
        form.error(getLocalizedMessage("exception.groovyError", String.valueOf(groovyResult.getException())));
        return;
      }
      if (groovyResult.hasResult() == true) {
        // TODO maybe a good point to generalize to AbstractScriptingPage?
        final Object result = groovyResult.getResult();
        if (result instanceof ExportWorkbook == true) {
          excelExport();
        } else if (groovyResult.getResult() instanceof ReportGeneratorList == true) {
          reportGeneratorList = (ReportGeneratorList) groovyResult.getResult();
          // jasperReport(reportGeneratorList);
        } else if (result instanceof ExportZipArchive) {
          zipExport();
        } else if (result instanceof ExportJFreeChart) {
          jFreeChartExport();
        } else if (result instanceof ExportJson) {
          jsonExport();
        }
      }
      // } else if (getReportScriptingStorage().getJasperReport() != null) {
      // jasperReport();
    }
  }

  protected void upload()
  {
    accessChecker.checkIsLoggedInUserMemberOfGroup(ProjectForgeGroup.FINANCE_GROUP, ProjectForgeGroup.CONTROLLING_GROUP);
    accessChecker.checkRestrictedOrDemoUser();
    log.info("upload");
    final FileUpload fileUpload = form.fileUploadField.getFileUpload();
    if (fileUpload != null) {
      final boolean delete = false;
      try {
        final InputStream is = fileUpload.getInputStream();
        final String clientFileName = fileUpload.getClientFileName();
        if (clientFileName.endsWith(".jrxml") == true) {
          log.error("Jasper reports not supported.");
          // delete = true;
          // final JasperReport report = JasperCompileManager.compileReport(is);
          // if (report != null) {
          // getReportScriptingStorage().setJasperReport(report, clientFileName);
          // }
        } else if (clientFileName.endsWith(".xls") == true) {
          final StringBuffer buf = new StringBuffer();
          buf.append("report_").append(FileHelper.createSafeFilename(PFUserContext.getUser().getUsername(), 20)).append(".xls");
          final File file = new File(ConfigXml.getInstance().getWorkingDirectory(), buf.toString());
          fileUpload.writeTo(file);
          getReportScriptingStorage().setFilename(clientFileName, file.getAbsolutePath());
        } else {
          log.error("File extension not supported: " + clientFileName);
        }
      } catch (final Exception ex) {
        log.error(ex.getMessage(), ex);
        error("An error occurred (see log files for details): " + ex.getMessage());
      } finally {
        if (delete == true) {
          fileUpload.delete();
        }
      }
    }
  }

  /**
   * Creates the reports for the entries.
   * @param reportGeneratorList
   */
  // private void jasperReport(final ReportGeneratorList reportGeneratorList)
  // {
  // if (CollectionUtils.isEmpty(reportGeneratorList.getReports()) == true) {
  // error(getString("fibu.reporting.jasper.error.reportListIsEmpty"));
  // return;
  // }
  // final ReportGenerator report = reportGeneratorList.getReports().get(0);
  // final Collection< ? > beanCollection = report.getBeanCollection();
  // final Map<String, Object> parameters = report.getParameters();
  // jasperReport(parameters, beanCollection);
  // }

  /**
   * Default report from reportStorage. Uses the current report and puts the business assessment values in parameter map.
   */
  // private void jasperReport()
  // {
  // if (getReportStorage() == null || getReportStorage().getRoot() == null || getReportStorage().getRoot().isLoad() == false) {
  // error(getString("fibu.reporting.jasper.error.reportDataDoesNotExist"));
  // return;
  // }
  // final Map<String, Object> parameters = new HashMap<String, Object>();
  // final Report report = getReportStorage().getCurrentReport();
  // final Collection< ? > beanCollection = report.getBuchungssaetze();
  // BusinessAssessment.putBusinessAssessmentRows(parameters, report.getBusinessAssessment());
  // jasperReport(parameters, beanCollection);
  // }
  //
  // private void jasperReport(final Map<String, Object> parameters, final Collection< ? > beanCollection)
  // {
  // try {
  // final JasperReport jasperReport = getReportScriptingStorage().getJasperReport();
  // final JasperPrint jp = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(beanCollection));
  // final JasperPrint jasperPrint = jp;
  // final StringBuffer buf = new StringBuffer();
  // buf.append("pf_report_");
  // buf.append(DateHelper.getTimestampAsFilenameSuffix(new Date())).append(".pdf");
  // final String filename = buf.toString();
  // DownloadUtils.setDownloadTarget(JasperExportManager.exportReportToPdf(jasperPrint), filename);
  // } catch (final Exception ex) {
  // error(getLocalizedMessage("error", ex.getMessage()));
  // log.error(ex.getMessage(), ex);
  // }
  // }

  private void excelExport()
  {
    try {
      final ExportWorkbook workbook = (ExportWorkbook) groovyResult.getResult();
      final StringBuffer buf = new StringBuffer();
      if (workbook.getFilename() != null) {
        buf.append(workbook.getFilename()).append("_");
      } else {
        buf.append("pf_scriptresult_");
      }
      buf.append(DateHelper.getTimestampAsFilenameSuffix(new Date())).append(".xls");
      final String filename = buf.toString();
      DownloadUtils.setDownloadTarget(workbook.getAsByteArray(), filename);
    } catch (final Exception ex) {
      error(getLocalizedMessage("error", ex.getMessage()));
      log.error(ex.getMessage(), ex);
    }
  }

  private void jFreeChartExport()
  {
    try {
      final ExportJFreeChart exportJFreeChart = (ExportJFreeChart) groovyResult.getResult();
      final StringBuilder sb = new StringBuilder();
      sb.append("pf_chart_");
      sb.append(DateHelper.getTimestampAsFilenameSuffix(new Date()));
      final Response response = getResponse();
      final String extension = exportJFreeChart.write(response.getOutputStream());
      sb.append('.').append(extension);
      final String filename = sb.toString();
      final int width = exportJFreeChart.getWidth();
      final int height = exportJFreeChart.getHeight();
      final JFreeChartImage image = new JFreeChartImage("image", exportJFreeChart.getJFreeChart(), exportJFreeChart.getImageType(), width,
          height);
      image.add(AttributeModifier.replace("width", String.valueOf(width)));
      image.add(AttributeModifier.replace("height", String.valueOf(height)));
      imageResultContainer.removeAll();
      imageResultContainer.add(image).setVisible(true);
      ((WebResponse) response).setAttachmentHeader(filename);
      ((WebResponse) response).setContentType(DownloadUtils.getContentType(filename));
      log.info("Starting download for file. filename:" + filename + ", content-type:" + DownloadUtils.getContentType(filename));
      response.getOutputStream().flush();
    } catch (final Exception ex) {
      error(getLocalizedMessage("error", ex.getMessage()));
      log.error(ex.getMessage(), ex);
    }
  }

  private void zipExport()
  {
    try {
      final ExportZipArchive exportZipArchive = (ExportZipArchive) groovyResult.getResult();
      final StringBuilder sb = new StringBuilder();
      sb.append(exportZipArchive.getFilename()).append("_");
      sb.append(DateHelper.getTimestampAsFilenameSuffix(new Date())).append(".zip");
      final String filename = sb.toString();
      DownloadUtils.setDownloadTarget(filename, exportZipArchive.createResourceStreamWriter());
    } catch (final Exception ex) {
      error(getLocalizedMessage("error", ex.getMessage()));
      log.error(ex.getMessage(), ex);
    }
  }

  /**
   * @return Any existing user storage or null if not exist (wether in class nor in user's session).
   */
  protected ReportStorage getReportStorage()
  {
    if (reportStorage != null) {
      return reportStorage;
    }
    return (ReportStorage) getUserPrefEntry(ReportObjectivesPage.KEY_REPORT_STORAGE);
  }

  protected ReportScriptingStorage getReportScriptingStorage()
  {
    if (reportScriptingStorage != null) {
      return reportScriptingStorage;
    }
    reportScriptingStorage = (ReportScriptingStorage) getUserPrefEntry(ReportScriptingStorage.class.getName());
    if (reportScriptingStorage == null) {
      reportScriptingStorage = new ReportScriptingStorage();
      putUserPrefEntry(ReportScriptingStorage.class.getName(), reportScriptingStorage, false);
    }
    return reportScriptingStorage;
  }

  @Override
  protected String getTitle()
  {
    return getString("fibu.reporting.scripting");
  }
}
TOP

Related Classes of org.projectforge.web.scripting.ScriptingPage

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.