Java tutorial
/* * 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(); } }