001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry;
016
017 import java.io.IOException;
018
019 import javax.servlet.Filter;
020 import javax.servlet.FilterChain;
021 import javax.servlet.FilterConfig;
022 import javax.servlet.ServletException;
023 import javax.servlet.ServletRequest;
024 import javax.servlet.ServletResponse;
025 import javax.servlet.http.HttpServletRequest;
026 import javax.servlet.http.HttpServletResponse;
027
028 import org.apache.commons.logging.Log;
029 import org.apache.commons.logging.LogFactory;
030 import org.apache.hivemind.HiveMind;
031
032 /**
033 * Filter used to redirect a root context URL (i.e., "/context" or "/context/" to the Tapestry
034 * application servlet (typically, "/context/app"). This servlet is mapped to "/" and must have a
035 * <init-parameter&;gt; <code>redirect-path</code> that is the application servlet's path
036 * (i.e., "/app"). If no value is specified, then "/app" is used. The path is always relative to the
037 * servlet context, and should always begin with a leading slash.
038 * <p>
039 * Filters are only available in Servlet API 2.3 and above.
040 * <p>
041 * Servlet API 2.4 is expected to allow a servlets in the welcome list (equivalent to index.html or
042 * index.jsp), at which point this filter should no longer be necessary.
043 *
044 * @author Howard Lewis Ship
045 * @since 3.0
046 */
047
048 public class RedirectFilter implements Filter
049 {
050 private static final Log LOG = LogFactory.getLog(RedirectFilter.class);
051
052 public static final String REDIRECT_PATH_PARAM = "redirect-path";
053
054 private String _redirectPath;
055
056 public void init(FilterConfig config) throws ServletException
057 {
058 _redirectPath = config.getInitParameter(REDIRECT_PATH_PARAM);
059
060 if (HiveMind.isBlank(_redirectPath))
061 _redirectPath = "/app";
062
063 if (LOG.isDebugEnabled())
064 LOG.debug(Tapestry.format("RedirectServlet.redirect-path", _redirectPath));
065 }
066
067 public void destroy()
068 {
069
070 }
071
072 /**
073 * This filter intercepts the so-called "default" servlet, whose job is to provide access to
074 * standard resources packaged within the web application context. This code is interested in
075 * only the very root, redirecting to the appropriate Tapestry application servlet. Other values
076 * are passed through unchanged.
077 */
078 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
079 throws IOException, ServletException
080 {
081 HttpServletRequest hrequest = (HttpServletRequest) request;
082 HttpServletResponse hresponse = (HttpServletResponse) response;
083
084 String servletPath = hrequest.getServletPath();
085 String pathInfo = hrequest.getPathInfo();
086
087 // Been experimenting with different servlet containers. In Jetty 4.2.8 and Tomcat 4.1,
088 // resources have a non-null servletPath. If JBossWeb 3.0.6, the servletPath is
089 // null and the pathInfo indicates the relative location of the resource.
090
091 if ((HiveMind.isBlank(servletPath) || servletPath.equals("/"))
092 && (HiveMind.isBlank(pathInfo) || pathInfo.equals("/")))
093 {
094 String path = hrequest.getContextPath() + _redirectPath;
095
096 if (LOG.isDebugEnabled())
097 LOG.debug(Tapestry.format("RedirectServlet.redirecting", path));
098
099 hresponse.sendRedirect(path);
100 return;
101 }
102
103 chain.doFilter(request, response);
104 }
105
106 }