KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > infoglue > deliver > applications > filters > RedirectFilter


1 /* ===============================================================================
2 *
3 * Part of the InfoGlue Content Management Platform (www.infoglue.org)
4 *
5 * ===============================================================================
6 *
7 * Copyright (C)
8 *
9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 2, as published by the
11 * Free Software Foundation. See the file LICENSE.html for more information.
12 *
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
19 * Place, Suite 330 / Boston, MA 02111-1307 / USA.
20 *
21 * ===============================================================================
22 */

23
24 package org.infoglue.deliver.applications.filters;
25
26 import java.io.IOException JavaDoc;
27 import java.net.URLDecoder JavaDoc;
28 import java.util.ArrayList JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.StringTokenizer JavaDoc;
31
32 import javax.servlet.Filter JavaDoc;
33 import javax.servlet.FilterChain JavaDoc;
34 import javax.servlet.FilterConfig JavaDoc;
35 import javax.servlet.ServletException JavaDoc;
36 import javax.servlet.ServletRequest JavaDoc;
37 import javax.servlet.ServletResponse JavaDoc;
38 import javax.servlet.http.HttpServletRequest JavaDoc;
39 import javax.servlet.http.HttpServletResponse JavaDoc;
40
41 import org.apache.log4j.Logger;
42 import org.infoglue.cms.controllers.kernel.impl.simple.RedirectController;
43 import org.infoglue.cms.exception.SystemException;
44
45 /**
46  * This filters urls registered to be redirected.
47  *
48  * @author Mattias Bogeblad
49  */

50
51 public class RedirectFilter implements Filter JavaDoc
52 {
53     public final static Logger logger = Logger.getLogger(RedirectFilter.class.getName());
54
55     private static String JavaDoc FILTER_URIS_PARAMETER = "FilterURIs";
56     
57     private FilterConfig JavaDoc filterConfig = null;
58     private URIMatcher uriMatcher = null;
59  
60  
61     public void init(FilterConfig JavaDoc filterConfig) throws ServletException JavaDoc
62     {
63         this.filterConfig = filterConfig;
64         String JavaDoc filterURIs = filterConfig.getInitParameter(FILTER_URIS_PARAMETER);
65         uriMatcher = URIMatcher.compilePatterns(splitString(filterURIs, ","), false);
66    }
67
68     public void doFilter(ServletRequest JavaDoc servletRequest, ServletResponse JavaDoc servletResponse, FilterChain JavaDoc filterChain) throws IOException JavaDoc, ServletException JavaDoc
69     {
70         long end, start = System.currentTimeMillis();
71         HttpServletRequest JavaDoc httpRequest = (HttpServletRequest JavaDoc) servletRequest;
72         HttpServletResponse JavaDoc httpResponse = (HttpServletResponse JavaDoc) servletResponse;
73         //String requestURI = URLDecoder.decode(getContextRelativeURI(httpRequest), "UTF-8");
74
String JavaDoc requestURL = httpRequest.getRequestURL().toString();
75
76         logger.info("Redirect filter requestURL:" + requestURL);
77         
78         
79         try
80         {
81             String JavaDoc requestURI = URLDecoder.decode(getContextRelativeURI(httpRequest), "UTF-8");
82
83             if (!uriMatcher.matches(requestURI))
84             {
85                 try
86                 {
87                     String JavaDoc redirectUrl = RedirectController.getController().getRedirectUrl(httpRequest);
88                     if(redirectUrl != null && redirectUrl.length() > 0)
89                     {
90                         httpResponse.sendRedirect(redirectUrl);
91                         return;
92                     }
93                 }
94                 catch (SystemException se)
95                 {
96                     logger.warn("Error in redirect filter: " + se.getMessage(), se);
97                     httpRequest.setAttribute("responseCode", "500");
98                     httpRequest.setAttribute("error", se);
99                     httpRequest.getRequestDispatcher("/ErrorPage.action").forward(httpRequest, httpResponse);
100                 }
101                 catch (Exception JavaDoc e)
102                 {
103                     logger.warn("Error in redirect filter: " + e.getMessage(), e);
104                     httpRequest.setAttribute("responseCode", "404");
105                     httpRequest.setAttribute("error", e);
106                     httpRequest.getRequestDispatcher("/ErrorPage.action").forward(httpRequest, httpResponse);
107                 }
108             }
109         }
110         catch (Exception JavaDoc e)
111         {
112             logger.error("RedirectFilter threw error:" + e.getMessage(), e);
113         }
114         
115         filterChain.doFilter(httpRequest, httpResponse);
116
117     }
118
119     public void destroy()
120     {
121         this.filterConfig = null;
122     }
123
124
125     // @TODO should I URLDecode the strings first? (incl. context path)
126
private String JavaDoc getContextRelativeURI(HttpServletRequest JavaDoc request) {
127         String JavaDoc requestURI = request.getRequestURI();
128         String JavaDoc contextPath = request.getContextPath();
129         if (contextPath != null && requestURI.length() > 0) {
130             requestURI = requestURI.substring(contextPath.length(), requestURI.length());
131         }
132         if (requestURI.length() == 0)
133             return "/";
134         return requestURI;
135     }
136     
137     private String JavaDoc[] splitString(String JavaDoc str, String JavaDoc delimiter) {
138         List JavaDoc list = new ArrayList JavaDoc();
139         StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(str, delimiter);
140         while (st.hasMoreTokens()) {
141             // Updated to handle portal-url:s
142
String JavaDoc t = st.nextToken();
143             if (t.startsWith("_")) {
144                 break;
145             } else {
146                 // Not related to portal - add
147
list.add(t.trim());
148             }
149         }
150         return (String JavaDoc[]) list.toArray(new String JavaDoc[list.size()]);
151     }
152
153
154 }
Popular Tags