All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.neuro4j.web.render.jasper.JasperViewNodeRenderEngine Maven / Gradle / Ivy

There is a newer version: 3.1.1
Show newest version
/**
 * Copyright (c) 2013-2016, Neuro4j
 *
 * 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.
 *
 */
package org.neuro4j.web.render.jasper;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRAbstractExporter;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
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.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter;
import net.sf.jasperreports.engine.util.JRLoader;

import org.neuro4j.web.logic.WebFlowConstants;
import org.neuro4j.web.logic.render.ViewNodeRenderEngine;
import org.neuro4j.web.logic.render.ViewNodeRenderExecutionException;
import org.neuro4j.workflow.FlowContext;

/**
 * Class generates document in different formats.
 *
 */
public class JasperViewNodeRenderEngine implements ViewNodeRenderEngine {

    private static final String IN_JASPER_PARAMETERS = "jasperParameters";
    private static final String IN_JASPER_FORMAT = "jasperFormat";
    private static final String IN_JASPER_FILE_NAME = "jasperFileName";
    private static final String IN_JASPER_DATASOURCE = "jasperDataSource";
    private static final String DEFAULT_FORMAT = "pdf";

    @Override
    public void init(ServletConfig config, ServletContext servletContext) throws ViewNodeRenderExecutionException {

    }

    @Override
    public void render(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, FlowContext logicContext, String view) throws ViewNodeRenderExecutionException
    {
        
        // handle if view is not specified -> go to default page with trace
        if (null == view) {
            view = WebFlowConstants.DEFAULT_VIEW_PAGE;
        } else if (view.startsWith("/")) {
            view = WebFlowConstants.DEFAULT_VIEW_DIRECTORY + view.replaceFirst("/", "");
        } else {
            view = WebFlowConstants.DEFAULT_VIEW_DIRECTORY + view;
        }
        
        Map parameters = (Map) logicContext.get(IN_JASPER_PARAMETERS);

        if (parameters == null)
        {
            parameters = new HashMap();
        }

        String format = (String) logicContext.get(IN_JASPER_FORMAT);
        if (format == null)
        {
            format = DEFAULT_FORMAT;
        }

        JRDataSource dataSource = (JRDataSource) logicContext.get(IN_JASPER_DATASOURCE);
        if (dataSource == null)
        {
            dataSource = new JREmptyDataSource();
        }

        if (view == null)
        {
            throw new ViewNodeRenderExecutionException("JasperReports template is null");
        }

        InputStream inputStream = servletContext.getResourceAsStream(view);

        if (inputStream == null)
        {
            throw new ViewNodeRenderExecutionException("JasperReports template has not been loaded. Template path:" + view);
        }

        response.setContentType(getContentType(format));

        String fileName = (String) logicContext.get(IN_JASPER_FILE_NAME);
        if (fileName == null)
        {
            fileName = "report." + format;
        }

        JasperPrint jasperPrint = null;
        try {
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream);

            jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);

            JRAbstractExporter exporter = getJRExporter(format);
            if (exporter == null)
            {
                throw new ViewNodeRenderExecutionException("JRAbstractExporter not found for format: " + format);
            }

            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            ByteArrayOutputStream output = new ByteArrayOutputStream();

            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
            exporter.exportReport();
            byte[] report = output.toByteArray();
            response.setContentLength(report.length);
            response.setHeader("Content-Disposition", "filename=\"" + fileName + "\";");

            response.getOutputStream().write(report);

        } catch (Exception e) {
            throw new ViewNodeRenderExecutionException(e.getMessage());
        }

        return;
    }

    private JRAbstractExporter getJRExporter(String format) {
        JRAbstractExporter exporter = null;
        if (format.equals("pdf")) {
            exporter = new JRPdfExporter();
        } else if (format.equals("rtf")) {
            exporter = new JRRtfExporter();
        } else if (format.equals("html")) {
            exporter = new JRHtmlExporter();
        } else if (format.equals("docx")) {
            exporter = new JRDocxExporter();
        } else if (format.equals("pptx")) {
            exporter = new JRPptxExporter();
        }

        return exporter;
    }

    private String getContentType(String fileType) {

        if (fileType == null) {
            return "application/octet-stream";
        }

        if (fileType.toLowerCase().contains("txt"))
            return "text/plain";
        else if (fileType.toLowerCase().contains("docx"))
            return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        else if (fileType.toLowerCase().contains("doc"))
            return "application/msword";
        else if (fileType.toLowerCase().contains("xlsx"))
            return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        else if (fileType.toLowerCase().contains("xls"))
            return "application/vnd.ms-excel";
        else if (fileType.toLowerCase().contains("pdf"))
            return "application/pdf";
        else if (fileType.toLowerCase().contains("pptx"))
            return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
        else if (fileType.toLowerCase().contains("ppt"))
            return "application/ppt";
        else if (fileType.toLowerCase().contains("zip"))
            return "application/zip";
        else if (fileType.toLowerCase().contains("rtf"))
            return "application/rtf";

        else
            return "application/octet-stream";
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy