nl.wur.plantbreeding.jfreechart.DisplayChart.java Source code

Java tutorial

Introduction

Here is the source code for nl.wur.plantbreeding.jfreechart.DisplayChart.java

Source

/*
 * =========================================================== JFreeChart : a
 * free chart library for the Java(tm) platform
 * ===========================================================
 *
 * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
 *
 * Project Info: http://www.jfree.org/jfreechart/index.html
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. in the
 * United States and other countries.]
 *
 * ----------------- DisplayChart.java ----------------- (C) Copyright
 * 2002-2008, by Richard Atkinson and Contributors.
 *
 * Original Author: Richard Atkinson; Contributor(s): David Gilbert (for Object
 * Refinery Limited);
 *
 * Changes ------- 19-Aug-2002 : Version 1; 09-Mar-2005 : Added facility to
 * serve up "one time" charts - see ServletUtilities.java (DG); -------------
 * JFREECHART 1.0.x --------------------------------------------- 02-Feb-2007 :
 * Removed author tags all over JFreeChart sources (DG);
 *
 */
package nl.wur.plantbreeding.jfreechart;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jfree.chart.servlet.ChartDeleter;
import org.jfree.chart.servlet.ServletUtilities;

/**
 * TEMPORARY FILE overriding the standard version from JFreeChart. We do this
 * because we also want to use this servlet to show our own, R calculated graphs.
 *
 * Servlet used for streaming charts to the client browser from the temporary
 * directory. You need to add this servlet and mapping to your deployment
 * descriptor (web.xml) in order to get it to work. The syntax is as follows:
 * <xmp> <servlet> <servlet-name>DisplayChart</servlet-name>
 * <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> </servlet>
 * <servlet-mapping> <servlet-name>DisplayChart</servlet-name>
 * <url-pattern>/servlet/DisplayChart</url-pattern> </servlet-mapping> </xmp>
 */
public class DisplayChart extends HttpServlet {

    private static final long serialVersionUID = 20091130L;
    /**
     * The logger
     */
    private static final Logger LOG = Logger.getLogger(DisplayChart.class.getName());

    /**
     * Default constructor.
     */
    public DisplayChart() {
        super();
    }

    /**
     * Init method.
     *
     * @throws ServletException never.
     */
    @Override
    public void init() throws ServletException {
        return;
    }

    /**
     * Service method.
     *
     * @param request  the request.
     * @param response  the response.
     *
     * @throws ServletException ??.
     * @throws IOException ??.
     */
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpSession session = request.getSession();
        String filename = request.getParameter("filename");

        if (filename == null) {
            throw new ServletException("Parameter 'filename' must be supplied");
        }

        //  Replace ".." with ""
        //  This is to prevent access to the rest of the file system
        filename = ServletUtilities.searchReplace(filename, "..", "");

        //  Check the file exists
        File file = new File(System.getProperty("java.io.tmpdir"), filename);
        if (!file.exists()) {
            throw new ServletException("File '" + file.getAbsolutePath() + "' does not exist");
        }

        //  Check that the graph being served was created by the current user
        //  or that it begins with "public"
        //Fixme: set tot true to override. Like this, we can use the class to
        //show also our own images. This imposes likely a security thread.
        //Fix this for the future
        boolean isChartInUserList = true;
        ChartDeleter chartDeleter = (ChartDeleter) session.getAttribute("JFreeChart_Deleter");
        if (chartDeleter != null) {
            isChartInUserList = chartDeleter.isChartAvailable(filename);
        }

        boolean isChartPublic = false;
        if (filename.length() >= 6) {
            if (filename.substring(0, 6).equals("public")) {
                isChartPublic = true;
            }
            //FIXME: override of security checks as plots are not always shown
            isChartPublic = true;
        }

        boolean isOneTimeChart = false;
        if (filename.startsWith(ServletUtilities.getTempOneTimeFilePrefix())) {
            isOneTimeChart = true;
        }

        LOG.log(Level.WARNING,
                "Displaychart: " + "ChartInUserList: {0} " + "ChartPublic: {1} " + "OneTimeChart: {2}",
                new Object[] { isChartInUserList, isChartPublic, isOneTimeChart });

        if (isChartInUserList || isChartPublic || isOneTimeChart) {
            //  Serve it up
            ServletUtilities.sendTempFile(file, response);
            if (isOneTimeChart) {
                file.delete();
            }
        } else {
            throw new ServletException("Chart image not found");
        }
        return;
    }
}