fr.paris.lutece.plugins.stock.modules.billetterie.web.StatisticJspBean.java Source code

Java tutorial

Introduction

Here is the source code for fr.paris.lutece.plugins.stock.modules.billetterie.web.StatisticJspBean.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.stock.modules.billetterie.web;

import au.com.bytecode.opencsv.CSVWriter;

import com.keypoint.PngEncoder;

import fr.paris.lutece.plugins.stock.commons.exception.BusinessException;
import fr.paris.lutece.plugins.stock.modules.billetterie.utils.constants.BilletterieConstants;
import fr.paris.lutece.plugins.stock.modules.tickets.business.ResultStatistic;
import fr.paris.lutece.plugins.stock.modules.tickets.service.IStatisticService;
import fr.paris.lutece.plugins.stock.modules.tickets.service.StatisticService;
import fr.paris.lutece.plugins.stock.modules.tickets.utils.constants.TicketsConstants;
import fr.paris.lutece.plugins.stock.modules.tickets.utils.export.TicketsExportUtils;
import fr.paris.lutece.plugins.stock.utils.DateUtils;
import fr.paris.lutece.plugins.stock.utils.constants.StockConstants;
import fr.paris.lutece.portal.service.admin.AdminUserService;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.spring.SpringContextService;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.util.date.DateUtil;
import fr.paris.lutece.util.html.HtmlTemplate;
import fr.paris.lutece.util.url.UrlItem;

import org.apache.commons.lang.StringUtils;

import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;

import java.awt.image.BufferedImage;

import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;

import java.sql.Timestamp;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

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

/**
 * The Class StatisticJspBean.
 */
public class StatisticJspBean extends AbstractJspBean {
    /** The constant String CONSTANT_PRODUCT_TYPE */
    public static final String CONSTANT_PRODUCT_TYPE = "1";

    /** The constant String CONSTANT_GROUP_BY_DAY */
    public static final String CONSTANT_GROUP_BY_DAY = "0";

    /** The constant String CONSTANT_GROUP_BY_WEEK */
    public static final String CONSTANT_GROUP_BY_WEEK = "1";

    /** The constant String CONSTANT_GROUP_BY_MONTH */
    public static final String CONSTANT_GROUP_BY_MONTH = "2";

    /** The constant String CONSTANT_PURCHASE_TYPE */
    public static final String CONSTANT_PURCHASE_TYPE = "2";

    //RIGHT
    /** The constant String RIGHT_MANAGE_STATISTICS */
    public static final String RIGHT_MANAGE_STATISTICS = "STATISTICS_MANAGEMENT";
    private static final long serialVersionUID = -2502151554115352120L;

    //PAGES TITLES
    private static final String PAGE_TITLE_MANAGE_PRODUCTS = "module.stock.billetterie.manage_products_statistics.pageTitle";
    private static final String PAGE_TITLE_MANAGE_PURCHASE = "module.stock.billetterie.manage_purchase_statistics.pageTitle";

    //TEMPLATES
    private static final String TEMPLATE_MANAGE_STATISTICS = "admin/plugins/stock/modules/billetterie/manage_statistics.html";
    private static final String TEMPLATE_MANAGE_PRODUCTS_STATISTICS = "admin/plugins/stock/modules/billetterie/manage_products_statistics.html";
    private static final String TEMPLATE_MANAGE_PURCHASE_STATISTICS = "admin/plugins/stock/modules/billetterie/manage_purchases_statistics.html";

    //MARKS
    private static final String MARK_NUMBER_RESPONSE = "number_response";
    private static final String MARK_FIRST_RESPONSE_DATE_FILTER = "fist_response_date_filter";
    private static final String MARK_LAST_RESPONSE_DATE_FILTER = "last_response_date_filter";
    private static final String PARAMETER_FIRST_RESPONSE_DATE_FILTER = "fist_response_date_filter";
    private static final String PARAMETER_LAST_RESPONSE_DATE_FILTER = "last_response_date_filter";
    private static final String MARK_TIMES_UNIT = "times_unit";
    private static final String PARAMETER_TIMES_UNIT = "times_unit";
    private static final String MARK_LOCALE = "locale";
    private static final String PARAMETER_TYPE_DATA = "type_data";

    //MESSAGES
    private static final String MESSAGE_ERROR_INVALID_DATE = "module.stock.billetterie.message.error.dateBeginBeforeDateEnd";

