KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sslexplorer > core > CoreRequestProcessor


1 /*
2  * SSL-Explorer
3  *
4  * Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */

19             
20 package com.sslexplorer.core;
21
22 import java.io.IOException JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.Locale JavaDoc;
26 import java.util.Map JavaDoc;
27 import java.util.StringTokenizer JavaDoc;
28
29 import javax.servlet.ServletException JavaDoc;
30 import javax.servlet.http.Cookie JavaDoc;
31 import javax.servlet.http.HttpServletRequest JavaDoc;
32 import javax.servlet.http.HttpServletResponse JavaDoc;
33 import javax.servlet.http.HttpSession JavaDoc;
34 import javax.servlet.http.HttpSessionBindingEvent JavaDoc;
35 import javax.servlet.http.HttpSessionBindingListener JavaDoc;
36
37 import org.apache.struts.Globals;
38 import org.apache.struts.action.Action;
39 import org.apache.struts.action.ActionForm;
40 import org.apache.struts.action.ActionForward;
41 import org.apache.struts.action.ActionMapping;
42 import org.apache.struts.action.ActionMessage;
43 import org.apache.struts.action.ActionMessages;
44 import org.apache.struts.tiles.TilesRequestProcessor;
45
46 import com.sslexplorer.boot.ContextHolder;
47 import com.sslexplorer.boot.HostService;
48 import com.sslexplorer.boot.PropertyList;
49 import com.sslexplorer.boot.Util;
50 import com.sslexplorer.navigation.MenuTree;
51 import com.sslexplorer.navigation.NavigationManager;
52 import com.sslexplorer.properties.Property;
53 import com.sslexplorer.properties.impl.systemconfig.SystemConfigKey;
54 import com.sslexplorer.security.Constants;
55 import com.sslexplorer.tasks.TaskHttpServletRequest;
56
57 /**
58  * Extension of {@link org.apache.struts.tiles.TilesRequestProcessor} that
59  * <strong>all</strong> requests to the struts application pass throught.
60  * <p>
61  * Here a map of all active session is maintained and a check is made to see if
62  * the navigation menus have been constructed.
63  *
64  * @author Brett Smith <a HREF="mailto: brett@3sp.com">&lt;brett@3sp.com&gt;</a>
65  */

