fr.paris.lutece.plugins.jasper.web.JasperJspBean.java Source code

Java tutorial

Introduction

Here is the source code for fr.paris.lutece.plugins.jasper.web.JasperJspBean.java

Source

/*
 * Copyright (c) 2002-2014, Mairie de Paris
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice
 *     and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright notice
 *     and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *
 *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * License 1.0
 */
package fr.paris.lutece.plugins.jasper.web;

import fr.paris.lutece.plugins.jasper.business.JasperReport;
import fr.paris.lutece.plugins.jasper.business.JasperReportHome;
import fr.paris.lutece.plugins.jasper.service.ExportFormatService;
import fr.paris.lutece.plugins.jasper.service.FileTypeContext;
import fr.paris.lutece.plugins.jasper.service.ILinkJasperReport;
import fr.paris.lutece.plugins.jasper.service.export.HtmlJasperRender;
import fr.paris.lutece.portal.service.database.AppConnectionService;
import fr.paris.lutece.portal.service.message.AdminMessage;
import fr.paris.lutece.portal.service.message.AdminMessageService;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.portal.service.util.AppPathService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
import fr.paris.lutece.portal.web.constants.Messages;
import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
import fr.paris.lutece.util.ReferenceList;
import fr.paris.lutece.util.filesystem.UploadUtil;
import fr.paris.lutece.util.html.HtmlTemplate;
import fr.paris.lutece.util.html.Paginator;
import fr.paris.lutece.util.url.UrlItem;

import org.apache.commons.fileupload.FileItem;

import org.w3c.tidy.Report;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 * This class provides the user interface to manage  JasperReport
 * features ( manage, create, modify, remove )
 */
public class JasperJspBean extends PluginAdminPageJspBean {
    ////////////////////////////////////////////////////////////////////////////
    // Constants

    // Right
    public static final String RIGHT_MANAGE_JASPER = "JASPER_MANAGEMENT";

    // Parameters
    private static final String PARAMETER_JASPERREPORT_ID_REPORT = "jasperreport_id_report";
    private static final String PARAMETER_JASPERREPORT_DESCRIPTION = "jasperreport_description";
    private static final String PARAMETER_REPORT_FILE_FOLDER = "file_folder";
    private static final String PARAMETER_REPORT_TEMPLATE = "report_template";
    private static final String PARAMETER_REPORT_POOL = "report_pool";
    private static final String PARAMETER_PAGE_INDEX = "page_index";

    // templates
    private static final String TEMPLATE_MANAGE_JASPERREPORTS = "/admin/plugins/jasper/manage_jasperreport.html";
    private static final String TEMPLATE_CREATE_JASPERREPORT = "/admin/plugins/jasper/create_jasperreport.html";
    private static final String TEMPLATE_MODIFY_JASPERREPORT = "/admin/plugins/jasper/modify_jasperreport.html";
    private static final String TEMPLATE_MANAGE_REPORT_FILE_TYPES = "/admin/plugins/jasper/manage_report_file_types.html";

    // Properties for page titles
    private static final String PROPERTY_PAGE_TITLE_MANAGE_JASPERREPORTS = "jasper.manage_jasperreports.pageTitle";
    private static final String PROPERTY_PAGE_TITLE_MODIFY_JASPERREPORT = "jasper.modify_jasperreport.pageTitle";
    private static final String PROPERTY_PAGE_TITLE_CREATE_JASPERREPORT = "jasper.create_jasperreport.pageTitle";
    private static final String PROPERTY_PAGE_TITLE_MANAGE_REPORT_FILE_TYPES = "jasper.manage_report_file_types.pageTitle";

    // Markers
    private static final String MARK_JASPERREPORT_LIST = "jasperreport_list";
    private static final String MARK_JASPERREPORT = "jasperreport";
    private static final String MARK_FILE_TYPES = "file_types";
    private static final String MARK_GENERATED_FILE_TYPES = "generated_file_types";
    private static final String MARK_PAGINATOR = "paginator";
    private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
    private static final String MARK_SECTION_POOL_LIST = "pool_list";

    // Jsp Definition
    private static final String JSP_DO_REMOVE_JASPERREPORT = "jsp/admin/plugins/jasper/DoRemoveJasperReport.jsp";
    private static final String JSP_MANAGE_JASPERREPORTS = "jsp/admin/plugins/jasper/ManageJasperReports.jsp";
    private static final String JSP_REDIRECT_TO_MANAGE_JASPERREPORTS = "ManageJasperReports.jsp";
    private static final String PROPERTY_FILES_PATH = "jasper.files.path";

    // Properties
    private static final String PROPERTY_DEFAULT_LIST_JASPERREPORT_PER_PAGE = "jasper.listJasperReports.itemsPerPage";