    //PROPERTIES
    private static final String PROPERTY_PRODUCT_STAT_EXPORT_FILE_NAME = "stock-billetterie.csv.product.file.name";
    private static final String PROPERTY_PURCHASE_STAT_EXPORT_FILE_NAME = "stock-billetterie.csv.purchase.file.name";
    private static final String PROPERTY_ENCODING = "stock-billetterie.csv.encoding";
    private static final String PROPERTY_NUMBER_RESPONSE_AXIS_X = "graph.numberResponseAxisX";
    private static final String PROPERTY_LABEL_AXIS_X = "module.stock.billetterie.manage_statistics.labelAxisX";
    private static final String PROPERTY_LABEL_AXIS_Y_PRODUCT = "module.stock.billetterie.manage_products_statistics.labelAxisY";
    private static final String PROPERTY_LABEL_AXIS_Y_PURCHASE = "module.stock.billetterie.manage_purchases_statistics.labelAxisY";
    private static final String CONTENT_TYPE_IMAGE_PNG = "image/PNG";

    /** The _service statistic. */
    // @Inject
    private IStatisticService _serviceStatistic;

    /**
     * Instantiates a new statistic jsp bean.
     */
    public StatisticJspBean() {
        super();
        _serviceStatistic = SpringContextService.getContext().getBean(IStatisticService.class);
    }

    /**
     * Generates a HTML form that displays the link to manage the visitors
     * statistics and polls.
     *
     * @param request the Http request
     * @return HTML
     */
    public String getManageStatistics(HttpServletRequest request) {
        setPageTitleProperty(StockConstants.EMPTY_STRING);

        Map<String, Object> model = new HashMap<String, Object>();
        HtmlTemplate t = AppTemplateService.getTemplate(TEMPLATE_MANAGE_STATISTICS, getLocale(), model);

        return getAdminPage(t.getHtml());
    }

    /**
     * Gets the form result page.
     *
     * @param request the http request
     * @return the form test page
     */
    public String getManageProducts(HttpServletRequest request) {
        Locale locale = getLocale();
        HtmlTemplate template;
        int nNumberResponse = 0;
        Map<String, Object> model = new HashMap<String, Object>();

        String strFistResponseDateFilter = request.getParameter(PARAMETER_FIRST_RESPONSE_DATE_FILTER);
        String strLastResponseDateFilter = request.getParameter(PARAMETER_LAST_RESPONSE_DATE_FILTER);
        String strTimesUnit = request.getParameter(PARAMETER_TIMES_UNIT);

        if ((strFistResponseDateFilter != null) && (strLastResponseDateFilter != null)
                && !strFistResponseDateFilter.equals(StringUtils.EMPTY)
                && !strLastResponseDateFilter.equals(StringUtils.EMPTY)) {
            if (DateUtil.formatDate(strFistResponseDateFilter, locale)
                    .after(DateUtil.formatDate(strLastResponseDateFilter, locale))) {
                BusinessException fe = new BusinessException(null, MESSAGE_ERROR_INVALID_DATE);
                model.put(BilletterieConstants.ERROR, getHtmlError(fe));
            }
        }

        Timestamp tFistResponseDateFilter = null;
        Timestamp tLastResponseDateFilter = null;

        if (strFistResponseDateFilter != null) {
            tFistResponseDateFilter = DateUtils
                    .getDateFirstMinute(DateUtil.formatDate(strFistResponseDateFilter, locale));
        }

        if (strLastResponseDateFilter != null) {
            tLastResponseDateFilter = DateUtils
                    .getDateLastMinute(DateUtil.formatDate(strLastResponseDateFilter, locale));
        }

        nNumberResponse = _serviceStatistic.getCountProductsByDates(strFistResponseDateFilter,
                strLastResponseDateFilter);

        if (strTimesUnit == null) {
            strTimesUnit = CONSTANT_GROUP_BY_DAY;
        }

        model.put(MARK_LOCALE, AdminUserService.getLocale(request).getLanguage());
        model.put(MARK_NUMBER_RESPONSE, nNumberResponse);
        model.put(MARK_FIRST_RESPONSE_DATE_FILTER,
                (tFistResponseDateFilter == null) ? null : new Date(tFistResponseDateFilter.getTime()));
        model.put(MARK_LAST_RESPONSE_DATE_FILTER,
                (tLastResponseDateFilter == null) ? null : new Date(tLastResponseDateFilter.getTime()));
        model.put(MARK_TIMES_UNIT, strTimesUnit);
        //        model.put( MARK_EXPORT_FORMAT_REF_LIST, ExportFormatHome.getListExport( plugin ) );
        model.put("beanName", "product");
        setPageTitleProperty(PAGE_TITLE_MANAGE_PRODUCTS);
        template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_PRODUCTS_STATISTICS, locale, model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Gets the form result page.
     *
     * @param request the http request
     * @return the form test page
     */
    public String getManagePurchases(HttpServletRequest request) {
        Locale locale = getLocale();
        HtmlTemplate template;
        int nNumberResponse = 0;
        Map<String, Object> model = new HashMap<String, Object>();

        String strFistResponseDateFilter = request.getParameter(PARAMETER_FIRST_RESPONSE_DATE_FILTER);
        String strLastResponseDateFilter = request.getParameter(PARAMETER_LAST_RESPONSE_DATE_FILTER);
        String strTimesUnit = request.getParameter(PARAMETER_TIMES_UNIT);

        if ((strFistResponseDateFilter != null) && (strLastResponseDateFilter != null)
                && !strFistResponseDateFilter.equals(StringUtils.EMPTY)
                && !strLastResponseDateFilter.equals(StringUtils.EMPTY)) {
            if (DateUtil.formatDate(strFistResponseDateFilter, locale)
                    .after(DateUtil.formatDate(strLastResponseDateFilter, locale))) {
                BusinessException fe = new BusinessException(null, MESSAGE_ERROR_INVALID_DATE);
                model.put(BilletterieConstants.ERROR, getHtmlError(fe));
            }
        }

        Timestamp tFistResponseDateFilter = null;
        Timestamp tLastResponseDateFilter = null;

        if (strFistResponseDateFilter != null) {
            tFistResponseDateFilter = DateUtils
                    .getDateFirstMinute(DateUtil.formatDate(strFistResponseDateFilter, locale));
        }

        if (strLastResponseDateFilter != null) {
            tLastResponseDateFilter = DateUtils
                    .getDateLastMinute(DateUtil.formatDate(strLastResponseDateFilter, locale));
        }

        nNumberResponse = _serviceStatistic.getCountPurchasesByDates(strFistResponseDateFilter,
                strLastResponseDateFilter);

        if (strTimesUnit == null) {
            strTimesUnit = CONSTANT_GROUP_BY_DAY;
        }

        model.put(MARK_LOCALE, AdminUserService.getLocale(request).getLanguage());
        model.put(MARK_NUMBER_RESPONSE, nNumberResponse);
        model.put(MARK_FIRST_RESPONSE_DATE_FILTER,
                (tFistResponseDateFilter == null) ? null : new Date(tFistResponseDateFilter.getTime()));
        model.put(MARK_LAST_RESPONSE_DATE_FILTER,
                (tLastResponseDateFilter == null) ? null : new Date(tLastResponseDateFilter.getTime()));
        model.put(MARK_TIMES_UNIT, strTimesUnit);
        //model.put( MARK_EXPORT_FORMAT_REF_LIST, ExportFormatHome.getListExport( plugin ) );
        setPageTitleProperty(PAGE_TITLE_MANAGE_PURCHASE);
        template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_PURCHASE_STATISTICS, locale, model);

        return getAdminPage(template.getHtml());
    }

