2 * Copyright (C) 2001, 2002 The Mir-coders group
\r
4 * This file is part of Mir.
\r
6 * Mir is free software; you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation; either version 2 of the License, or
\r
9 * (at your option) any later version.
\r
11 * Mir is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with Mir; if not, write to the Free Software
\r
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
20 * In addition, as a special exception, The Mir-coders gives permission to link
\r
21 * the code of this program with any library licensed under the Apache Software License,
\r
22 * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
\r
23 * (or with modified versions of the above that use the same license as the above),
\r
24 * and distribute linked combinations including the two. You must obey the
\r
25 * GNU General Public License in all respects for all of the code used other than
\r
26 * the above mentioned libraries. If you modify this file, you may extend this
\r
27 * exception to your version of the file, but you are not obligated to do so.
\r
28 * If you do not wish to do so, delete this exception statement from your version.
\r
31 import java.io.IOException;
\r
32 import java.lang.reflect.Method;
\r
34 import java.util.HashMap;
\r
35 import java.util.Iterator;
\r
36 import java.util.List;
\r
37 import java.util.Locale;
\r
38 import java.util.Map;
\r
39 import java.util.Vector;
\r
40 import javax.servlet.*;
\r
41 import javax.servlet.ServletException;
\r
42 import javax.servlet.UnavailableException;
\r
43 import javax.servlet.http.*;
\r
44 import javax.servlet.http.HttpServletResponse;
\r
45 import javax.servlet.http.HttpSession;
\r
47 import org.apache.struts.util.MessageResources;
\r
48 import mir.config.MirPropertiesConfiguration;
\r
49 import mir.servlet.AbstractServlet;
\r
50 import mir.servlet.ServletModule;
\r
51 import mir.servlet.ServletModuleDispatch;
\r
52 import mir.servlet.ServletModuleExc;
\r
53 import mir.servlet.ServletModuleUserExc;
\r
54 import mir.util.ExceptionFunctions;
\r
55 import mir.util.StringRoutines;
\r
56 import mircoders.entity.EntityUsers;
\r
57 import mircoders.global.MirGlobal;
\r
58 import mircoders.module.ModuleMessage;
\r
59 import mircoders.module.ModuleUsers;
\r
60 import mircoders.servlet.ServletHelper;
\r
61 import mircoders.storage.DatabaseUsers;
\r
67 * Mir.java - main servlet, that dispatches to servletmodules
\r
69 * @author $Author: zapata $
\r
70 * @version $Id: Mir.java,v 1.49.2.7 2003/09/04 03:11:42 zapata Exp $
\r
73 public class Mir extends AbstractServlet {
\r
74 private static ModuleUsers usersModule = null;
\r
75 private static ModuleMessage messageModule = null;
\r
76 private final static Map servletModuleInstanceHash = new HashMap();
\r
77 private static Locale fallbackLocale = null;
\r
79 private static List loginLanguages = null;
\r
81 protected List getLoginLanguages() throws ServletException {
\r
82 synchronized (Mir.class) {
\r
84 if (loginLanguages == null) {
\r
85 MessageResources messageResources =
\r
86 MessageResources.getMessageResources("bundles.adminlocal");
\r
87 MessageResources messageResources2 =
\r
88 MessageResources.getMessageResources("bundles.admin");
\r
91 StringRoutines.splitString(MirGlobal.config().getString("Mir.Login.Languages", "en"), ";");
\r
93 loginLanguages = new Vector();
\r
95 Iterator i = languages.iterator();
\r
97 while (i.hasNext()) {
\r
98 String code = (String) i.next();
\r
99 Locale locale = new Locale(code, "");
\r
100 String name = messageResources.getMessage(locale, "languagename");
\r
102 if (name == null) {
\r
103 name = messageResources2.getMessage(locale, "languagename");
\r
106 if (name == null) {
\r
110 Map record = new HashMap();
\r
111 record.put("name", name);
\r
112 record.put("code", code);
\r
113 loginLanguages.add(record);
\r
117 return loginLanguages;
\r
119 catch (Throwable t) {
\r
120 throw new ServletException(t.getMessage());
\r
125 public void init(ServletConfig config) throws ServletException {
\r
126 super.init(config);
\r
128 usersModule = new ModuleUsers(DatabaseUsers.getInstance());
\r
131 protected String getDefaultLanguage(HttpServletRequest aRequest) {
\r
132 String defaultlanguage =
\r
133 MirGlobal.config().getString("Mir.Login.DefaultLanguage", "");
\r
135 if (defaultlanguage.length() == 0) {
\r
136 Locale locale = aRequest.getLocale();
\r
137 defaultlanguage = locale.getLanguage();
\r
140 return defaultlanguage;
\r
143 protected synchronized Locale getFallbackLocale() throws ServletException {
\r
145 if (fallbackLocale == null) {
\r
146 fallbackLocale = new Locale(MirPropertiesConfiguration.instance().getString("Mir.Admin.FallbackLanguage", "en"), "");
\r
149 catch (Throwable t) {
\r
150 throw new ServletException(t.getMessage());
\r
153 return fallbackLocale;
\r
156 public EntityUsers checkCredentials(HttpServletRequest aRequest) throws ServletException {
\r
158 EntityUsers user = ServletHelper.getUser(aRequest);
\r
160 String username = aRequest.getParameter("login");
\r
161 String password = aRequest.getParameter("password");
\r
163 if (username != null && password != null) {
\r
164 user = usersModule.getUserForLogin(username, password);
\r
167 ServletHelper.setUser(aRequest, user);
\r
168 aRequest.getSession().setAttribute("sessiontracker", new SessionTracker(username));
\r
174 catch (Throwable t) {
\r
175 t.printStackTrace();
\r
177 throw new ServletException(t.toString());
\r
181 public void process(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletException, IOException, UnavailableException {
\r
183 long startTime = System.currentTimeMillis();
\r
184 long sessionConnectTime = 0;
\r
186 HttpSession session = aRequest.getSession(true);
\r
187 setNoCaching(aResponse);
\r
188 Locale locale = new Locale(getDefaultLanguage(aRequest), "");
\r
189 aResponse.setContentType("text/html; charset=" +
\r
191 getString("Mir.DefaultHTMLCharset", "UTF-8"));
\r
193 EntityUsers userEntity = checkCredentials(aRequest);
\r
195 if (userEntity == null) {
\r
196 String queryString = aRequest.getQueryString();
\r
198 if ( (queryString != null) && (queryString.length() != 0) && session.getAttribute("login.target") == null &&
\r
199 (aRequest.getParameter("module")==null ||
\r
200 (!aRequest.getParameter("module").equals("login") && !aRequest.getParameter("module").equals("logout")))) {
\r
201 session.setAttribute("login.target", queryString);
\r
204 _sendLoginPage(aResponse, aRequest);
\r
207 String moduleName = aRequest.getParameter("module");
\r
208 checkLanguage(session, aRequest);
\r
210 if ( ( (moduleName == null) || moduleName.equals(""))) {
\r
211 moduleName="Admin";
\r
215 if (moduleName.equals("login")) {
\r
216 String target = (String) session.getAttribute("login.target");
\r
218 if (target != null) {
\r
219 ServletHelper.redirect(aResponse, target);
\r
222 ServletHelper.redirect(aResponse, "");
\r
225 else if (moduleName.equals("logout")) {
\r
226 logger.info(userEntity.getValue("login") + " has logged out");
\r
227 session.invalidate();
\r
228 _sendLoginPage(aResponse, aRequest);
\r
233 ServletModule servletModule = getServletModuleForName(moduleName);
\r
234 ServletModuleDispatch.dispatch(servletModule, aRequest, aResponse);
\r
236 sessionConnectTime = System.currentTimeMillis() - startTime;
\r
237 logger.info("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
\r
239 catch (Throwable e) {
\r
240 Throwable cause = ExceptionFunctions.traceCauseException(e);
\r
242 if (cause instanceof ServletModuleUserExc)
\r
243 handleUserError(aRequest, aResponse, (ServletModuleUserExc) cause);
\r
245 handleError(aRequest, aResponse, cause);
\r
248 if (aRequest.getParameter("killsession")!=null)
\r
249 aRequest.getSession().invalidate();
\r
253 catch (Throwable t) {
\r
254 t.printStackTrace();
\r
256 throw new ServletException(t.toString());
\r
261 * caching routine to get a module for a module name
\r
263 * @param moduleName the module name
\r
264 * @return the requested module
\r
265 * @throws ServletModuleExc
\r
268 private static ServletModule getServletModuleForName(String moduleName) throws ServletModuleExc {
\r
269 // Instance in Map ?
\r
270 if (!servletModuleInstanceHash.containsKey(moduleName)) {
\r
271 // was not found in hash...
\r
273 Class theServletModuleClass = null;
\r
276 // first we try to get ServletModule from stern.che3.servlet
\r
277 theServletModuleClass =
\r
278 Class.forName("mircoders.servlet.ServletModule" + moduleName);
\r
280 catch (ClassNotFoundException e) {
\r
281 // on failure, we try to get it from lib-layer
\r
282 theServletModuleClass =
\r
283 Class.forName("mir.servlet.ServletModule" + moduleName);
\r
286 Method m = theServletModuleClass.getMethod("getInstance", null);
\r
287 ServletModule smod = (ServletModule) m.invoke(null, null);
\r
289 // we put it into map for further reference
\r
290 servletModuleInstanceHash.put(moduleName, smod);
\r
294 catch (Exception e) {
\r
295 throw new ServletModuleExc("*** error resolving classname for " + moduleName + " -- " + e.getMessage());
\r
299 return (ServletModule) servletModuleInstanceHash.get(moduleName);
\r
303 private void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse, ServletModuleUserExc anException) {
\r
305 logger.info("user error: " + anException.getMessage());
\r
307 Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale()});
\r
309 MessageResources messages = MessageResources.getMessageResources("bundles.admin");
\r
310 responseData.put("errorstring", messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters()));
\r
311 responseData.put("date", new GregorianCalendar().getTime());
\r
313 ServletHelper.generateResponse(aResponse.getWriter(), responseData, MirPropertiesConfiguration.instance().getString("Mir.UserErrorTemplate"));
\r
315 catch (Throwable e) {
\r
316 logger.error("Error handling user error" + e.toString());
\r
320 private void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse, Throwable anException) {
\r
322 logger.error("error: " + anException);
\r
324 Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale()});
\r
326 responseData.put("errorstring", anException.toString());
\r
327 responseData.put("date", new GregorianCalendar().getTime());
\r
329 ServletHelper.generateResponse(aResponse.getWriter(), responseData, MirPropertiesConfiguration.instance().getString("Mir.ErrorTemplate"));
\r
331 catch (Throwable e) {
\r
332 logger.error("Error handling error: " + e.toString());
\r
336 // Redirect-methods
\r
337 private void _sendLoginPage(HttpServletResponse aResponse, HttpServletRequest aRequest) {
\r
338 String loginTemplate = configuration.getString("Mir.LoginTemplate");
\r
341 Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale()});
\r
343 responseData.put("defaultlanguage", getDefaultLanguage(aRequest));
\r
344 responseData.put("languages", getLoginLanguages());
\r
346 ServletHelper.generateResponse(aResponse.getWriter(), responseData, loginTemplate);
\r
348 catch (Throwable e) {
\r
349 handleError(aRequest, aResponse, e);
\r
353 public String getServletInfo() {
\r
354 return "Mir " + configuration.getString("Mir.Version");
\r
357 private class SessionTracker implements HttpSessionBindingListener {
\r
358 private String name;
\r
360 public SessionTracker(String aUserName) {
\r
364 public void valueBound(HttpSessionBindingEvent anEvent) {
\r
365 MirGlobal.registerLogin(name);
\r
368 public void valueUnbound(HttpSessionBindingEvent anEvent) {
\r
369 MirGlobal.registerLogout(name);
\r