001: /*
002: * RimfaxeFilterChain.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 seda.sandStorm.lib.http.httpRequest;
056: import com.rimfaxe.webserver.seda.SedaHttpResponse;
057:
058: import javax.servlet.ServletRequest;
059: import javax.servlet.ServletResponse;
060: import javax.servlet.ServletException;
061:
062: import com.rimfaxe.webserver.*;
063: import com.rimfaxe.webserver.servletapi.*;
064: import com.rimfaxe.webserver.servletapi.ServletFactory;
065:
066: import java.io.IOException;
067: import java.util.*;
068:
069: /**
070: *
071: * @author Lars Andersen
072: */
073: public class RimfaxeFilterChain implements javax.servlet.FilterChain {
074: ServletFactory factory = null;
075: Configuration conf = null;
076:
077: ServletWrapper servletwrapper = null;
078: javax.servlet.Servlet servlet = null;
079: WebContext webcontext = null;
080: httpRequest request = null;
081: VirtualHost virtualhost = null;
082: com.rimfaxe.webserver.webapp.Servlet servlet_desc = null;
083:
084: Vector filters = new Vector();
085: int current = 0;
086: String servletname = null;
087:
088: /** Creates a new instance of RimfaxeFilterChain */
089: public RimfaxeFilterChain(httpRequest req, VirtualHost vh,
090: WebContext webcontext, Configuration conf,
091: ServletFactory factory) {
092: this .request = req;
093: this .virtualhost = vh;
094: this .webcontext = webcontext;
095: this .conf = conf;
096: this .factory = factory;
097:
098: servletname = webcontext.getServletName(request.getURL());
099:
100: servlet_desc = webcontext.getWebApp().getServlet(servletname);
101: if (servlet_desc == null)
102: servlet_desc = conf.getWebApp().getServlet(servletname);
103:
104: servletwrapper = factory.getWrapper(virtualhost, webcontext,
105: servletname, servlet_desc.getClassName(), request
106: .getURL(), servlet_desc);
107:
108: servlet = servletwrapper.getServlet();
109:
110: filters = webcontext.getFilters(request.getURL());
111: }
112:
113: /** Creates a new instance of RimfaxeFilterChain */
114: public RimfaxeFilterChain(String servletname, String urlpath,
115: VirtualHost vh, WebContext webcontext, Configuration conf) {
116: this .virtualhost = vh;
117: this .webcontext = webcontext;
118: this .conf = conf;
119:
120: this .servletname = servletname;
121: this .factory = com.rimfaxe.webserver.servletapi.ServletFactory
122: .getInstance();
123:
124: servlet_desc = webcontext.getWebApp().getServlet(servletname);
125: if (servlet_desc == null)
126: servlet_desc = conf.getWebApp().getServlet(servletname);
127:
128: //System.out.println("RimfaxeFilterChain, get ServletWrapper");
129:
130: servletwrapper = factory.getWrapper(virtualhost, webcontext,
131: servletname, servlet_desc.getClassName(), urlpath,
132: servlet_desc);
133:
134: //System.out.println("RimfaxeFilterChain, get Servlet");
135: servlet = servletwrapper.getServlet();
136:
137: //System.out.println("RimfaxeFilterChain, get filters");
138: filters = webcontext.getFilters(urlpath);
139: }
140:
141: public void doFilter(javax.servlet.ServletRequest servletRequest,
142: javax.servlet.ServletResponse servletResponse)
143: throws java.io.IOException, javax.servlet.ServletException {
144: //System.out.println("RimfaxeFilterChain, doFilter");
145: if (current < filters.size()) {
146: javax.servlet.Filter active_filter = (javax.servlet.Filter) filters
147: .get(current);
148:
149: //System.out.println("RimfaxeFilterChain, run filter #"+current);
150: //System.out.println("RimfaxeFilterChain, run filter "+active_filter.getClass().getName());
151:
152: current++;
153: active_filter.doFilter(servletRequest, servletResponse,
154: this );
155:
156: try {
157: //System.out.println("RimfaxeFilterChain, flush buffer");
158: servletResponse.flushBuffer();
159: } catch (Exception e) {
160: // ignore exceptions when flushing
161: }
162: } else {
163: //System.out.println("RimfaxeFilterChain, run servlet");
164: doService(servletRequest, servletResponse);
165: //System.out.println("RimfaxeFilterChain, run servlet - done");
166: }
167: }
168:
169: public void doService(javax.servlet.ServletRequest servletRequest,
170: javax.servlet.ServletResponse servletResponse)
171: throws java.io.IOException, javax.servlet.ServletException {
172:
173: //System.out.println("RimfaxeFilterChain, run servlet");
174: servletwrapper.service(servletRequest, servletResponse);
175: }
176:
177: public SedaHttpResponse runservice() throws ServletException,
178: IOException {
179: RimfaxeHttpServletResponse jRes = null;
180: RimfaxeHttpServletRequest jReq = null;
181:
182: //System.out.println("RimfaxeFilterChain, create new Response Object");
183: jRes = new RimfaxeHttpServletResponse(request, webcontext);
184:
185: //System.out.println("RimfaxeFilterChain, create new Request Object");
186:
187: jReq = new RimfaxeHttpServletRequest(servlet, request, jRes,
188: webcontext);
189:
190: doFilter(jReq, jRes);
191:
192: //System.out.println("RimfaxeFilterChain, return reply");
193: return jRes.getSedaResponse();
194: }
195: }
|