i18n-feature based on kellans proposal implemented. the resource-bundles are located...
[mir.git] / source / Mir.java
1 import java.io.*;
2 import java.util.*;
3 import java.net.*;
4 import java.lang.reflect.*;
5 import javax.servlet.*;
6 import javax.servlet.http.*;
7 import javax.servlet.UnavailableException;
8 import java.sql.*;
9
10 import freemarker.template.*;
11
12 import mir.misc.*;
13 import mir.servlet.*;
14 import mir.storage.StorageObjectException;
15
16 import mircoders.servlet.*;
17 import mircoders.module.*;
18 import mircoders.entity.*;
19 import mircoders.storage.*;
20
21 /**
22  *  Mir.java - main servlet, that dispatches to servletmodules
23  *
24  *  @author RK 1999-2001
25  *
26  */
27
28
29 public class Mir extends AbstractServlet {
30
31   private static ModuleUsers      usersModule=null;
32   private static ModuleMessage    messageModule=null;
33   private final static HashMap    servletModuleInstanceHash = new HashMap();
34
35   public HttpSession session;
36
37   public void doGet(HttpServletRequest req, HttpServletResponse res)
38     throws ServletException, IOException {
39     doPost(req,res);
40   }
41
42   public void doPost(HttpServletRequest req, HttpServletResponse res)
43     throws ServletException, IOException, UnavailableException {
44
45     long            startTime = System.currentTimeMillis();
46     long            sessionConnectTime=0;
47     String          http="";
48
49     // get the configration
50     if(getServletContext().getAttribute("mir.confed") == null) {
51       getConfig(req);
52     }
53     MirConfig.setServletName(getServletName());
54
55     session = req.getSession(true);
56
57     if (req.getServerPort() == 443) http="https"; else http="http";
58     res.setContentType("text/html");
59     String moduleName = req.getParameter("module");
60
61     if(session.getAttribute("Language")==null){
62       setLanguage(session,getAcceptLanguage(req));
63     }
64
65     /** @todo for cleanup and readability this should be moved to
66      *  method loginIfNecessary() */
67
68     // Authentifizierung
69     if (moduleName!=null && moduleName.equals("login")) {
70       String user=req.getParameter("login");
71       String passwd= req.getParameter("password");
72       String lang = req.getParameter("lang");
73       theLog.printDebugInfo("--login: evaluating for user: "+user);
74       EntityUsers userEntity = allowedUser(user,passwd);
75       if (userEntity==null) {
76         // login failed: redirecting to login
77         theLog.printWarning("--login: failed!");
78         _sendLoginPage(res,req,res.getWriter());
79         return;
80       } else {
81         // login successful
82
83         //if accept-language!=selected language change language
84         if(!getLanguage(req,session).equals(lang)){
85           setLanguage(session,lang);
86         }
87
88         theLog.printInfo("--login: successful! setting uid: " + userEntity.getId());
89         session.setAttribute("login.uid", userEntity);
90         theLog.printDebugInfo("--login: trying to retrieve login.target");
91         String target = (String)session.getAttribute("login.target");
92
93         if (target != null) {
94           theLog.printDebugInfo("Redirect: "+target);
95           int serverPort = req.getServerPort();
96           String redirect = "";
97           String redirectString ="";
98
99
100           if(serverPort==80){
101             redirect=res.encodeURL(http + "://" + req.getServerName() + target);
102             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
103                     + redirect
104                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
105           } else {
106             redirect=res.encodeURL(http + "://" + req.getServerName() + ":" +req.getServerPort() + target);
107             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
108                     + redirect
109                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
110           }
111           res.getWriter().println(redirectString);
112
113
114           //res.sendRedirect(redirect);
115
116         } else {
117           // redirecting to default target
118           theLog.printDebugInfo("--login: no target - redirecting to default");
119           _sendStartPage(res,req,res.getWriter(),userEntity);
120         }
121         return;
122       } // if login succesful
123     } // if login
124
125     if (moduleName!=null && moduleName.equals("logout")) {
126       theLog.printDebugInfo("--logout");
127       session.invalidate();
128       _sendLoginPage(res,req,res.getWriter());
129       return;
130     }
131
132     // Check if authed!
133     EntityUsers userEntity = (EntityUsers)session.getAttribute("login.uid");
134     if (userEntity == null) {
135       // redirect to loginpage
136       String redirectString = req.getRequestURI();
137       String queryString = req.getQueryString();
138       if (queryString!=null && !queryString.equals("")) {
139         redirectString += "?" + req.getQueryString();
140         theLog.printDebugInfo("STORING: " + redirectString);
141         session.setAttribute("login.target", redirectString);
142       }
143       _sendLoginPage(res,req,res.getWriter());
144       return;
145     }
146
147     // If no module is specified goto standard startpage
148     if (moduleName == null || moduleName.equals("")) {
149       theLog.printDebugInfo("no module: redirect to standardpage");
150       _sendStartPage(res,req, res.getWriter(),userEntity);
151       return;
152     }
153     // end of auth
154
155     // From now on regular dispatching...
156     try {
157       // get servletmodule by parameter and continue with dispacher
158       ServletModule smod = getServletModuleForName(moduleName);
159       ServletModuleDispatch.dispatch(smod,req,res);
160     }
161     catch (ServletModuleException e) {
162                         handleError(req, res, res.getWriter(),
163                                                                         "ServletException in Module " + moduleName + " -- " + e.toString());
164                 }
165     catch (ServletModuleUserException e) {
166       handleUserError(req,res,res.getWriter(), "User error" + e.toString());
167     }
168
169     // timing...
170     sessionConnectTime = System.currentTimeMillis() - startTime;
171     theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
172   }
173
174
175   /**
176    *  Private method getServletModuleForName returns ServletModule
177    *  from Cache
178    *
179    * @return ServletModule
180    *
181    */
182   private static ServletModule getServletModuleForName(String moduleName)
183     throws ServletModuleException {
184
185     // Instance in Map ?
186     if (!servletModuleInstanceHash.containsKey(moduleName)) {
187       // was not found in hash...
188       try {
189         Class theServletModuleClass=null;
190         try {
191           // first we try to get ServletModule from stern.che3.servlet
192           theServletModuleClass = Class.forName("mircoders.servlet.ServletModule" + moduleName);
193         } catch (ClassNotFoundException e) {
194           // on failure, we try to get it from lib-layer
195           theServletModuleClass = Class.forName("mir.servlet.ServletModule"+ moduleName);
196         }
197         Method m = theServletModuleClass.getMethod("getInstance", null);
198         ServletModule smod = (ServletModule)m.invoke(null, null);
199         // we put it into map for further reference
200         servletModuleInstanceHash.put(moduleName,smod);
201         return smod;
202       } catch (Exception e) {
203         throw new ServletModuleException("*** error resolving classname for " +
204                                           moduleName +" -- "+ e.toString());
205       }
206     }
207     else return (ServletModule)servletModuleInstanceHash.get(moduleName);
208   }
209
210
211   private void handleError(HttpServletRequest req, HttpServletResponse res,
212                                                                                                          PrintWriter out, String errorString) {
213
214     try {
215       theLog.printError(errorString);
216       SimpleHash modelRoot = new SimpleHash();
217       modelRoot.put("errorstring", new SimpleScalar(errorString));
218       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
219       HTMLTemplateProcessor.process(res,MirConfig.getProp("Mir.ErrorTemplate"),
220                                                                                                                                                 modelRoot,out,req.getLocale());
221       out.close();
222     }
223     catch (Exception e) {
224       System.err.println("Error in ErrorTemplate");
225     }
226   }
227
228   private void handleUserError(HttpServletRequest req, HttpServletResponse res,
229                                                                                                                          PrintWriter out, String errorString) {
230     try {
231       theLog.printError(errorString);
232       SimpleHash modelRoot = new SimpleHash();
233       modelRoot.put("errorstring", new SimpleScalar(errorString));
234       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
235       HTMLTemplateProcessor.process(res,MirConfig.getProp("Mir.UserErrorTemplate"),
236                                                                                                                                                 modelRoot,out, req.getLocale());
237       out.close();
238     }
239     catch (Exception e) {
240       System.err.println("Fehler in UserErrorTemplate");
241     }
242
243   }
244   /**
245    *  evaluate login for user / password
246    */
247   protected EntityUsers allowedUser(String user, String password) {
248     try {
249       if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
250       return usersModule.getUserForLogin(user, password);
251     } catch(Exception e) {
252       theLog.printDebugInfo(e.toString());
253       e.printStackTrace();
254       return null;
255     }
256   }
257
258   // Redirect-methods
259   private void _sendLoginPage(HttpServletResponse res,HttpServletRequest req, PrintWriter out) {
260     String loginTemplate = "login.template";
261     String sessionUrl=res.encodeURL("");
262     //session = req.getSession(true);
263     try {
264       theLog.printDebugInfo("login: "+lang);
265       if(lang==null){
266         lang=getAcceptLanguage(req);
267       }
268       SimpleHash mergeData = new SimpleHash();
269       mergeData.put("session",sessionUrl);
270       HTMLTemplateProcessor.process(res, lang+"/"+loginTemplate, mergeData,
271                                                                                                                                                 out, req.getLocale());
272     } catch(HTMLParseException e) {
273       handleError(req, res, out, "Error in logintemplate.");
274     }
275   }
276
277   private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
278     String startTemplate = "start_admin.template";
279     String sessionUrl=res.encodeURL("");
280     try {
281       // merge with logged in user and messages
282       SimpleHash mergeData = new SimpleHash();
283       mergeData.put("session",sessionUrl);
284       mergeData.put("login_user", userEntity);
285       if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
286       mergeData.put("messages", messageModule.getByWhereClause(null, "webdb_create desc",0,10));
287       HTMLTemplateProcessor.process(res, getLanguage(req,session)+"/"+startTemplate,
288                                                                                                                                                 mergeData, out, req.getLocale());
289     }
290     catch(Exception e) {
291       handleError(req, res, out, "error while trying to send startpage. " + e.toString());
292     }
293   }
294
295   public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
296
297 }
298