    /**
     * write in the http response the statistic graph of all response submit who
     * verify the date filter.
     *
     * @param request the http request
     * @param response The http response
     */
    public void doGenerateGraph(HttpServletRequest request, HttpServletResponse response) {
        Locale locale = getLocale();
        String strFistResponseDateFilter = request.getParameter(PARAMETER_FIRST_RESPONSE_DATE_FILTER);
        String strLastResponseDateFilter = request.getParameter(PARAMETER_LAST_RESPONSE_DATE_FILTER);
        String strTimesUnit = request.getParameter(PARAMETER_TIMES_UNIT);
        String strTypeData = request.getParameter(PARAMETER_TYPE_DATA);

        List<ResultStatistic> listeResultStatistic = null;

        if (strTypeData.equals(CONSTANT_PRODUCT_TYPE)) {
            listeResultStatistic = _serviceStatistic.getProductStatistic(strTimesUnit, strFistResponseDateFilter,
                    strLastResponseDateFilter);
        } else {
            listeResultStatistic = _serviceStatistic.getPurchaseStatistic(strTimesUnit, strFistResponseDateFilter,
                    strLastResponseDateFilter);
        }

        String strNumberOfResponseAxisX = AppPropertiesService.getProperty(PROPERTY_NUMBER_RESPONSE_AXIS_X);
        int nNumberOfResponseAxisX = 10;

        try {
            nNumberOfResponseAxisX = Integer.parseInt(strNumberOfResponseAxisX);
        } catch (NumberFormatException ne) {
            AppLogService.error(ne);
        }

        List<ResultStatistic> listStatisticGraph = new ArrayList<ResultStatistic>();
        ResultStatistic statisticFormSubmit;

        if (listeResultStatistic.size() != 0) {
            for (int cpt = 0; cpt < nNumberOfResponseAxisX; cpt++) {
                statisticFormSubmit = new ResultStatistic();
                statisticFormSubmit.setNumberResponse(0);
                statisticFormSubmit.setStatisticDate(StatisticService
                        .addStatisticInterval(listeResultStatistic.get(0).getStatisticDate(), strTimesUnit, cpt));
                listStatisticGraph.add(statisticFormSubmit);
            }
        }

        for (ResultStatistic statisticFormSubmitGraph : listStatisticGraph) {
            for (ResultStatistic resultStatistic : listeResultStatistic) {
                if (StatisticService.sameDate(statisticFormSubmitGraph.getStatisticDate(),
                        resultStatistic.getStatisticDate(), strTimesUnit)) {
                    statisticFormSubmitGraph.setNumberResponse(resultStatistic.getNumberResponse());
                }
            }
        }

        String strLabelAxisX = I18nService.getLocalizedString(PROPERTY_LABEL_AXIS_X, locale);
        String strLabelAxisY;

        if (strTypeData.equals(CONSTANT_PRODUCT_TYPE)) {
            strLabelAxisY = I18nService.getLocalizedString(PROPERTY_LABEL_AXIS_Y_PRODUCT, locale);
        } else {
            strLabelAxisY = I18nService.getLocalizedString(PROPERTY_LABEL_AXIS_Y_PURCHASE, locale);
        }

        try {
            JFreeChart chart = StatisticService.createXYGraph(listStatisticGraph, strLabelAxisX, strLabelAxisY,
                    strTimesUnit);

            ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
            BufferedImage chartImage = chart.createBufferedImage(600, 200, info);
            response.setContentType(CONTENT_TYPE_IMAGE_PNG);

            PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9);
            response.getOutputStream().write(encoder.pngEncode());
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (Exception e) {
            AppLogService.error(e);
        }
    }

