001: /*
002: License $Id: JoRequestDispatcher.java,v 1.7 2004/04/16 01:30:04 hendriks73 Exp $
003:
004: Copyright (c) 2001-2005 tagtraum industries.
005:
006: LGPL
007: ====
008:
009: jo! is free software; you can redistribute it and/or
010: modify it under the terms of the GNU Lesser General Public
011: License as published by the Free Software Foundation; either
012: version 2.1 of the License, or (at your option) any later version.
013:
014: jo! is distributed in the hope that it will be useful,
015: but WITHOUT ANY WARRANTY; without even the implied warranty of
016: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: Lesser General Public License for more details.
018:
019: You should have received a copy of the GNU Lesser General Public
020: License along with this library; if not, write to the Free Software
021: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022:
023: For LGPL see <http://www.fsf.org/copyleft/lesser.txt>
024:
025:
026: Sun license
027: ===========
028:
029: This release contains software by Sun Microsystems. Therefore
030: the following conditions have to be met, too. They apply to the
031: files
032:
033: - lib/mail.jar
034: - lib/activation.jar
035: - lib/jsse.jar
036: - lib/jcert.jar
037: - lib/jaxp.jar
038: - lib/crimson.jar
039: - lib/servlet.jar
040: - lib/jnet.jar
041: - lib/jaas.jar
042: - lib/jaasmod.jar
043:
044: contained in this release.
045:
046: a. Licensee may not modify the Java Platform
047: Interface (JPI, identified as classes contained within the javax
048: package or any subpackages of the javax package), by creating additional
049: classes within the JPI or otherwise causing the addition to or modification
050: of the classes in the JPI. In the event that Licensee creates any
051: Java-related API and distribute such API to others for applet or
052: application development, you must promptly publish broadly, an accurate
053: specification for such API for free use by all developers of Java-based
054: software.
055:
056: b. Software is confidential copyrighted information of Sun and
057: title to all copies is retained by Sun and/or its licensors. Licensee
058: shall not modify, decompile, disassemble, decrypt, extract, or otherwise
059: reverse engineer Software. Software may not be leased, assigned, or
060: sublicensed, in whole or in part. Software is not designed or intended
061: for use in on-line control of aircraft, air traffic, aircraft navigation
062: or aircraft communications; or in the design, construction, operation or
063: maintenance of any nuclear facility. Licensee warrants that it will not
064: use or redistribute the Software for such purposes.
065:
066: c. Software is provided "AS IS," without a warranty
067: of any kind. ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES,
068: INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
069: PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
070:
071: d. This License is effective until terminated. Licensee may
072: terminate this License at any time by destroying all copies of Software.
073: This License will terminate immediately without notice from Sun if Licensee
074: fails to comply with any provision of this License. Upon such termination,
075: Licensee must destroy all copies of Software.
076:
077: e. Software, including technical data, is subject to U.S.
078: export control laws, including the U.S. Export Administration Act and its
079: associated regulations, and may be subject to export or import regulations
080: in other countries. Licensee agrees to comply strictly with all such
081: regulations and acknowledges that it has the responsibility to obtain
082: licenses to export, re-export, or import Software. Software may not be
083: downloaded, or otherwise exported or re-exported (i) into, or to a national
084: or resident of, Cuba, Iraq, Iran, North Korea, Libya, Sudan, Syria or any
085: country to which the U.S. has embargoed goods; or (ii) to anyone on the
086: U.S. Treasury Department's list of Specially Designated Nations or the U.S.
087: Commerce Department's Table of Denial Orders.
088:
089:
090: Feedback
091: ========
092:
093: We encourage your feedback and suggestions and want to use your feedback to
094: improve the Software. Send all such feedback to:
095: <feedback@tagtraum.com>
096:
097: For more information on tagtraum industries and jo!
098: please see <http://www.tagtraum.com/>.
099:
100:
101: */
102: package com.tagtraum.jo;
103:
104: import com.tagtraum.framework.http.URI;
105:
106: import javax.servlet.ServletException;
107: import javax.servlet.ServletRequest;
108: import javax.servlet.ServletResponse;
109: import javax.servlet.ServletRequestWrapper;
110: import javax.servlet.ServletResponseWrapper;
111: import javax.servlet.http.HttpServletRequest;
112: import javax.servlet.http.HttpServletRequestWrapper;
113: import javax.servlet.http.HttpServletResponseWrapper;
114: import javax.servlet.http.HttpServletResponse;
115: import java.io.IOException;
116: import java.util.ResourceBundle;
117:
118: /**
119: * Implementation of {@link I_JoRequestDispatcher}.
120: *
121: * @version 1.1beta1 $Id: JoRequestDispatcher.java,v 1.7 2004/04/16 01:30:04 hendriks73 Exp $
122: * @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
123: */
124: public class JoRequestDispatcher implements I_JoRequestDispatcher, C_Jo {
125:
126: /**
127: * Source-Version
128: */
129: public static String vcid = "$Id: JoRequestDispatcher.java,v 1.7 2004/04/16 01:30:04 hendriks73 Exp $";
130: private static ResourceBundle localStrings = ResourceBundle
131: .getBundle("com.tagtraum.jo.localStrings");
132:
133: /**
134: * Peer
135: */
136: private I_JoServletContextPeer peer;
137:
138: /**
139: * Name of this dispatcher.
140: */
141: private String name;
142:
143: /**
144: * URI to dispatch to.
145: */
146: private URI dispatchToURI;
147:
148: /**
149: * Inidicates whether this dispatcher dispatches to an URI or to a named resource.
150: */
151: private boolean isURI;
152:
153: /**
154: * No-Arg-Constructor.
155: */
156: public JoRequestDispatcher() {
157: }
158:
159: /**
160: * Initializes this dispatcher.
161: *
162: * @param name name
163: * @param peer peer
164: */
165: public void init(String name, I_JoServletContextPeer peer) {
166: if (name == null)
167: throw new NullPointerException();
168: this .peer = peer;
169: this .name = name;
170: isURI = false;
171: }
172:
173: /**
174: * Initializes this dispatcher.
175: *
176: * @param dispatchToURI URI
177: * @param peer peer
178: */
179: public void init(URI dispatchToURI, I_JoServletContextPeer peer) {
180: if (dispatchToURI == null)
181: throw new NullPointerException();
182: this .peer = peer;
183: this .dispatchToURI = dispatchToURI;
184: isURI = true;
185: }
186:
187: /**
188: * Forwards the request to another resource.
189: *
190: * @param req Request to forward
191: * @param res Response-Object
192: */
193: public void forward(ServletRequest req, ServletResponse res)
194: throws IOException, ServletException {
195: HttpServletRequestWrapper previousRequest = null;
196: ServletRequest currentRequest = req;
197: try {
198: if (isURI) {
199: // wrap request
200: while (currentRequest != null) {
201: if (currentRequest instanceof JoServletRequest)
202: break;
203: if (currentRequest instanceof IncludeRequestWrapper)
204: break;
205: if (!(currentRequest instanceof ServletRequestWrapper))
206: break;
207: previousRequest = (HttpServletRequestWrapper) currentRequest;
208: currentRequest = ((ServletRequestWrapper) currentRequest)
209: .getRequest();
210: }
211: ForwardRequestWrapper requestWrapper = new ForwardRequestWrapper(
212: (HttpServletRequest) req);
213: if (previousRequest != null)
214: previousRequest.setRequest(requestWrapper);
215: else
216: req = requestWrapper;
217:
218: ModelMatch modelMatch = peer
219: .getServletModel(dispatchToURI);
220: requestWrapper.setModelMatch(modelMatch);
221: modelMatch.getModel().service(req, res);
222: } else {
223: peer.getNamedServletModel(name).service(req, res);
224: }
225: } catch (IOException ioe) {
226: throw ioe;
227: } catch (ServletException se) {
228: throw se;
229: } catch (RuntimeException re) {
230: throw re;
231: } catch (Throwable t) {
232: if (isURI) {
233: throw new ServletException(localStrings
234: .getString("forward_failed")
235: + dispatchToURI + ", " + t.toString(), t);
236: } else {
237: throw new ServletException(localStrings
238: .getString("forward_failed")
239: + name + ", " + t.toString(), t);
240: }
241: } finally {
242: // remove inserted wrappers
243: if (previousRequest != null)
244: previousRequest.setRequest(currentRequest);
245: }
246: }
247:
248: public void include(ServletRequest req, ServletResponse res)
249: throws IOException, ServletException {
250: // wrap request
251: HttpServletRequestWrapper previousRequest = null;
252: ServletRequest currentRequest = req;
253: while (currentRequest != null) {
254: if (currentRequest instanceof JoServletRequest)
255: break;
256: if (currentRequest instanceof IncludeRequestWrapper)
257: break;
258: if (!(currentRequest instanceof ServletRequestWrapper))
259: break;
260: previousRequest = (HttpServletRequestWrapper) currentRequest;
261: currentRequest = ((ServletRequestWrapper) currentRequest)
262: .getRequest();
263: }
264: IncludeRequestWrapper insertedRequestWrapper = new IncludeRequestWrapper(
265: (HttpServletRequest) currentRequest);
266: if (previousRequest != null)
267: previousRequest.setRequest(insertedRequestWrapper);
268: else
269: req = insertedRequestWrapper;
270:
271: // wrap response
272: HttpServletResponseWrapper previousResponse = null;
273: ServletResponse currentResponse = res;
274: while (currentResponse != null) {
275: if (currentResponse instanceof JoServletResponse)
276: break;
277: if (currentResponse instanceof IncludeResponseWrapper)
278: break;
279: if (!(currentResponse instanceof ServletResponseWrapper))
280: break;
281: previousResponse = (HttpServletResponseWrapper) currentResponse;
282: currentResponse = ((ServletResponseWrapper) currentResponse)
283: .getResponse();
284: }
285: IncludeResponseWrapper insertedResponseWrapper = new IncludeResponseWrapper(
286: (HttpServletResponse) currentResponse);
287: if (previousResponse != null)
288: previousResponse.setResponse(insertedResponseWrapper);
289: else
290: res = insertedResponseWrapper;
291:
292: // include
293: try {
294: if (isURI) {
295: ModelMatch modelMatch = peer
296: .getServletModel(dispatchToURI);
297: insertedRequestWrapper.setModelMatch(modelMatch);
298: modelMatch.getModel().service(req, res);
299: } else {
300: peer.getNamedServletModel(name).service(req, res);
301: }
302: } catch (IOException ioe) {
303: throw ioe;
304: } catch (ServletException se) {
305: throw se;
306: } catch (RuntimeException re) {
307: throw re;
308: } catch (Throwable t) {
309: if (isURI) {
310: throw new ServletException(localStrings
311: .getString("include_failed")
312: + dispatchToURI + ", " + t.toString(), t);
313: } else {
314: throw new ServletException(localStrings
315: .getString("include_failed")
316: + name + ", " + t.toString(), t);
317: }
318: } finally {
319: // remove inserted wrappers
320: if (previousRequest != null)
321: previousRequest.setRequest(currentRequest);
322: if (previousResponse != null)
323: previousResponse.setResponse(currentResponse);
324: }
325: }
326:
327: /**
328: * String representation.
329: */
330: public String toString() {
331: String message = getClass().getName() + " for "
332: + peer.getName() + " ";
333: if (isURI) {
334: return message + dispatchToURI;
335: } else {
336: return message + name;
337: }
338: }
339:
340: }
|