Package ptolemy.plot.servlet

Source Code of ptolemy.plot.servlet.PlotServlet

package ptolemy.plot.servlet;

import ptolemy.plot.Plot;
import ptolemy.plot.plotml.PlotMLParser;

import com.microstar.xml.XmlException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;


/**
* Takes the parameters file, w, h and returs and jpeg image with the
* ptplot graph generated from the PlotML file.
*
* the file mustbe located in the same directory or a subdirectory of the
* servlet.
*
* Use in your html as:
* <img src="/servlet/ptolemy/plot/servlet/PlotServlet?file=Bin.xml&w=500&h=500"/>
* <img src="/servlet/ptolemy/plot/servlet/PlotServlet?file=HighLowSmall.xml&w=500&h=500"/>
*
* No waranties given in any respect! Have fun.
* @author A. Gobbi
* @version 1.0
*/
public class PlotServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String fName = request.getParameter("file");

        if (fName == null) {
            throw new ServletException("No filename given!");
        }

        if (fName.indexOf("..") >= 0) {
            throw new ServletException("Security problem with filename: "
                + fName);
        }

        InputStream fileStream = this.getClass().getClassLoader()
                                             .getResourceAsStream("ptolemy/plot/servlet/"
                        + fName);

        Plot ptPlot;

        try {
            if (fileStream == null) {
                throw new ServletException("Could not find: " + fName);
            }

            ptPlot = new Plot();

            int h = 200;
            int w = 300;
            String dummy = request.getParameter("h");

            if (dummy != null) {
                h = Integer.parseInt(dummy);
            }

            dummy = request.getParameter("w");

            if (dummy != null) {
                w = Integer.parseInt(dummy);
            }

            ptPlot.setSize(w, h);

            read(ptPlot, fileStream);
        } finally {
            fileStream.close();
        }

        response.setContentType("image/jpeg");

        OutputStream out = response.getOutputStream();
        writeAsJPEG(out, ptPlot);
        out.close();
    }

    /**
     * Write the jpeg image of the Component cnt to the OutPutStream.
     *
     * If the component is a penal with subpanels you might need to call
     * {@link JPanel#addNotify} and {@link JPanel#doLayout}.
     * If the server is running on Unix you will need to use java 1.4 and specify
     * -Djava.awt.headless=true on the command Line or for tomcat:
     *    edit catalina.sh in the $CATALINA_HOME/bin directory and add a line
     *    CATALINA_OPTS='-Djava.awt.headless=true'
     */
    static public void writeAsJPEG(OutputStream out, Component cnt)
        throws IOException {
        Dimension s = cnt.getSize();
        BufferedImage bufferedImage = new BufferedImage((int) s.getWidth(),
                (int) s.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D graphics = bufferedImage.createGraphics();
        graphics.setColor(Color.white);

        //graphics.fillRect(0, 0, (int)s.getWidth(), (int)s.getHeight());
        cnt.print(graphics);

        JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam encodeParam = JPEGCodec.getDefaultJPEGEncodeParam(bufferedImage);
        encodeParam.setQuality((float) 0.9, true);
        jpegEncoder.encode(bufferedImage, encodeParam);
        graphics.dispose();
        bufferedImage.flush();
    }

    /**
     * Parse PlotML file into plot.
     */
    private static void read(Plot plot, InputStream in)
        throws IOException {
        PlotMLParser parser;
        parser = new PlotMLParser(plot);

        try {
            parser.parse(null, in);
        } catch (Exception ex) {
            String msg;

            if (ex instanceof XmlException) {
                XmlException xmlex = (XmlException) ex;
                msg = "PlotMLFrame: failed to parse PlotML data:\n" + "line: "
                    + xmlex.getLine() + ", column: " + xmlex.getColumn()
                    + "\nIn entity: " + xmlex.getSystemId() + "\n";
            } else {
                msg = "PlotMLFrame: failed to parse PlotML data:\n";
            }

            throw new IOException(msg);
        }
    }
}
TOP

Related Classes of ptolemy.plot.servlet.PlotServlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.