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.ServletConfig;
\r
41 import javax.servlet.ServletException;
\r
42 import javax.servlet.UnavailableException;
\r
43 import javax.servlet.http.HttpServletRequest;
\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.50 2003/09/03 18:29:01 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
172 catch (Throwable t) {
\r
173 t.printStackTrace();
\r
175 throw new ServletException(t.toString());
\r
179 public void process(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletException, IOException, UnavailableException {
\r
181 long startTime = System.currentTimeMillis();
\r
182 long sessionConnectTime = 0;
\r
184 HttpSession session = aRequest.getSession(true);
\r
185 setNoCaching(aResponse);
\r
186 Locale locale = new Locale(getDefaultLanguage(aRequest), "");
\r
187 aResponse.setContentType("text/html; charset=" +
\r
189 getString("Mir.DefaultHTMLCharset", "UTF-8"));
\r
191 EntityUsers userEntity = checkCredentials(aRequest);
\r
193 if (userEntity == null) {
\r
194 String queryString = aRequest.getQueryString();
\r
196 if ( (queryString != null) && (queryString.length() != 0) && session.getAttribute("login.target") == null &&
\r
197 (aRequest.getParameter("module")==null ||
\r
198 (!aRequest.getParameter("module").equals("login") && !aRequest.getParameter("module").equals("logout")))) {
\r
199 session.setAttribute("login.target", queryString);
\r
202 _sendLoginPage(aResponse, aRequest);
\r
205 String moduleName = aRequest.getParameter("module");
\r
206 checkLanguage(session, aRequest);
\r
208 if ( ( (moduleName == null) || moduleName.equals(""))) {
\r
209 moduleName="Admin";
\r
213 if (moduleName.equals("login")) {
\r
214 String target = (String) session.getAttribute("login.target");
\r
216 if (target != null) {
\r
217 ServletHelper.redirect(aResponse, target);
\r
220 ServletHelper.redirect(aResponse, "");
\r
223 else if (moduleName.equals("logout")) {
\r
224 logger.info(userEntity.getValue("login") + " has logged out");
\r
225 session.invalidate();
\r
226 _sendLoginPage(aResponse, aRequest);
\r
231 ServletModule servletModule = getServletModuleForName(moduleName);
\r
232 ServletModuleDispatch.dispatch(servletModule, aRequest, aResponse);
\r
234 sessionConnectTime = System.currentTimeMillis() - startTime;
\r
235 logger.info("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
\r
237 catch (Throwable e) {
\r
238 Throwable cause = ExceptionFunctions.traceCauseException(e);
\r
240 if (cause instanceof ServletModuleUserExc)
\r
241 handleUserError(aRequest, aResponse, (ServletModuleUserExc) cause);
\r
243 handleError(aRequest, aResponse, cause);
\r
246 if (aRequest.getParameter("killsession")!=null)
\r
247 aRequest.getSession().invalidate();
\r
251 catch (Throwable t) {
\r
252 t.printStackTrace();
\r
254 throw new ServletException(t.toString());
\r
259 * caching routine to get a module for a module name
\r
261 * @param moduleName the module name
\r
262 * @return the requested module
\r
263 * @throws ServletModuleExc
\r
266 private static ServletModule getServletModuleForName(String moduleName) throws ServletModuleExc {
\r
267 // Instance in Map ?
\r
268 if (!servletModuleInstanceHash.containsKey(moduleName)) {
\r
269 // was not found in hash...
\r
271 Class theServletModuleClass = null;
\r
274 // first we try to get ServletModule from stern.che3.servlet
\r
275 theServletModuleClass =
\r
276 Class.forName("mircoders.servlet.ServletModule" + moduleName);
\r
278 catch (ClassNotFoundException e) {
\r
279 // on failure, we try to get it from lib-layer
\r
280 theServletModuleClass =
\r
281 Class.forName("mir.servlet.ServletModule" + moduleName);
\r
284 Method m = theServletModuleClass.getMethod("getInstance", null);
\r
285 ServletModule smod = (ServletModule) m.invoke(null, null);
\r
287 // we put it into map for further reference
\r
288 servletModuleInstanceHash.put(moduleName, smod);
\r
292 catch (Exception e) {
\r
293 throw new ServletModuleExc("*** error resolving classname for " + moduleName + " -- " + e.getMessage());
\r
297 return (ServletModule) servletModuleInstanceHash.get(moduleName);
\r
301 private void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse, ServletModuleUserExc anException) {
\r
303 logger.info("user error: " + anException.getMessage());
\r
305 Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale()});
\r
307 MessageResources messages = MessageResources.getMessageResources("bundles.admin");
\r
308 responseData.put("errorstring", messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters()));
\r
309 responseData.put("date", new GregorianCalendar().getTime());
\r
311 ServletHelper.generateResponse(aResponse.getWriter(), responseData, MirPropertiesConfiguration.instance().getString("Mir.UserErrorTemplate"));
\r
313 catch (Throwable e) {
\r
314 logger.error("Error handling user error" + e.toString());
\r
318 private void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse, Throwable anException) {
\r
320 logger.error("error: " + anException);
\r
322 Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale()});
\r
324 responseData.put("errorstring", anException.toString());
\r
325 responseData.put("date", new GregorianCalendar().getTime());
\r
327 ServletHelper.generateResponse(aResponse.getWriter(), responseData, MirPropertiesConfiguration.instance().getString("Mir.ErrorTemplate"));
\r
329 catch (Throwable e) {
\r
330 logger.error("Error handling error: " + e.toString());
\r
334 // Redirect-methods
\r
335 private void _sendLoginPage(HttpServletResponse aResponse, HttpServletRequest aRequest) {
\r
336 String loginTemplate = configuration.getString("Mir.LoginTemplate");
\r
339 Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale()});
\r
341 responseData.put("defaultlanguage", getDefaultLanguage(aRequest));
\r
342 responseData.put("languages", getLoginLanguages());
\r
344 ServletHelper.generateResponse(aResponse.getWriter(), responseData, loginTemplate);
\r
346 catch (Throwable e) {
\r
347 handleError(aRequest, aResponse, e);
\r
351 public String getServletInfo() {
\r
352 return "Mir " + configuration.getString("Mir.Version");
\r