    // Messages
    private static final String MESSAGE_CONFIRM_REMOVE_JASPERREPORT = "jasper.message.confirmRemoveJasperReport";

    //Variables
    private int _nDefaultItemsPerPage;
    private String _strCurrentPageIndex;
    private int _nItemsPerPage;

    /**
     * Returns the list of jasperreport
     *
     * @param request The Http request
     * @return the jasperreports list
     */
    public String getManageJasperReports(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_MANAGE_JASPERREPORTS);

        _strCurrentPageIndex = Paginator.getPageIndex(request, Paginator.PARAMETER_PAGE_INDEX,
                _strCurrentPageIndex);
        _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt(PROPERTY_DEFAULT_LIST_JASPERREPORT_PER_PAGE,
                50);
        _nItemsPerPage = Paginator.getItemsPerPage(request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage,
                _nDefaultItemsPerPage);

        UrlItem url = new UrlItem(JSP_MANAGE_JASPERREPORTS);
        String strUrl = url.getUrl();
        Collection<JasperReport> listReports = JasperReportHome.getJasperReportsList(getPlugin());
        Paginator paginator = new Paginator((List<JasperReport>) listReports, _nItemsPerPage, strUrl,
                PARAMETER_PAGE_INDEX, _strCurrentPageIndex);

        Map<String, Object> model = new HashMap<String, Object>();

        model.put(MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage);
        model.put(MARK_PAGINATOR, paginator);
        model.put(MARK_JASPERREPORT_LIST, paginator.getPageItems());

        HtmlTemplate templateList = AppTemplateService.getTemplate(TEMPLATE_MANAGE_JASPERREPORTS, getLocale(),
                model);

