diff -r 1612dbcec451 -r 639991d0808a java/cewolf-1.0/src/main/java/de/laures/cewolf/CewolfRenderer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/cewolf-1.0/src/main/java/de/laures/cewolf/CewolfRenderer.java Sat Feb 28 21:31:02 2009 +0100 @@ -0,0 +1,265 @@ +/* ================================================================ + * Cewolf : Chart enabling Web Objects Framework + * ================================================================ + * + * Project Info: http://cewolf.sourceforge.net + * Project Lead: Guido Laures (guido@laures.de); + * + * (C) Copyright 2002, by Guido Laures + * + * 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +package de.laures.cewolf; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.util.Enumeration; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import de.laures.cewolf.util.RenderingHelper; + +/** + * The rendering servlet of Cewolf. It is resposible for writing an entire chart + * img into the response stream of the client. Everything needed for this is + * prepared already by the ChartImgTag resp. LegendTag. The ID of a chart image + * is passed to this servlet as a request parameter. After that the image object + * is retrieved from the server side session based image cache. This servlet + * must be configured in web.xml of the web application in order to use Cewolf + * services. The servlet's URL relative to the web apps root is used as the + * renderer attribute of the ChartImgTag resp. LegendTag in the JSP page. + * + * @see de.laures.cewolf.taglib.tags.ChartImgTag + * @see de.laures.cewolf.taglib.tags.LegendTag + * @author Guido Laures + * @since 0.1 + */ +public class CewolfRenderer extends HttpServlet implements WebConstants +{ + + public static final String INIT_CONFIG = "CewolfRenderer_Init_Config"; + private static final String STATE = "state"; + private boolean debugged = false; + private int requestCount = 0; + private Byte lock = Byte.valueOf("0"); + private Configuration config = null; + + public void init( ServletConfig servletCfg ) throws ServletException + { + super.init(servletCfg); + + //Store init config params for processing by the Configuration + servletCfg.getServletContext().setAttribute(INIT_CONFIG, servletCfg); + config = Configuration.getInstance(servletCfg.getServletContext()); + + if (config != null) + this.debugged = config.isDebugged(); + else + this.debugged = false; + } + + /** + * Processes HTTP GET request. Renders the chart or the lengend + * into the client's response stream. + * + * @param request + * servlet request + * @param response + * servlet response + * @throws ServletException + * when the production of data could not be handled by the + * configured DatasetProcuder + */ + + public void printParameters(HttpServletRequest request) + { + Enumeration enumeration = request.getParameterNames(); + while (enumeration.hasMoreElements()) + { + String cur = (String)enumeration.nextElement(); + Object obj = request.getParameter(cur); + + log("Request Parameter -> " + cur + " Value -> " + obj.toString()); + } + } + + protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException + { + if ( debugged ) + { + logRequest(request); + } + addHeaders(response); + if ( request.getParameter(STATE) != null || !request.getParameterNames().hasMoreElements() ) + { + requestState(response); + return; + } + synchronized (lock) { + requestCount++; + } + + int width = 400; + int height = 400; + boolean removeAfterRendering = false; + if ( request.getParameter(REMOVE_AFTER_RENDERING) != null ) + { + removeAfterRendering = true; + } + if ( request.getParameter(WIDTH_PARAM) != null ) + { + width = Integer.parseInt(request.getParameter(WIDTH_PARAM)); + } + if ( request.getParameter(HEIGHT_PARAM) != null ) + { + height = Integer.parseInt(request.getParameter(HEIGHT_PARAM)); + } + + // determine the cache key + String imgKey = request.getParameter(IMG_PARAM); + if ( imgKey == null ) + { + logAndRenderException(new ServletException("no '" + IMG_PARAM + "' parameter provided for Cewolf servlet."), response, width, height); + return; + } + Storage storage = config.getStorage(); + ChartImage chartImage = storage.getChartImage(imgKey, request); + if ( chartImage == null ) + { + renderImageExpiry(response, width, height); + return; + } + // send the img + try + { + long start = System.currentTimeMillis(); + // response.setContentType(cid.getMimeType()); + final int size = chartImage.getSize(); + response.setContentType(chartImage.getMimeType()); + response.setContentLength(size); + response.setBufferSize(size); + response.setStatus(HttpServletResponse.SC_OK); + response.getOutputStream().write(chartImage.getBytes()); + long last = System.currentTimeMillis() - start; + if ( debugged ) + { + log("creation time for chart " + imgKey + ": " + last + "ms."); + } + } + catch (Throwable t) + { + logAndRenderException(t, response, width, height); + } + finally + { + if (removeAfterRendering) + { + try { + storage.removeChartImage(imgKey , request); + } catch (CewolfException e) { + log("Removal of image failed", e); + } + } + } + } + + /** + * Method addHeaders. + * + * @param response + */ + private void addHeaders( HttpServletResponse response ) + { + response.setDateHeader("Expires", System.currentTimeMillis()); + } + + /** + * Method requestState. + * + * @param request + * @param response + */ + private void requestState( HttpServletResponse response ) throws IOException + { + Writer writer = response.getWriter(); + writer.write(""); + /* + * StateDescriptor sd = (StateDescriptor) + * ChartImageCacheFactory.getChartImageBase( getServletContext()); + * writer.write(HTMLStateTable.getStateTable(sd)); + */ + writer.write("Cewolf servlet up and running.
"); + writer.write("Requests served so far: " + requestCount); + writer.write(""); + writer.close(); + } + + private void logAndRenderException( Throwable ex, HttpServletResponse response, int width, int height ) throws IOException + { + log(ex.getMessage(), ex); + response.setContentType("image/jpg"); + OutputStream out = response.getOutputStream(); + RenderingHelper.renderException(ex, width, height, out); + out.close(); + } + + /** + * Method renderImageExpiry. + * + * @param response + * @param width + * @param height + */ + private void renderImageExpiry( HttpServletResponse response, int width, int height ) throws IOException + { + response.setContentType("image/jpg"); + OutputStream out = response.getOutputStream(); + RenderingHelper.renderMessage("This chart has expired. Please reload.", width, height, out); + out.close(); + } + + private void logRequest( HttpServletRequest request ) throws IOException + { + log("Cewolf request:"); + log("Actual Request values:"); + printParameters(request); + Enumeration headerNames = request.getHeaderNames(); + while ( headerNames.hasMoreElements() ) + { + String name = (String) headerNames.nextElement(); + Enumeration values = request.getHeaders(name); + StringBuffer value = new StringBuffer(); + while ( values.hasMoreElements() ) + { + value.append((String) values.nextElement() + ","); + } + // cut last comma + if ( value.length() > 0 ) + value.setLength(value.length() - 1); + log(name + ": " + value); + } + // InputStream body = request.getInputStream(); + // byte[] bodyData = new byte[body.available()]; + // body.read(bodyData); + // body.close(); + // log(new String(bodyData)); + + } + +} \ No newline at end of file