1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/java/cewolf-1.0/src/main/java/de/laures/cewolf/CewolfRenderer.java Sat Feb 28 21:31:02 2009 +0100
1.3 @@ -0,0 +1,265 @@
1.4 +/* ================================================================
1.5 + * Cewolf : Chart enabling Web Objects Framework
1.6 + * ================================================================
1.7 + *
1.8 + * Project Info: http://cewolf.sourceforge.net
1.9 + * Project Lead: Guido Laures (guido@laures.de);
1.10 + *
1.11 + * (C) Copyright 2002, by Guido Laures
1.12 + *
1.13 + * This library is free software; you can redistribute it and/or modify it under the terms
1.14 + * of the GNU Lesser General Public License as published by the Free Software Foundation;
1.15 + * either version 2.1 of the License, or (at your option) any later version.
1.16 + *
1.17 + * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
1.18 + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1.19 + * See the GNU Lesser General Public License for more details.
1.20 + *
1.21 + * You should have received a copy of the GNU Lesser General Public License along with this
1.22 + * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
1.23 + * Boston, MA 02111-1307, USA.
1.24 + */
1.25 +
1.26 +package de.laures.cewolf;
1.27 +
1.28 +import java.io.IOException;
1.29 +import java.io.OutputStream;
1.30 +import java.io.Writer;
1.31 +import java.util.Enumeration;
1.32 +
1.33 +import javax.servlet.ServletConfig;
1.34 +import javax.servlet.ServletException;
1.35 +import javax.servlet.http.HttpServlet;
1.36 +import javax.servlet.http.HttpServletRequest;
1.37 +import javax.servlet.http.HttpServletResponse;
1.38 +
1.39 +import de.laures.cewolf.util.RenderingHelper;
1.40 +
1.41 +/**
1.42 + * The rendering servlet of Cewolf. It is resposible for writing an entire chart
1.43 + * img into the response stream of the client. Everything needed for this is
1.44 + * prepared already by the ChartImgTag resp. LegendTag. The ID of a chart image
1.45 + * is passed to this servlet as a request parameter. After that the image object
1.46 + * is retrieved from the server side session based image cache. This servlet
1.47 + * must be configured in web.xml of the web application in order to use Cewolf
1.48 + * services. The servlet's URL relative to the web apps root is used as the
1.49 + * renderer attribute of the ChartImgTag resp. LegendTag in the JSP page.
1.50 + *
1.51 + * @see de.laures.cewolf.taglib.tags.ChartImgTag
1.52 + * @see de.laures.cewolf.taglib.tags.LegendTag
1.53 + * @author Guido Laures
1.54 + * @since 0.1
1.55 + */
1.56 +public class CewolfRenderer extends HttpServlet implements WebConstants
1.57 +{
1.58 +
1.59 + public static final String INIT_CONFIG = "CewolfRenderer_Init_Config";
1.60 + private static final String STATE = "state";
1.61 + private boolean debugged = false;
1.62 + private int requestCount = 0;
1.63 + private Byte lock = Byte.valueOf("0");
1.64 + private Configuration config = null;
1.65 +
1.66 + public void init( ServletConfig servletCfg ) throws ServletException
1.67 + {
1.68 + super.init(servletCfg);
1.69 +
1.70 + //Store init config params for processing by the Configuration
1.71 + servletCfg.getServletContext().setAttribute(INIT_CONFIG, servletCfg);
1.72 + config = Configuration.getInstance(servletCfg.getServletContext());
1.73 +
1.74 + if (config != null)
1.75 + this.debugged = config.isDebugged();
1.76 + else
1.77 + this.debugged = false;
1.78 + }
1.79 +
1.80 + /**
1.81 + * Processes HTTP <code>GET</code> request. Renders the chart or the lengend
1.82 + * into the client's response stream.
1.83 + *
1.84 + * @param request
1.85 + * servlet request
1.86 + * @param response
1.87 + * servlet response
1.88 + * @throws ServletException
1.89 + * when the production of data could not be handled by the
1.90 + * configured DatasetProcuder
1.91 + */
1.92 +
1.93 + public void printParameters(HttpServletRequest request)
1.94 + {
1.95 + Enumeration enumeration = request.getParameterNames();
1.96 + while (enumeration.hasMoreElements())
1.97 + {
1.98 + String cur = (String)enumeration.nextElement();
1.99 + Object obj = request.getParameter(cur);
1.100 +
1.101 + log("Request Parameter -> " + cur + " Value -> " + obj.toString());
1.102 + }
1.103 + }
1.104 +
1.105 + protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException
1.106 + {
1.107 + if ( debugged )
1.108 + {
1.109 + logRequest(request);
1.110 + }
1.111 + addHeaders(response);
1.112 + if ( request.getParameter(STATE) != null || !request.getParameterNames().hasMoreElements() )
1.113 + {
1.114 + requestState(response);
1.115 + return;
1.116 + }
1.117 + synchronized (lock) {
1.118 + requestCount++;
1.119 + }
1.120 +
1.121 + int width = 400;
1.122 + int height = 400;
1.123 + boolean removeAfterRendering = false;
1.124 + if ( request.getParameter(REMOVE_AFTER_RENDERING) != null )
1.125 + {
1.126 + removeAfterRendering = true;
1.127 + }
1.128 + if ( request.getParameter(WIDTH_PARAM) != null )
1.129 + {
1.130 + width = Integer.parseInt(request.getParameter(WIDTH_PARAM));
1.131 + }
1.132 + if ( request.getParameter(HEIGHT_PARAM) != null )
1.133 + {
1.134 + height = Integer.parseInt(request.getParameter(HEIGHT_PARAM));
1.135 + }
1.136 +
1.137 + // determine the cache key
1.138 + String imgKey = request.getParameter(IMG_PARAM);
1.139 + if ( imgKey == null )
1.140 + {
1.141 + logAndRenderException(new ServletException("no '" + IMG_PARAM + "' parameter provided for Cewolf servlet."), response, width, height);
1.142 + return;
1.143 + }
1.144 + Storage storage = config.getStorage();
1.145 + ChartImage chartImage = storage.getChartImage(imgKey, request);
1.146 + if ( chartImage == null )
1.147 + {
1.148 + renderImageExpiry(response, width, height);
1.149 + return;
1.150 + }
1.151 + // send the img
1.152 + try
1.153 + {
1.154 + long start = System.currentTimeMillis();
1.155 + // response.setContentType(cid.getMimeType());
1.156 + final int size = chartImage.getSize();
1.157 + response.setContentType(chartImage.getMimeType());
1.158 + response.setContentLength(size);
1.159 + response.setBufferSize(size);
1.160 + response.setStatus(HttpServletResponse.SC_OK);
1.161 + response.getOutputStream().write(chartImage.getBytes());
1.162 + long last = System.currentTimeMillis() - start;
1.163 + if ( debugged )
1.164 + {
1.165 + log("creation time for chart " + imgKey + ": " + last + "ms.");
1.166 + }
1.167 + }
1.168 + catch (Throwable t)
1.169 + {
1.170 + logAndRenderException(t, response, width, height);
1.171 + }
1.172 + finally
1.173 + {
1.174 + if (removeAfterRendering)
1.175 + {
1.176 + try {
1.177 + storage.removeChartImage(imgKey , request);
1.178 + } catch (CewolfException e) {
1.179 + log("Removal of image failed", e);
1.180 + }
1.181 + }
1.182 + }
1.183 + }
1.184 +
1.185 + /**
1.186 + * Method addHeaders.
1.187 + *
1.188 + * @param response
1.189 + */
1.190 + private void addHeaders( HttpServletResponse response )
1.191 + {
1.192 + response.setDateHeader("Expires", System.currentTimeMillis());
1.193 + }
1.194 +
1.195 + /**
1.196 + * Method requestState.
1.197 + *
1.198 + * @param request
1.199 + * @param response
1.200 + */
1.201 + private void requestState( HttpServletResponse response ) throws IOException
1.202 + {
1.203 + Writer writer = response.getWriter();
1.204 + writer.write("<HTML><BODY>");
1.205 + /*
1.206 + * StateDescriptor sd = (StateDescriptor)
1.207 + * ChartImageCacheFactory.getChartImageBase( getServletContext());
1.208 + * writer.write(HTMLStateTable.getStateTable(sd));
1.209 + */
1.210 + writer.write("<b>Cewolf servlet up and running.</b><br>");
1.211 + writer.write("Requests served so far: " + requestCount);
1.212 + writer.write("</HTML></BODY>");
1.213 + writer.close();
1.214 + }
1.215 +
1.216 + private void logAndRenderException( Throwable ex, HttpServletResponse response, int width, int height ) throws IOException
1.217 + {
1.218 + log(ex.getMessage(), ex);
1.219 + response.setContentType("image/jpg");
1.220 + OutputStream out = response.getOutputStream();
1.221 + RenderingHelper.renderException(ex, width, height, out);
1.222 + out.close();
1.223 + }
1.224 +
1.225 + /**
1.226 + * Method renderImageExpiry.
1.227 + *
1.228 + * @param response
1.229 + * @param width
1.230 + * @param height
1.231 + */
1.232 + private void renderImageExpiry( HttpServletResponse response, int width, int height ) throws IOException
1.233 + {
1.234 + response.setContentType("image/jpg");
1.235 + OutputStream out = response.getOutputStream();
1.236 + RenderingHelper.renderMessage("This chart has expired. Please reload.", width, height, out);
1.237 + out.close();
1.238 + }
1.239 +
1.240 + private void logRequest( HttpServletRequest request ) throws IOException
1.241 + {
1.242 + log("Cewolf request:");
1.243 + log("Actual Request values:");
1.244 + printParameters(request);
1.245 + Enumeration headerNames = request.getHeaderNames();
1.246 + while ( headerNames.hasMoreElements() )
1.247 + {
1.248 + String name = (String) headerNames.nextElement();
1.249 + Enumeration values = request.getHeaders(name);
1.250 + StringBuffer value = new StringBuffer();
1.251 + while ( values.hasMoreElements() )
1.252 + {
1.253 + value.append((String) values.nextElement() + ",");
1.254 + }
1.255 + // cut last comma
1.256 + if ( value.length() > 0 )
1.257 + value.setLength(value.length() - 1);
1.258 + log(name + ": " + value);
1.259 + }
1.260 + // InputStream body = request.getInputStream();
1.261 + // byte[] bodyData = new byte[body.available()];
1.262 + // body.read(bodyData);
1.263 + // body.close();
1.264 + // log(new String(bodyData));
1.265 +
1.266 + }
1.267 +
1.268 +}
1.269 \ No newline at end of file