View Javadoc
1 /* 2 * Copyright (c) 2003 3 * Information Desire GmbH 4 * All rights reserved. 5 */ 6 package com.infodesire.infobit.servlet; 7 8 import javax.servlet.ServletConfig; 9 import javax.servlet.ServletContext; 10 import javax.servlet.ServletException; 11 import javax.servlet.ServletOutputStream; 12 import javax.servlet.http.HttpServlet; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 import com.infodesire.infobit.InfobitConfiguration; 17 import com.infodesire.infobit.InfobitPool; 18 import com.infodesire.infobit.InfobitManager; 19 import com.infodesire.infobit.render.InfobitRenderer; 20 import com.infodesire.infobit.render.velocity.ServletVelocityRenderer; 21 import com.infodesire.infobit.util.FormatTool; 22 23 import org.apache.commons.logging.Log; 24 import org.apache.commons.logging.LogFactory; 25 26 import java.io.IOException; 27 import java.io.Writer; 28 29 import java.util.Properties; 30 import java.util.Map; 31 import java.util.HashMap; 32 import java.util.Iterator; 33 /*** 34 * servlet capable to render infobits. delegates work to renderer. output is 35 * intendet to be transformed by xslt filter. Accepts 2 parameters: "poolName" 36 * defined infobit pool name ( from pool configured in web application ). 37 * "binaryPrefix" tells which servlet is going to serve out our binary content. 38 * 39 * @author konstantin 40 * @created August 28, 2003 41 * @version $Revision: 1.8 $ 42 * @todo improve ocnfiguration handling 43 */ 44 public class InfobitServlet extends HttpServlet { 45 46 /*** 47 * Description of the Field 48 */ 49 public final static String CONTENT_TYPE = "default.contentType"; 50 51 /*** 52 * The default content type for the response 53 */ 54 public final static String DEFAULT_CONTENT_TYPE = "text/html"; 55 /*** 56 * Default encoding for the output stream 57 */ 58 public final static String DEFAULT_OUTPUT_ENCODING = "ISO-8859-1"; 59 60 /*** 61 * parameter specifying which infobit pool is to be used 62 */ 63 public final static String POOL_NAME = "poolName"; 64 /*** 65 * parameter specifying prefix for binary infobit servlet shall start with / 66 * but without trailing one. 67 */ 68 public final static String BINARY_PREFIX = "binaryPrefix"; 69 /*** 70 * parameter to pass to context for binary prefix 71 */ 72 public final static String BINARY_PREFIX_NAME = "_infobit_binary_prefix"; 73 /*** 74 * parameter to pass to context for binary prefix 75 */ 76 public final static String SESSION_NAME = "_session_id"; 77 /*** 78 * reference name in context for format tool 79 */ 80 public final static String FORMAT_TOOL = "formatter"; 81 82 private static Log _log = LogFactory.getLog(InfobitServlet.class); 83 84 InfobitPool _pool; 85 InfobitManager _manager; 86 ServletVelocityRenderer _renderer; 87 String _poolName; 88 String _binaryPrefix; 89 FormatTool _format = new FormatTool(); 90 91 92 /*** 93 * setup parameters from request. shall be overriden by implementing classes 94 * in case they wish something special. 95 * 96 * @param request Description of Parameter 97 * @return Description of the Returned Value 98 */ 99 public Map setupContext(HttpServletRequest request) { 100 HashMap parameters = new HashMap(); 101 Map reqParams = request.getParameterMap(); 102 103 String key; 104 String[] values; 105 106 for (Iterator iter = reqParams.keySet().iterator(); iter.hasNext(); ) { 107 key = (String) iter.next(); 108 values = (String[]) reqParams.get(key); 109 if (values.length == 1) { 110 parameters.put(key, values[0]); 111 if (_log.isDebugEnabled()) { 112 _log.debug("passing single value param: " + key + "=" + values[0]); 113 } 114 } 115 else { 116 parameters.put(key, values); 117 if (_log.isDebugEnabled()) { 118 _log.debug("passing single value array for: " + key); 119 } 120 } 121 } 122 123 // and also pass session ID and prefix to binary infobits 124 parameters.put(BINARY_PREFIX_NAME, request.getContextPath() + _binaryPrefix); 125 parameters.put(SESSION_NAME, request.getSession().getId()); 126 parameters.put(FORMAT_TOOL, _format); 127 return parameters; 128 } 129 130 131 /*** 132 * initialize servlet for infobit rendering 133 * 134 * @param config Description of Parameter 135 * @exception ServletException Description of Exception 136 */ 137 public void init(ServletConfig config) throws ServletException { 138 super.init(config); 139 _poolName = config.getInitParameter(POOL_NAME); 140 _binaryPrefix = config.getInitParameter(BINARY_PREFIX); 141 try { 142 _log.debug("******* loading infobit pool ***************"); 143 _pool = InfobitConfiguration.getInstance().getPool(_poolName); 144 _log.debug("******* retriving infobit manager ***********"); 145 _manager = _pool.getInfobitManager(); 146 _log.debug("******* preparing velocity renderer ***********"); 147 _renderer = new ServletVelocityRenderer(); 148 _renderer.setManager(_manager); 149 _renderer.init(new Properties()); 150 _log.debug("************ renderer ready ************* "); 151 // flish infobit pool - our resource loader opens connection 152 // in case your resource loader opened connection 153 _pool.flush(); 154 } catch (Exception ex) { 155 _log.error("exception while acquiring infobit pool: " + _poolName, ex); 156 throw new ServletException("exception while acquiring infobit pool: " + _poolName, ex); 157 } 158 } 159 160 161 /*** 162 * Handles GET - calls doRequest() 163 * 164 * @param request Description of Parameter 165 * @param response Description of Parameter 166 * @exception ServletException Description of Exception 167 * @exception IOException Description of Exception 168 */ 169 public void doGet(HttpServletRequest request, HttpServletResponse response) 170 throws ServletException, IOException { 171 doRequest(request, response); 172 } 173 174 175 /*** 176 * Handle a POST request - calls doRequest() 177 * 178 * @param request Description of Parameter 179 * @param response Description of Parameter 180 * @exception ServletException Description of Exception 181 * @exception IOException Description of Exception 182 */ 183 public void doPost(HttpServletRequest request, HttpServletResponse response) 184 throws ServletException, IOException { 185 doRequest(request, response); 186 } 187 188 189 /*** 190 * Handles with both GET and POST requests. we just render infobit out using 191 * renderer 192 * 193 * @param request HttpServletRequest object containing client 194 * request 195 * @param response HttpServletResponse object for the response 196 * @exception ServletException Description of Exception 197 * @exception IOException Description of Exception 198 */ 199 protected void doRequest(HttpServletRequest request, 200 HttpServletResponse response) 201 throws ServletException, IOException { 202 203 String pathInfo = (String) request.getAttribute("javax.servlet.include.path_info"); 204 if (pathInfo == null) { 205 // cool, we are original request. so we set up out pure response 206 response.setContentType("text/html"); 207 // and grab path info out of request 208 pathInfo = request.getPathInfo(); 209 } 210 211 String infobitName = pathInfo.substring(1); 212 if (_log.isDebugEnabled()) { 213 _log.debug("rendering infobit : " + infobitName); 214 } 215 Map parameters = setupContext(request); 216 217 try { 218 Writer servletWriter = response.getWriter(); 219 _renderer.render(infobitName, servletWriter, parameters); 220 servletWriter.flush(); 221 servletWriter.close(); 222 } catch (Exception ex) { 223 _log.error("error occured while rendering infobit", ex); 224 225 } 226 } 227 }

This page was automatically generated by Maven