        return getAdminPage(templateList.getHtml());
    }

    /**
     * Returns the form to create a jasperreport
     *
     * @param request The Http request
     * @return the html code of the jasperreport form
     */
    public String getCreateJasperReport(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_CREATE_JASPERREPORT);

        Map<String, Object> model = new HashMap<String, Object>();

        ReferenceList listPools = new ReferenceList();
        AppConnectionService.getPoolList(listPools);

        model.put(MARK_SECTION_POOL_LIST, listPools);

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_CREATE_JASPERREPORT, getLocale(), model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Process the data capture form of a new jasperreport
     *
     * @param request The Http Request
     * @return The Jsp URL of the process result
     */
    public String doCreateJasperReport(HttpServletRequest request) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        JasperReport jasperreport = new JasperReport();

        if (request.getParameter(PARAMETER_JASPERREPORT_DESCRIPTION).equals("")) {
            return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP);
        }

        String strReportName = request.getParameter(PARAMETER_JASPERREPORT_DESCRIPTION);
        String strPoolName = request.getParameter(PARAMETER_REPORT_POOL);
        String strCleanReportName = UploadUtil.cleanFileName(strReportName);
        jasperreport.setDescription(strReportName);
        jasperreport.setPool(strPoolName);

        FileItem fileItem = multipartRequest.getFile(PARAMETER_REPORT_TEMPLATE);

        try {
            localTemplateFile(jasperreport, fileItem, strCleanReportName, true);
        } catch (IOException e) {
            AppLogService.error(e);
        }

        JasperReportHome.create(jasperreport, getPlugin());

        return JSP_REDIRECT_TO_MANAGE_JASPERREPORTS;
    }

    /**
     * Manages the removal form of a jasperreport whose identifier is in the http request
     *
     * @param request The Http request
     * @return the html code to confirm
     */
    public String getConfirmRemoveJasperReport(HttpServletRequest request) {
        int nId = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        UrlItem url = new UrlItem(JSP_DO_REMOVE_JASPERREPORT);
        url.addParameter(PARAMETER_JASPERREPORT_ID_REPORT, nId);

        return AdminMessageService.getMessageUrl(request, MESSAGE_CONFIRM_REMOVE_JASPERREPORT, url.getUrl(),
                AdminMessage.TYPE_CONFIRMATION);
    }

    /**
     * Handles the removal form of a jasperreport
     *
     * @param request The Http request
     * @return the jsp URL to display the form to manage jasperreports
     */
    public String doRemoveJasperReport(HttpServletRequest request) {
        int nId = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));

        //TODO remove appropriate folder
        JasperReport report = JasperReportHome.findByPrimaryKey(nId, getPlugin());
        String strCleanReportName = UploadUtil.cleanFileName(report.getDescription());

        String strDirectoryPath = AppPropertiesService.getProperty(PROPERTY_FILES_PATH);
        String strFolderPath = AppPathService.getWebAppPath() + strDirectoryPath + strCleanReportName;
        File folder = new File(strFolderPath);
        deleteFolderWithContent(folder);
        JasperReportHome.remove(nId, getPlugin());

        return JSP_REDIRECT_TO_MANAGE_JASPERREPORTS;
    }

    /**
     * Returns the form to update info about a jasperreport
     *
     * @param request The Http request
     * @return The HTML form to update info
     */
    public String getModifyJasperReport(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_MODIFY_JASPERREPORT);

        int nId = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        JasperReport jasperreport = JasperReportHome.findByPrimaryKey(nId, getPlugin());

        Map<String, Object> model = new HashMap<String, Object>();
        model.put(MARK_JASPERREPORT, jasperreport);

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MODIFY_JASPERREPORT, getLocale(), model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Returns the fiule type selection for generation
     *
     * @param request The Http request
     * @return The HTML form to update info
     */
    public String getManageFileTypes(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_MANAGE_REPORT_FILE_TYPES);

        int nId = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        JasperReport jasperreport = JasperReportHome.findByPrimaryKey(nId, getPlugin());
        Map<String, ILinkJasperReport> mapClasses = ExportFormatService.INSTANCE.getExportTypes();
        Collection<ILinkJasperReport> listFileTypes = mapClasses.values();

        Map<String, Object> model = new HashMap<String, Object>();
        model.put(MARK_JASPERREPORT, jasperreport);
        model.put(MARK_FILE_TYPES, listFileTypes);
        model.put(MARK_GENERATED_FILE_TYPES, jasperreport.getFileFormats());

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_REPORT_FILE_TYPES, getLocale(),
                model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Process the change form of a jasperreport
     *
     * @param request The Http request
     * @return The Jsp URL of the process result
     */
    public String doModifyJasperReport(HttpServletRequest request) {
        int nId = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        JasperReport jasperreport = JasperReportHome.findByPrimaryKey(nId, getPlugin());

        if (request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT).equals("")) {
            return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP);
        }

        int nIdReport = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        jasperreport.setIdReport(nIdReport);

        if (request.getParameter(PARAMETER_JASPERREPORT_DESCRIPTION).equals("")) {
            return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP);
        }

        jasperreport.setDescription(request.getParameter(PARAMETER_JASPERREPORT_DESCRIPTION));
        JasperReportHome.update(jasperreport, getPlugin());

        return JSP_REDIRECT_TO_MANAGE_JASPERREPORTS;
    }

    /**
     * Process the change form of a jasperreport
     *
     * @param request The Http request
     * @return The Jsp URL of the process result
     */
    public String doModifyReportFileTypes(HttpServletRequest request) {
        int nId = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        JasperReport jasperreport = JasperReportHome.findByPrimaryKey(nId, getPlugin());

        if (request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT).equals("")) {
            return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP);
        }

        int nIdReport = Integer.parseInt(request.getParameter(PARAMETER_JASPERREPORT_ID_REPORT));
        jasperreport.setIdReport(nIdReport);

        if (request.getParameter(PARAMETER_REPORT_FILE_FOLDER).equals("")) {
            return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP);
        }

        jasperreport.setFileFolder(request.getParameter(PARAMETER_REPORT_FILE_FOLDER));
        //TODO Important To change file types
        JasperReportHome.update(jasperreport, getPlugin());

        return JSP_REDIRECT_TO_MANAGE_JASPERREPORTS;
    }

    /**
     *
     * @param report
     * @param fileItem
     * @param strReportName
     * @param bUpdateJasper
     * @throws IOException
     */
    private void localTemplateFile(JasperReport report, FileItem fileItem, String strReportName,
            boolean bUpdateJasper) throws IOException {
        String strFileName = fileItem.getName();
        File file = new File(strFileName);

        if (!file.getName().equals("") && !strReportName.equals(null)) {
            String strNameFile = file.getName();

            String strDirectoryPath = AppPropertiesService.getProperty(PROPERTY_FILES_PATH);
            String strFolderPath = AppPathService.getWebAppPath() + strDirectoryPath + strReportName;
            File folder = new File(strFolderPath);

            try {
                if (!folder.exists()) {
                    folder.mkdir();
                }
            } catch (Exception e) {
                AppLogService.error(e);
            }

            String filePath = AppPathService.getWebAppPath() + strDirectoryPath + strReportName + "/" + strNameFile;

            if (!new File(filePath).isDirectory() && bUpdateJasper) {
                file = new File(filePath);

                if (file.exists()) {
                    file.delete();
                }

                FileOutputStream fosFile = new FileOutputStream(file);
                fosFile.flush();
                fosFile.write(fileItem.get());
                fosFile.close();
                report.setUrl(strReportName + "/" + strNameFile);
            }
        } else {
            report.setUrl("");
        }
    }

    public static boolean deleteFolderWithContent(File folder) {
        if (folder.isDirectory()) {
            String[] files = folder.list();

            for (int i = 0; i < files.length; i++) {
                boolean success = deleteFolderWithContent(new File(folder, files[i]));

                if (!success) {
                    return false;
                }
            }
        }

        return folder.delete();
    }
}