001: /*
002: * RimfaxeRequestDispatcher.java
003: *
004: *
005: * Copyright (c) 2003 Rimfaxe ApS (www.rimfaxe.com).
006: * All rights reserved.
007: *
008: * This package is written by Lars Andersen <lars@rimfaxe.com>
009: * and licensed by Rimfaxe ApS.
010: *
011: * Redistribution and use in source and binary forms, with or without
012: * modification, are permitted provided that the following conditions
013: * are met:
014: *
015: * 1. Redistributions of source code must retain the above copyright
016: * notice, this list of conditions and the following disclaimer.
017: *
018: * 2. Redistributions in binary form must reproduce the above copyright
019: * notice, this list of conditions and the following disclaimer in
020: * the documentation and/or other materials provided with the
021: * distribution.
022: *
023: * 3. The end-user documentation included with the redistribution, if
024: * any, must include the following acknowlegement:
025: * "This product includes software developed by Rimfaxe ApS
026: (www.rimfaxe.com)"
027: * Alternately, this acknowlegement may appear in the software itself,
028: * if and wherever such third-party acknowlegements normally appear.
029: *
030: * 4. The names "Rimfaxe", "Rimfaxe Software", "Lars Andersen" and
031: * "Rimfaxe WebServer" must not be used to endorse or promote products
032: * derived from this software without prior written permission. For written
033: * permission, please contact info@rimfaxe.com
034: *
035: * 5. Products derived from this software may not be called "Rimfaxe"
036: * nor may "Rimfaxe" appear in their names without prior written
037: * permission of the Rimfaxe ApS.
038: *
039: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
040: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
041: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
042: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
043: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
044: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
045: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
046: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
047: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
048: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
049: * SUCH DAMAGE.
050: *
051: */
052:
053: package com.rimfaxe.webserver.servletapi;
054:
055: import java.io.IOException;
056: import java.io.InputStream;
057: import java.io.Reader;
058: import java.io.Writer;
059: import java.io.InputStreamReader;
060:
061: import java.net.URL;
062: import java.net.MalformedURLException;
063:
064: import javax.servlet.RequestDispatcher;
065: import javax.servlet.ServletException;
066: import javax.servlet.ServletRequest;
067: import javax.servlet.ServletResponse;
068: import javax.servlet.ServletOutputStream;
069:
070: import com.rimfaxe.webserver.VirtualHost;
071: import com.rimfaxe.webserver.WebContext;
072: import com.rimfaxe.webserver.webapp.Servlet;
073: import com.rimfaxe.webserver.Configuration;
074:
075: public class RimfaxeRequestDispatcher implements RequestDispatcher {
076: com.rimfaxe.webserver.servletapi.ServletFactory factory = com.rimfaxe.webserver.servletapi.ServletFactory
077: .getInstance();
078:
079: VirtualHost virtualhost = null;
080: WebContext webcontext = null;
081:
082: Configuration conf = com.rimfaxe.webserver.ObjectStore
083: .getConfiguration();
084:
085: public static final String REQUEST_URI_P = "javax.servlet.include.request_uri";
086: public static final String CONTEXT_PATH_P = "javax.servlet.include.context_path";
087: public static final String SERVLET_PATH_P = "javax.servlet.include.servlet_path";
088: public static final String PATH_INFO_P = "javax.servlet.include.path_info";
089: public static final String QUERY_STRING_P = "javax.servlet.include.query_string";
090:
091: private String urlpath = null;
092: private String servletname = null;
093:
094: public void forward(ServletRequest request, ServletResponse response)
095: throws ServletException, IOException {
096: //System.out.println("Forward request");
097:
098: if (response
099: .getClass()
100: .getName()
101: .equalsIgnoreCase(
102: "com.rimfaxe.webserver.servletapi.RimfaxeHttpServletResponse")) {
103: RimfaxeHttpServletResponse jres = (RimfaxeHttpServletResponse) response;
104: if (jres.isStreamObtained())
105: throw new IllegalStateException(
106: "Can't Forward! OutputStream or "
107: + "Writer has allready been obtained.");
108: }
109:
110: if (urlpath == null)
111: urlpath = "";
112:
113: if (servletname.equalsIgnoreCase("unknown")) {
114: //System.out.println("unknown servlet name, DESTINATION = "+urlpath);
115:
116: if (webcontext == null) {
117: webcontext = virtualhost.getWebContext(urlpath);
118: }
119:
120: servletname = webcontext.getServletName(urlpath);
121:
122: //System.out.println("Servlet name, resolved to : "+servletname);
123:
124: }
125:
126: Servlet s = webcontext.getServlet(servletname);
127: if (s == null)
128: s = conf.getWebApp().getServlet(servletname);
129:
130: if (s == null) {
131: throw new ServletException("No servlet found");
132: }
133:
134: String cls = s.getClassName();
135:
136: RimfaxeFilterChain rfc = new RimfaxeFilterChain(servletname,
137: urlpath, virtualhost, webcontext, conf);
138: rfc.doService(request, response);
139:
140: }
141:
142: public void include(ServletRequest request, ServletResponse response)
143: throws ServletException, IOException {
144: //System.out.println("Include from dispatcher, URL="+urlpath);
145:
146: if (urlpath == null)
147: urlpath = "";
148:
149: if (servletname.equalsIgnoreCase("unknown")) {
150: //System.out.println("unknown servlet name, JSP="+urlpath);
151:
152: servletname = webcontext.getServletName(urlpath);
153: }
154:
155: Servlet s = webcontext.getServlet(servletname);
156: if (s == null)
157: s = conf.getWebApp().getServlet(servletname);
158:
159: if (s == null) {
160: throw new ServletException("No servlet found");
161: }
162:
163: String cls = s.getClassName();
164:
165: request.setAttribute("javax.servlet.include.request_uri",
166: urlpath);
167: request.setAttribute("javax.servlet.include.servlet_path",
168: urlpath);
169: request
170: .setAttribute("javax.servlet.include.path_info",
171: urlpath);
172: request.setAttribute("javax.servlet.include.context_path",
173: webcontext.getUrlpath());
174:
175: RimfaxeFilterChain rfc = new RimfaxeFilterChain(servletname,
176: urlpath, virtualhost, webcontext, conf);
177: rfc.doService(request, response);
178: }
179:
180: protected RimfaxeRequestDispatcher(String servletname,
181: String urlpath, VirtualHost vh, WebContext webcontext) {
182: //System.out.println("new RimfaxeRequestDispatcher (with webcontext)");
183: this .servletname = servletname;
184: this .virtualhost = vh;
185: this .urlpath = urlpath;
186: this .webcontext = webcontext;
187: }
188:
189: /**
190: * Get the appropriate dispatcher
191: * @param urlpath the servlet URI
192: * @param server the HTTP server
193: *
194: * @return the RequestDispatcher
195: */
196: //public static RequestDispatcher getRequestDispatcher(String urlpath,VirtualHost vh)
197: //{
198: // return new RimfaxeRequestDispatcher("unknown",urlpath, vh, null);
199: //}
200: /**
201: * Get the appropriate dispatcher
202: * @param urlpath the servlet URI
203: * @param server the HTTP server
204: *
205: * @return the RequestDispatcher
206: */
207: public static RequestDispatcher getRequestDispatcher(
208: String urlpath, VirtualHost vh, WebContext ctxt) {
209: return new RimfaxeRequestDispatcher("unknown", urlpath, vh,
210: ctxt);
211: }
212:
213: /**
214: * Get the appropriate dispatcher
215: * @param servletname the servlet
216: * @param server the HTTP server
217: *
218: * @return the RequestDispatcher
219: */
220: public static RequestDispatcher getNamedDispatcher(
221: String servletname, VirtualHost vh, WebContext ctx) {
222: return new RimfaxeRequestDispatcher(servletname, null, vh, ctx);
223: }
224:
225: public String toString() {
226: return "RimfaxeRequestDispatcher";
227: }
228: }
|