001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.components.jsp;
018:
019: import java.io.IOException;
020:
021: import javax.servlet.RequestDispatcher;
022: import javax.servlet.ServletContext;
023: import javax.servlet.ServletException;
024: import javax.servlet.http.HttpServletRequest;
025: import javax.servlet.http.HttpServletResponse;
026:
027: import org.apache.avalon.framework.logger.AbstractLogEnabled;
028: import org.apache.avalon.framework.parameters.Parameterizable;
029: import org.apache.avalon.framework.parameters.Parameters;
030: import org.apache.avalon.framework.thread.ThreadSafe;
031:
032: /**
033: * Allows a Servlet or JSP to be used as a generator.
034: *
035: * <p>
036: * This implementation includes the servlet response using the
037: * RequestDispatcher from ServletContext.getNamedDispatcher().
038: * </p>
039: *
040: * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a>
041: * @author <a href="mailto:bh22351@i-one.at">Bernhard Huber</a>
042: * @version CVS $Id: JSPEngineImplNamedDispatcherInclude.java 433543 2006-08-22 06:22:54Z crossley $
043: */
044: public class JSPEngineImplNamedDispatcherInclude extends
045: AbstractLogEnabled implements JSPEngine, Parameterizable,
046: ThreadSafe {
047:
048: /**
049: * 'servlet-name' configuration parameter name for specifying
050: * the servlet name to dispatch to.
051: */
052: public static final String CONFIG_SERVLET_NAME = "servlet-name";
053:
054: /**
055: * 'forward' configuration parameter name for specifying
056: * whether or not the dispather should use forward
057: * instead of include.
058: */
059: public static final String CONFIG_FORWARD = "forward";
060:
061: /**
062: * Default value of CONFIG_SERVLET_NAME.
063: * The value is <code>*.jsp</code>,
064: * this is the WLS JSP servlet default name.
065: */
066: public static final String DEFAULT_SERVLET_NAME = "*.jsp";
067:
068: /**
069: * Default value of CONFIG_FORWARD.
070: * The value is <code>false</code>.
071: */
072: public static final boolean DEFAULT_FORWARD = false;
073:
074: /**
075: * the configured name of the jsp servlet
076: */
077: private String servletName = DEFAULT_SERVLET_NAME;
078:
079: /**
080: * Whether or not to use forward instead of include
081: * when dispatching to the Servlet.
082: */
083: private boolean forward = DEFAULT_FORWARD;
084:
085: /**
086: * <p>
087: * The <code>forward</code> configuration parameter allows you to
088: * control whether to use the forward dispatch method instead of
089: * the include method which is used by default.
090: * </p>
091: * <p>
092: * Using the <code>servlet-name</code> configuration parameter
093: * you can specify the name of the Servlet to dispatch to.
094: * </p>
095: */
096: public void parameterize(Parameters params) {
097: this .servletName = params.getParameter(CONFIG_SERVLET_NAME,
098: DEFAULT_SERVLET_NAME);
099: this .forward = params.getParameterAsBoolean(CONFIG_FORWARD,
100: DEFAULT_FORWARD);
101: }
102:
103: /**
104: * Execute the Servlet and return the output.
105: */
106: public byte[] executeJSP(String url,
107: HttpServletRequest servletRequest,
108: HttpServletResponse servletResponse,
109: ServletContext servletContext) throws IOException,
110: ServletException, Exception {
111:
112: JSPEngineServletOutputStream output = new JSPEngineServletOutputStream();
113: JSPEngineServletRequest request = new JSPEngineServletRequest(
114: servletRequest, url);
115: JSPEngineServletResponse response = new JSPEngineServletResponse(
116: servletResponse, output);
117:
118: byte[] bytes = null;
119:
120: // dispatch to the named servlet
121: RequestDispatcher rd = servletContext
122: .getNamedDispatcher(servletName);
123: if (rd != null) {
124: if (forward) {
125: rd.forward(request, response);
126: } else {
127: rd.include(request, response);
128: }
129: response.flushBuffer();
130: bytes = output.toByteArray();
131: } else {
132: throw new Exception(
133: "No RequestDispatcher found. Specify a correct '"
134: + CONFIG_SERVLET_NAME + "': " + servletName);
135: }
136: return bytes;
137: }
138: }
|