001: /*
002: * <copyright>
003: *
004: * Copyright 2000-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026: package org.cougaar.lib.web.arch.leaf;
027:
028: import java.io.IOException;
029:
030: import javax.servlet.Servlet;
031: import javax.servlet.ServletConfig;
032: import javax.servlet.ServletException;
033: import javax.servlet.ServletRequest;
034: import javax.servlet.ServletResponse;
035: import javax.servlet.http.HttpServletRequest;
036: import javax.servlet.http.HttpServletResponse;
037:
038: /**
039: * A servlet that redirects "/$[~]name/foo" to "/foo".
040: * <p>
041: * This can be used to a bounce a leaf-level request back to
042: * the root-level, assuming that the request is (logically) for
043: * the root-level. This is very handy when the client doesn't
044: * know which server the leaf happens to be located at and wants
045: * to rely upon redirects. In other words, if leaf "X" is
046: * configured to bounce "/foo" back to the root, it allows the
047: * user to easily phrase:<pre>
048: * "Wherever <i>/$[~]name</i> happens to be right now,
049: * invoke <i>/foo</i> to its root"
050: * </pre>
051: * <p>
052: * Note that the root shouldn't bounce this back to the leaf,
053: * otherwise it's a loop!
054: */
055: public class LeafToRootRedirectServlet implements Servlet {
056:
057: public void service(ServletRequest req, ServletResponse res)
058: throws ServletException, IOException {
059:
060: HttpServletRequest httpReq;
061: HttpServletResponse httpRes;
062: try {
063: httpReq = (HttpServletRequest) req;
064: httpRes = (HttpServletResponse) res;
065: } catch (ClassCastException cce) {
066: // not an HTTP request?
067: throw new ServletException("non-HTTP request or response");
068: }
069:
070: redirect(httpReq, httpRes);
071: }
072:
073: /**
074: * Utility method for redirect.
075: */
076: public final void redirect(HttpServletRequest httpReq,
077: HttpServletResponse httpRes) throws ServletException,
078: IOException {
079:
080: // get the "/$[~]name[/.*]"
081: String path = httpReq.getRequestURI();
082: // assert ((path != null) && (path.startsWith("/$")))
083: int sepIdx = path.indexOf('/', 2);
084: if (sepIdx < 0) {
085: sepIdx = path.length();
086: }
087: String trimPath = path.substring(sepIdx);
088:
089: String queryString = httpReq.getQueryString();
090:
091: // create the new location string
092: String location = httpReq.getScheme() + "://"
093: + httpReq.getServerName() + ":"
094: + httpReq.getServerPort() + trimPath
095: + ((queryString != null) ? ("?" + queryString) : (""));
096:
097: // encode for redirect -- typically a no-op
098: location = httpRes.encodeRedirectURL(location);
099:
100: // redirect the request to the remote location
101: httpRes.sendRedirect(location);
102: }
103:
104: //
105: // other Servlet methods
106: //
107:
108: private ServletConfig config;
109:
110: public void init(ServletConfig config) {
111: this .config = config;
112: }
113:
114: public ServletConfig getServletConfig() {
115: return config;
116: }
117:
118: public String getServletInfo() {
119: return "leaf-to-root-redirect";
120: }
121:
122: public void destroy() {
123: // ignore
124: }
125:
126: }
|