huber 02/04/21 13:06:42 Added: src/scratchpad/src/org/apache/cocoon/servlet CocoonFilterGeneratorImpl.java Log: A Servlet2.3 Filter, do Cocoon post-processing, usable for JSP/Servlets generating XML, doing post-processing using Cocoon Revision Changes Path 1.1 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/servlet/CocoonFilterGeneratorImpl.java Index: CocoonFilterGeneratorImpl.java =================================================================== /* * ============================================================================ * The Apache Software License, Version 1.1 * ============================================================================ * Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved. * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * 4. The names "Apache Cocoon" and "Apache Software Foundation" must not be * used to endorse or promote products derived from this software without * prior written permission. For written permission, please contact * [EMAIL PROTECTED] * 5. Products derived from this software may not be called "Apache", nor may * "Apache" appear in their name, without prior written permission of the * Apache Software Foundation. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * This software consists of voluntary contributions made by many individuals * on behalf of the Apache Software Foundation and was originally created by * Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache * Software Foundation, please see <http://www.apache.org/>. */ package org.apache.cocoon.servlet; import java.io.*; import java.util.Enumeration; import javax.servlet.*; import javax.servlet.http.*; /** * This class implements a Servlet 2.3 Cocoon post-processing filter. * <p> * First all filters of the filter chain are processed. * As a final filter processing step a Cocoon servlet processing is * done. * In most cases you may want to use this filter for JSP pre-processing, * and Cocoon post-processing. You may use this filter not only for * JSP pre-processing, but you can define any servlet/filter-chain for * the pre-processing. * </p> * <p> * Xml-data of the filters are passed to cocoon via a request attribute. * On Cocoon side the RequestAttributeGenerator will pick the xml-data, and * normal cocoon pipeline processing is done. * </p> * <p> * Using this filter you have to setup a filter, and a filter mapping * in the webapp deployment descriptor. * </p> * <p> * In the cocoon sitemap you have to setup the <code>RequestAttributeGenerator * </code>. The pipeline setup should match the request URI, and it * should use the <code>RequestAttributeGenerator</code> as its generator. * </p> * <p> * A sample web.xml snippet: * </p> * <pre><tt> * <filter> * <filter-name>CocoonFilterGenerator</filter-name> * <display-name>CocoonFilterGenerator</display-name> * <description>Run JSP/Servlet processing before feeding into Cocoon</description> * <filter-class>org.apache.cocoon.servlet.CocoonFilterGeneratorImpl</filter-class> * <init-param> * <param-name>cocoon-servlet-class-name</param-name> * <param-value>org.apache.cocoon.servlet.CocoonServlet</param-value> * </init-param> * <init-param> * <param-name>verbose</param-name> * <param-value>true</param-value> * </init-param> * </filter> * <filter-mapping> * <filter-name>CocoonFilterGenerator</filter-name> * <url-pattern>*.jsp</url-pattern> * </filter-mapping> * </tt></pre> * <p> * A simple sitemap snippet: * </p> * <pre><tt> * <map:match pattern="docs/samples/jsp/*"> * <map:generate type="req-attr"/> * <map:transform src="stylesheets/page/simple-page2html.xsl"> * <map:parameter name="view-source" value="docs/samples/jsp/{1}"/> * <!-- * Run-time configuration is done through these * <map:parameter/> elements. Again, let's have a look at the * javadocs: * "[...] All <map:parameter> declarations will be made * available in the XSLT stylesheet as xsl:variables. [...]" * --> * </map:transform> * <map:serialize/> * </map:match> * </tt></pre> * <p> * Conclusion of this example: The request URI * <code>/cocoon/docs/samples/jsp/hello.jsp</code> is processed * by the filter <code>CocoonFilterGenerator</code>, due to the * filter-mapping matching. * The pipeline of the snippet matches the request, and the * <code>req-attr</code> generator picks the xml-data of the filter-processing * and sends it into the cocoon pipeline. * </p> * * @author <a href="mailto:[EMAIL PROTECTED]">Bernhard Huber</a> * @version CVS $Id: CocoonFilterGeneratorImpl.java,v 1.1 2002/04/21 20:06:42 huber Exp $ * @servlet:filter-name CocoonFilterGeneratorImpl */ public class CocoonFilterGeneratorImpl implements Filter { /** * Specifies the name of the filter configuration, * definig the Cocoon servlet class name, ie <code>cocoon-servlet-class-name</code> * * @since 1.0 */ public final static String COCOON_SERVLET_CLASS_NAME_PARAM = "cocoon-servlet-class-name"; /** * Specifies the Cocoon servlet class name default value, * ie <code>org.apache.cocoon.servlet.CocoonServlet</code>. * * @since 1.0 */ public final static String COCOON_SERVLET_CLASS_NAME_DEFAULT = "org.apache.cocoon.servlet.CocoonServlet"; /** * Name of filter parameter for setting up verbose mode * * @since 1.0 */ final String VERBOSE_PARAM = "verbose"; /** * Default verbose mode, ie <code>true</code>. * * @since 1.0 */ final boolean VERBOSE_DEFAULT = true; /** * Currently active verbose mode * * @since 1.0 */ private boolean verbose = false; /** * filter wide cocoon servlet to use * * @since 1.0 */ private Servlet cocoon = null; /** * the filter configuration currently used. * * @since 1.0 */ private FilterConfig filterConfig; /** * Sets the filterConfig attribute of the JSPFilterImpl object * * @param cfg The new filterConfig value * @since 1.0 */ public void setFilterConfig(FilterConfig cfg) { filterConfig = cfg; logFilterConfig(); String value; value = filterConfig.getInitParameter(VERBOSE_PARAM); if (value != null) { verbose = ("true".compareToIgnoreCase(value) == 0); } else { verbose = VERBOSE_DEFAULT; } } /** * Gets the filterConfig attribute of the JSPFilterImpl object * * @return The filterConfig value * @since 1.0 */ public FilterConfig getFilterConfig() { return filterConfig; } /** * callback method, destroying the filter * <p> * If cocoon servlet is defined, destroy it. * </p> * * @since 1.0 */ public void destroy() { if (cocoon != null) { cocoon.destroy(); cocoon = null; } } /** * do the filter processing. * <p> * The sequence of this filter: * </p> * <ol> * <li>Process filters defined in the filter chain</li> * <li>Use cocoon as final processing step</li> * </ol> * * @param req the http request * @param res the final http response * @param fc the filter chain * @exception java.io.IOException reading/writing failed * @exception javax.servlet.ServletException processing failed * @since 1.0 */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws java.io.IOException, javax.servlet.ServletException { log("doFilter..."); if (verbose) { logServletContext(); } CocoonFilterGeneratorResponseWrapper res_wrapper1 = new CocoonFilterGeneratorResponseWrapper((HttpServletResponse) res); // start filtering, process filter chain log("do filter pre-processing..."); fc.doFilter(req, res_wrapper1); // put response of pre-processing into request attribute byte[] res_wrapper_data; log("get xml-data..."); res_wrapper_data = res_wrapper1.getData(); if (verbose) { log("get xml-data: " + new String(res_wrapper_data)); log("store xml-data in request-attr " + CocoonFilterGeneratorRequestWrapper.XML_DATA_ATTR); } CocoonFilterGeneratorRequestWrapper cfgrw = new CocoonFilterGeneratorRequestWrapper((HttpServletRequest) req); cfgrw.setXMLData(res_wrapper_data); // invoke Cocoon now try { log("create Cocoon instance..."); createCocoonInstance(); log("service using Cocoon instance..."); cocoon.service(cfgrw, res); } catch (Exception e) { throw new ServletException("Cannot post-process using Cocoon", e); } } /** * Gets the cocoonServletClassName * <p> * The cocoon servlet class name can be configured in the * filter configurarion. * </p> * * @return The cocoonServletClassName value * @since 1.0 * @see #COCOON_SERVLET_CLASS_NAME_PARAM * @see #COCOON_SERVLET_CLASS_NAME_DEFAULT */ protected String getCocoonServletClassName() { String clazz_name = filterConfig.getInitParameter( COCOON_SERVLET_CLASS_NAME_PARAM); if (clazz_name == null) { clazz_name = COCOON_SERVLET_CLASS_NAME_DEFAULT; } return clazz_name; } /** * Gets the verbose attribute of the CocoonFilterGeneratorImpl object * * @return The verbose value * @since 1.0 */ protected boolean isVerbose() { return verbose; } /** * create Cocoon servlet instance. * * @return The cocoonInstance value * @exception ClassNotFoundException Cocoon servlet class is not available * @exception InstantiationException failed to instaniate Cocoon servlet class * @exception IllegalAccessException initializing of Cocoon servlet instance * failed * @exception ServletException initializing of Cocoon servlet instance * failed * @since 1.0 */ protected Servlet createCocoonInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException, ServletException { String clazz_name = getCocoonServletClassName(); Class clazz = Thread.currentThread().getContextClassLoader().loadClass(clazz_name); if (cocoon == null) { cocoon = (Servlet) clazz.newInstance(); cocoon.init(new CocoonFilterGeneratorConfig(filterConfig.getServletContext())); } return cocoon; } /** * log message to servlet context log * * @param s message to log * @since 1.0 */ protected void log(String s) { filterConfig.getServletContext().log("[" + this.getClass().getName() + "] " + String.valueOf(s)); //System.out.println("[" + this.getClass().getName() + "] " + String.valueOf(s)); } /** * Log all filter config parameter * * @since 1.0 */ protected void logFilterConfig() { log("filter config name " + filterConfig.getFilterName()); Enumeration names; names = filterConfig.getInitParameterNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); Object value = filterConfig.getInitParameter(name); log("filter config init parameter " + "name " + String.valueOf(name) + ", " + "value " + String.valueOf(value)); } } /** * Log all servlet attribute, and parameters. * * @since 1.0 */ protected void logServletContext() { ServletContext context = filterConfig.getServletContext(); Enumeration names; names = context.getAttributeNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); Object value = context.getAttribute(name); log("context attribute " + "name " + String.valueOf(name) + ", " + "value " + String.valueOf(value)); } names = context.getInitParameterNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); Object value = context.getInitParameter(name); log("context init parameter " + "name " + String.valueOf(name) + ", " + "value " + String.valueOf(value)); } } /** * Local request wrapper storing xml-data as a request-attribute. * * @author HuberB1 * @version */ class CocoonFilterGeneratorRequestWrapper extends HttpServletRequestWrapper { /** * put xml-data into request-attribute under this name, ie. org.apache.cocoon.xml-data * * @since 1.0 */ public final static String XML_DATA_ATTR = "org.apache.cocoon.xml-data"; /** * Constructor for the CocoonGeneratorRequestWrapper object * * @param request Description of Parameter * @since 1.0 */ public CocoonFilterGeneratorRequestWrapper(HttpServletRequest request) { super(request); } /** * Sets the request attribute of the CocoonGeneratorRequestWrapper object * * @param xmlData The new xml-data value * @since 1.0 */ public void setXMLData(byte[] xmlData) { setAttribute(XML_DATA_ATTR, xmlData); } /** * Gets the xml-data from the request attribute * * @return The xml-data value * @since 1.0 */ public byte[] getXMLData() { return (byte[]) getAttribute(XML_DATA_ATTR); } } /** * Stub implementation of Servlet Config * * @author HuberB1 * @version */ class CocoonFilterGeneratorConfig implements ServletConfig { ServletContext c; /** * Constructor for the config object * * @param c The servlet context in use. * @since 1.0 */ public CocoonFilterGeneratorConfig(ServletContext c) { this.c = c; } /** * Gets the servletName attribute of the config object * * @return The servletName value * @since 1.0 */ public String getServletName() { return "JSPEngineImpl"; } /** * Gets the initParameterNames attribute of the config object * * @return The initParameterNames value * @since 1.0 */ public Enumeration getInitParameterNames() { return c.getInitParameterNames(); } /** * Gets the servletContext attribute of the config object * * @return The servletContext value * @since 1.0 */ public ServletContext getServletContext() { return c; } /** * Gets the initParameter attribute of the config object * * @param name Description of Parameter * @return The initParameter value * @since 1.0 */ public String getInitParameter(String name) { return null; } } /** * A response wrapper storing response in a byte array output stream. * * @author HuberB1 * @version */ class CocoonFilterGeneratorResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream output; private int contentLength; private String contentType; /** * Constructor for the GenericResponseWrapper object * * @param response Description of Parameter * @since 1.0 */ CocoonFilterGeneratorResponseWrapper(HttpServletResponse response) { super(response); output = new ByteArrayOutputStream(); } /** * Sets the contentType attribute of the GenericResponseWrapper object * * @param type The new contentType value * @since 1.0 */ public void setContentType(String type) { this.contentType = type; super.setContentType(type); } /** * Gets the outputStream attribute of the GenericResponseWrapper object * * @return The outputStream value * @since 1.0 */ public ServletOutputStream getOutputStream() { return new CocoonFilterGeneratorOutputStream(output); } /** * Gets the data attribute of the GenericResponseWrapper object * * @return The data value * @since 1.0 */ public byte[] getData() { return output.toByteArray(); } /** * Gets the writer attribute of the GenericResponseWrapper object * * @return The writer value * @exception IOException Description of Exception * @since 1.0 */ public PrintWriter getWriter() throws IOException { return new PrintWriter(getOutputStream(), true); } /** * Gets the contentLength attribute of the GenericResponseWrapper object * * @return The contentLength value * @since 1.0 */ public int getContentLength() { return contentLength; } /** * Gets the contentType attribute of the GenericResponseWrapper object * * @return The contentType value * @since 1.0 */ public String getContentType() { return contentType; } } /** * A servlet output stream storing output into a DataOutputStream. * * @author HuberB1 * @version */ class CocoonFilterGeneratorOutputStream extends ServletOutputStream { private DataOutputStream stream; /** * Constructor for the FilterServletOutputStream object * * @param output Description of Parameter * @since 1.0 */ public CocoonFilterGeneratorOutputStream(OutputStream output) { stream = new DataOutputStream(output); } /** * Description of the Method * * @param b Description of Parameter * @exception IOException Description of Exception * @since 1.0 */ public void write(int b) throws IOException { stream.write(b); } /** * Description of the Method * * @param b Description of Parameter * @exception IOException Description of Exception * @since 1.0 */ public void write(byte[] b) throws IOException { stream.write(b); } /** * Description of the Method * * @param b Description of Parameter * @param off Description of Parameter * @param len Description of Parameter * @exception IOException Description of Exception * @since 1.0 */ public void write(byte[] b, int off, int len) throws IOException { stream.write(b, off, len); } } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]