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("