    /**
     * Exports all the statistics visitors filtered.
     *
     * @param request The Http request
     * @param response The Http response
     * @return The Url after the export
     */
    public String doExportStatistics(HttpServletRequest request, HttpServletResponse response) {
        String strFistResponseDateFilter = request.getParameter(PARAMETER_FIRST_RESPONSE_DATE_FILTER);
        String strLastResponseDateFilter = request.getParameter(PARAMETER_LAST_RESPONSE_DATE_FILTER);
        String strTimesUnit = request.getParameter(PARAMETER_TIMES_UNIT);
        String strTypeData = request.getParameter(PARAMETER_TYPE_DATA);
        List<ResultStatistic> listeResultStatistic = null;
        String strExportFileName;

        if (strTypeData.equals(CONSTANT_PRODUCT_TYPE)) {
            listeResultStatistic = _serviceStatistic.getProductStatistic(strTimesUnit, strFistResponseDateFilter,
                    strLastResponseDateFilter);
            strExportFileName = PROPERTY_PRODUCT_STAT_EXPORT_FILE_NAME;
        } else {
            listeResultStatistic = _serviceStatistic.getPurchaseStatistic(strTimesUnit, strFistResponseDateFilter,
                    strLastResponseDateFilter);
            strExportFileName = PROPERTY_PURCHASE_STAT_EXPORT_FILE_NAME;
        }

        List<String[]> listToCSVWriter = StatisticService.buildListToCSVWriter(listeResultStatistic, strTimesUnit,
                getLocale());

        //        if ( listToCSVWriter == null )
        //        {
        //            if ( strTypeData.equals( CONSTANT_PRODUCT_TYPE ) )
        //            {
        //                return getManageProducts( request );
        //            }
        //            else
        //            {
        //                return getManagePurchases( request );
        //            }
        //        }
        String strCsvSeparator = AppPropertiesService.getProperty(TicketsConstants.PROPERTY_CSV_SEPARATOR);
        StringWriter strWriter = new StringWriter();
        CSVWriter csvWriter = new CSVWriter(strWriter, strCsvSeparator.toCharArray()[0]);

        csvWriter.writeAll(listToCSVWriter);

        String strEncoding = AppPropertiesService.getProperty(PROPERTY_ENCODING);
        byte[] byteFileOutPut;

        try {
            byteFileOutPut = strWriter.toString().getBytes(strEncoding);
        } catch (UnsupportedEncodingException e) {
            byteFileOutPut = strWriter.toString().getBytes();
        }

        try {
            String strFormatExtension = AppPropertiesService.getProperty(TicketsConstants.PROPERTY_CSV_EXTENSION);
            String strFileName = AppPropertiesService.getProperty(strExportFileName) + "." + strFormatExtension;
            TicketsExportUtils.addHeaderResponse(request, response, strFileName, strFormatExtension);
            response.setContentLength(byteFileOutPut.length);

            OutputStream os = response.getOutputStream();
            os.write(byteFileOutPut);
            os.flush();
            os.close();

            // We do not close the output stream to allow HTTP keep alive
        } catch (IOException e) {
            AppLogService.error(e.getMessage(), e);
        } finally {
            try {
                csvWriter.close();
            } catch (IOException e) {
                AppLogService.error(e.getMessage(), e);
            }

            try {
                strWriter.close();
            } catch (IOException e) {
                AppLogService.error(e.getMessage(), e);
            }
        }

        UrlItem url = new UrlItem(getManageProducts(request));

        return url.getUrl();
    }
}