66 public class CoreRequestProcessor extends TilesRequestProcessor {
67
68     final static Map JavaDoc<String JavaDoc, HttpSession JavaDoc> sessions = new HashMap JavaDoc<String JavaDoc, HttpSession JavaDoc>();
69     static CoreRequestProcessor requestProcessor;
70
71     /**
72      * Constructor.
73      *
74      */

75     public CoreRequestProcessor() {
76         super();
77         requestProcessor = this;
78     }
79
80     /**
81      * Get a static instance of the request processor.
82      *
83      * @return static instance of request processor
84      */

85     public static CoreRequestProcessor getRequestProcessor() {
86         return requestProcessor;
87     }
88
89     /**
90      * Get a map of all sessions
91      *
92      * @return map of all sessions
93      */

94     public static Map JavaDoc getSessions() {
95         return sessions;
96     }
97
98     /*
99      * (non-Javadoc)
100      *
101      * @see org.apache.struts.action.RequestProcessor#process(javax.servlet.http.HttpServletRequest,
102      * javax.servlet.http.HttpServletResponse)
103      */

104     public void process(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws IOException JavaDoc, ServletException JavaDoc {
105         HttpSession JavaDoc session = request.getSession();
106         
107         if (session.getAttribute(Constants.SESSION_HOOK) == null) {
108
109             sessions.put(session.getId(), session);
110             session.setAttribute(Constants.SESSION_HOOK, new HttpSessionBindingListener JavaDoc() {
111
112                 public void valueBound(HttpSessionBindingEvent JavaDoc arg0) {
113                 }
114
115                 public void valueUnbound(HttpSessionBindingEvent JavaDoc arg0) {
116                     sessions.remove(arg0.getSession().getId());
117                 }
118             });
119
120             // Redirect to a valid host if not in setup mode and the feature is
121
// in use
122
if (!ContextHolder.getContext().isSetupMode()) {
123                 String JavaDoc action = Property.getProperty(new SystemConfigKey("webServer.invalidHostnameAction"));
124                 PropertyList validExternalHosts = Property.getPropertyList(new SystemConfigKey("webServer.validExternalHostnames"));
125                 ;
126                 if (validExternalHosts.size() != 0) {
127                     Iterator JavaDoc it = validExternalHosts.iterator();
128                     String JavaDoc host = request.getHeader("Host");
129                     HostService hostService = host == null ? null : new HostService(host);
130                     boolean hostOk = false;
131                     String JavaDoc firstHost = (String JavaDoc) it.next();
132                     if (hostService != null && !hostService.getHost().equals("")) {
133                         if (hostService.getHost().startsWith("activeproxy")) {
134                             int idx = hostService.getHost().indexOf(".");
135                             hostService.setHost(hostService.getHost().substring(idx + 1));
136                         }
137                         String JavaDoc thisHost = firstHost;
138                         do {
139                             if (hostService.getHost().equals(thisHost)) {
140                                 hostOk = true;
141                             } else {
142                                 if (it.hasNext()) {
143                                     thisHost = (String JavaDoc) it.next();
144                                 }
145                             }
146                         } while (!hostOk && it.hasNext());
147                     }
148                     if (!hostOk) {
149                         if (action.equals("redirect")) {
150                             String JavaDoc path = (request.isSecure() ? "https" : "http") + "://" + firstHost;
151                             if (ContextHolder.getContext().getPort() != 443) {
152                                 path += ":" + ContextHolder.getContext().getPort();
153                             }
154                             path += Util.getOriginalRequest(request);
155                             session.invalidate();
156                             response.sendRedirect(path);
157                             return;
158                         } else if (action.equals("error")) {
159                             response.sendError(HttpServletResponse.SC_NOT_FOUND);
160                             return;
161                         } else if (action.equals("disconnect")) {
162                             response.getOutputStream().close();
163                             return;
164                         }
165                     }
166                 }
167             } else {
168                 // We should never timeout during setup / installation
169
session.setMaxInactiveInterval(Integer.MAX_VALUE);
170             }
171
172             // Set the default locale
173
setDefaultLocale(request, session);
174
175             CoreServlet.getServlet().fireCoreEvent(new NewHTTPSessionEvent(this, request, response));
176         }
177
178         /** Repopulate any messages from {@link RedirectWithMessages} */
179         RedirectWithMessages.repopulate(request);
180
181         try {
182             super.process(request, response);
183         } catch (ServletException JavaDoc se) {
184             /*
185              * TODO This hack is so we can redirect to the logon page if the
186              * user tries to commit a form after their session has timed out.
187              * Find a better way
188              */

189             if (se.getMessage() != null && se.getMessage().indexOf("BeanUtils.populate") != -1) {
190                 log.error("User probably commited a form after their session had timed out.", se);
191                 log.error("Cause.", se.getRootCause());
192                 request.getSession().getServletContext().getRequestDispatcher("/showHome.do").forward(request, response);
193             } else {
194                 log.error("Error processing request. ", se);
195                 throw se;
196             }
197         }
198     }
199
200     /* (non-Javadoc)
201      * @see org.apache.struts.tiles.TilesRequestProcessor#doForward(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
202      */

203     @Override JavaDoc
204     protected void doForward(String JavaDoc uri, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws IOException JavaDoc,
205                     ServletException JavaDoc {
206         if (request.getAttribute(TaskHttpServletRequest.ATTR_TASK_FORWARD) != null) {
207             log.warn("Not forwarding as part of task");
208         } else {
209             super.doForward(uri, request, response);
210         }
211     }
212
213     private void setDefaultLocale(HttpServletRequest JavaDoc request, HttpSession JavaDoc session) {
214         String JavaDoc defaultLocale = Property.getProperty(new SystemConfigKey("ui.defaultLanguage"));
215         try {
216             Cookie JavaDoc[] c = request.getCookies();
217             if (c != null) {
218                 for (int i = 0; i < c.length; i++) {
219                     if (c[i].getName().equals(System.getProperty("sslexplorer.cookie", "SSLX_SSESHID") + "_LANG")) {
220                         defaultLocale = c[i].getValue();
221                         break;
222                     }
223                 }
224             }
225             Locale JavaDoc locale;
226             if(Util.isNullOrTrimmedBlank(defaultLocale))
227                 locale = Locale.getDefault();
228             else {
229                 /* We do our own parsing of the locale string because java Locale
230                  * changes the case!
231                  */

232                 StringTokenizer JavaDoc t = new StringTokenizer JavaDoc(defaultLocale, "_");
233                 String JavaDoc lang = t.nextToken();
234                 String JavaDoc country = t.hasMoreTokens() ? t.nextToken() : "";
235                 String JavaDoc variant = t.hasMoreTokens() ? t.nextToken() : "";
236                 locale = new Locale JavaDoc(lang, country, variant);
237             }
238             session.setAttribute(Globals.LOCALE_KEY, locale);
239         } catch (Exception JavaDoc e) {
240             log.error("Failed to set default locale.", e);
241         }
242     }
243     
244     @Override JavaDoc
245     protected ActionForward processActionPerform(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response, Action action, ActionForm form, ActionMapping mapping) throws IOException JavaDoc, ServletException JavaDoc {
246                 
247         ActionForward actionForward = super.processActionPerform(request, response, action, form, mapping);
248         if(actionForward != null && request.getAttribute(TaskHttpServletRequest.ATTR_TASK) != null) {
249             request.setAttribute(TaskHttpServletRequest.ATTR_TASK_FORWARD, actionForward);
250         }
251
252         // Get any page tasks for this page
253
String JavaDoc servletPath = request.getServletPath();
254         if (servletPath.startsWith("/") && servletPath.endsWith(".do")) {
255             servletPath = servletPath.substring(1, servletPath.length() - 3);
256             MenuTree pageTaskMenuTree = NavigationManager.getMenuTree(PageTaskMenuTree.PAGE_TASK_MENU_TREE);
257             MenuItem pageTasks = pageTaskMenuTree.getMenuItem(servletPath);
258             if (pageTasks != null) {
259                 request.setAttribute(Constants.PAGE_TASKS, pageTaskMenuTree.rebuildMenus(pageTasks, request));
260             } else {
261                 request.removeAttribute(Constants.PAGE_TASKS);
262             }
263             MenuTree toolBarMenuTree = NavigationManager.getMenuTree(ToolBarMenuTree.TOOL_BAR_MENU_TREE);
264             MenuItem toolBarItems = toolBarMenuTree.getMenuItem(servletPath);
265             if (toolBarItems != null) {
266                 request.setAttribute(Constants.TOOL_BAR_ITEMS, toolBarMenuTree.rebuildMenus(toolBarItems, request));
267             } else {
268                 request.removeAttribute(Constants.TOOL_BAR_ITEMS);
269             }
270         } else {
271             request.removeAttribute(Constants.PAGE_TASKS);
272             request.removeAttribute(Constants.TOOL_BAR_ITEMS);
273         }
274         
275         
276         processActionMessages(request, response);
277         return actionForward;
278     }
279
280     @Override JavaDoc
281     protected boolean processValidate(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response, ActionForm form, ActionMapping mapping) throws IOException JavaDoc, ServletException JavaDoc {
282     
283         
284         boolean validated = super.processValidate(request, response, form, mapping);
285         if(!validated) {
286             processActionMessages(request, response);
287         }
288         return validated;
289     }
290
291     private static void processActionMessages(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) {
292         if (isRunningUnitTests()) {
293             addHeader(request, response, "unitTestMessages", Globals.MESSAGE_KEY);
294             addHeader(request, response, "unitTestErrors", Globals.ERROR_KEY);
295         }
296     }
297
298     private static void addHeader(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response, String JavaDoc headerName, String JavaDoc key) {
299         String JavaDoc actionMessages = getActionMessages(request, key);
300         if (actionMessages.length() != 0) {
301                 response.setHeader(headerName, actionMessages);
302         }
303     }
304     
305     private static String JavaDoc getActionMessages(HttpServletRequest JavaDoc request, String JavaDoc key) {
306         ActionMessages messages = (ActionMessages) request.getAttribute(key);
307         if (messages != null) {
308             StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
309             for (Iterator JavaDoc itr = messages.get(); itr.hasNext();) {
310                 ActionMessage next = (ActionMessage) itr.next();
311                 buffer.append(next.getKey()).append(",");
312             }
313             return buffer.toString();
314         }
315         return "";
316     }
317     
318     private static boolean isRunningUnitTests() {
319         String JavaDoc isRunningUnitTests = System.getProperty("sslexplorer.testing", "false");
320         return Boolean.valueOf(isRunningUnitTests);
321     }
322 }
Popular Tags