org.easyrec.controller.StatisticsController.java Source code

Java tutorial

Introduction

Here is the source code for org.easyrec.controller.StatisticsController.java

Source

/**Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH
 *
 * This file is part of easyrec.
 *
 * easyrec 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, either version 3 of the License, or
 * (at your option) any later version.
 *
 * easyrec 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 easyrec.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.easyrec.controller;

import com.google.common.base.Strings;
import org.easyrec.model.web.flot.FlotDataSet;
import org.easyrec.model.web.flot.FlotSeries;
import org.easyrec.service.domain.TypeMappingService;
import org.easyrec.store.dao.web.StatisticsDAO;
import org.easyrec.util.core.Security;
import org.easyrec.utils.servlet.ServletUtils;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;

/**
 * This Controller creates diagramms for the monthly action overview.
 *
 * @author Peter Hlavac
 */
public class StatisticsController extends AbstractController {

    private StatisticsDAO statisticsDAO;
    private TypeMappingService typeMappingService;

    public void setStatisticsDAO(StatisticsDAO statisticsDAO) {
        this.statisticsDAO = statisticsDAO;
    }

    public void setTypeMappingService(TypeMappingService typeMappingService) {
        this.typeMappingService = typeMappingService;
    }

    /* (non-Javadoc)
    * @see org.springframework.web.servlet.mvc.AbstractController#handleRequestInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
    */
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        if (Security.isSignedIn(request)) {

            int tenant;
            int month;
            int year;
            boolean flot;

            String actionType = request.getParameter("actionType");
            try {
                tenant = Integer.parseInt(request.getParameter("tenant"));
                month = Integer.parseInt(request.getParameter("month"));
                year = Integer.parseInt(request.getParameter("year"));
                flot = Integer.parseInt(request.getParameter("flot")) != 0;
            } catch (Exception e) {
                logger.warn(e);
                return null;
            }

            ModelAndView mav = new ModelAndView();
            XYSeriesCollection dataset = new XYSeriesCollection();
            FlotDataSet flotDataSet = new FlotDataSet();

            Calendar from = Calendar.getInstance();
            Calendar to = Calendar.getInstance();

            from.set(year, month, Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH), 0, 0, 0);
            to.set(year, month, from.getActualMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);

            Integer actionTypeId = null;
            Integer assocTypeId = null;

            if (!Strings.isNullOrEmpty(actionType)) {
                if ("CLICKS_ON_RECS".equals(actionType))
                    assocTypeId = 1001;
                else if ("CLICKS_ON_CHARTS".equals(actionType))
                    assocTypeId = 998;
                else
                    actionTypeId = typeMappingService.getIdOfActionType(tenant, actionType);
            }

            HashMap<Integer, HashMap<Integer, Integer>> actionBundleMap = statisticsDAO.getActionBundleMap(tenant,
                    from.getTimeInMillis(), to.getTimeInMillis(), actionTypeId, assocTypeId);

            Iterator<Integer> iterator = actionBundleMap.keySet().iterator();

            while (iterator.hasNext()) {
                actionTypeId = iterator.next();
                if (actionTypeId == 1001)
                    actionType = "clicks on recommendations";
                else if (actionTypeId == 998)
                    actionType = "clicks on rankings";
                else
                    actionType = typeMappingService.getActionTypeById(tenant, actionTypeId).toLowerCase()
                            + " actions";

                XYSeries xySeries = new XYSeries(actionType);
                FlotSeries flotSeries = new FlotSeries();
                flotSeries.setTitle(actionType);

                for (int i = 1; i <= 31; i++) {
                    Integer y = actionBundleMap.get(actionTypeId).get(i);
                    xySeries.add(i, y != null ? y : 0);
                    flotSeries.add(i, y != null ? y : 0);
                }
                //mav.addObject("data",flotDataSet.toString());

                dataset.addSeries(xySeries);
                flotDataSet.add(flotSeries);
            }

            // create datapoints that are rendered in the clients browser
            // return array or html side that renders array
            if (flot) {
                boolean onlyData = (ServletUtils.getSafeParameter(request, "onlyData", 0) != 0);
                if (onlyData) {
                    mav.setViewName("flot/dataOutput");
                } else {
                    mav.setViewName("flot/flotPlot");
                }
                mav.addObject("data", flotDataSet.toString());
                mav.addObject("flotDataSet", flotDataSet.getData());
                mav.addObject("noActions", flotDataSet.getData().isEmpty());
                return mav;

                // create a png
            } else {
                JFreeChart action_chart = ChartFactory.createXYLineChart("", "actions", "days", dataset,
                        PlotOrientation.VERTICAL, true, // show legend
                        true, // show tooltips
                        false); // show urls

                XYPlot plot = action_chart.getXYPlot();

                ValueAxis axis = plot.getDomainAxis();
                axis.setRange(1, 31);
                plot.setDomainAxis(axis);

                BufferedImage bi = action_chart.createBufferedImage(300, 200);

                byte[] bytes = ChartUtilities.encodeAsPNG(bi);

                if (bytes != null & !flot) {
                    OutputStream os = response.getOutputStream();
                    response.setContentType("image/png");
                    response.setContentLength(bytes.length);
                    os.write(bytes);
                    os.close();
                }
            }
            return null;

        } else {
            return Security.redirectHome(request, response);
        }

    }
}