debugging DatabaseCache
[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 java.sql.*;
8
9 import freemarker.template.*;
10
11 import mir.misc.*;
12 import mir.servlet.*;
13
14 import mircoders.servlet.*;
15 import mircoders.module.*;
16 import mircoders.entity.*;
17 import mircoders.storage.*;
18
19 /**
20  *  Mir.java - main servlet, that dispatches to servletmodules
21  *
22  *  @author RK 1999-2001
23  *
24  */
25
26
27 public class Mir extends AbstractServlet
28 {
29
30   private static ModuleUsers usersModule=null;
31   private static ModuleMessage messageModule=null;
32   private static boolean confed=false;
33   public HttpSession session;
34
35
36   public void doGet(HttpServletRequest req, HttpServletResponse res)
37     throws ServletException, IOException {
38     doPost(req,res);
39   }
40
41   public void doPost(HttpServletRequest req, HttpServletResponse res)
42     throws ServletException, IOException {
43
44     long            startTime = (new java.util.Date()).getTime();
45     Class           theServletModule;
46     ServletModule   smod;
47     long            sessionConnectTime=0;
48     String          http="";
49
50     // get the configration
51     if (!confed){
52       confed = getConfig(req);
53     }
54     MirConfig.setServletName(getServletName());
55
56     session = req.getSession(true);
57
58     if (req.getServerPort() == 443) http="https"; else http="http";
59     res.setContentType("text/html");
60     String moduleName = req.getParameter("module");
61
62     if(session.getAttribute("Language")==null){
63       setLanguage(session,getAcceptLanguage(req));
64     }
65
66     // Authentifizierung
67     if (moduleName!=null && moduleName.equals("login")) {
68       String user=req.getParameter("login");
69       String passwd= req.getParameter("password");
70       String lang = req.getParameter("lang");
71       theLog.printDebugInfo("--login: evaluating for user: "+user);
72       EntityUsers userEntity = allowedUser(user,passwd);
73       if (userEntity==null) {
74         // login failed: redirecting to login
75         theLog.printWarning("--login: failed!");
76         _sendLoginPage(res,req,res.getWriter());
77         return;
78       } else {
79         // login successful
80
81         //if accept-language!=selected language change language
82         if(!getLanguage(req,session).equals(lang)){
83           setLanguage(session,lang);
84         }
85
86         theLog.printInfo("--login: successful! setting uid: " + userEntity.getId());
87         session.setAttribute("login.uid", userEntity);
88         theLog.printDebugInfo("--login: trying to retrieve login.target");
89         String target = (String)session.getAttribute("login.target");
90
91         if (target != null) {
92           theLog.printDebugInfo("Redirect: "+target);
93           int serverPort = req.getServerPort();
94           String redirect = "";
95           String redirectString ="";
96
97
98           if(serverPort==80){
99             redirect=res.encodeURL(http + "://" + req.getServerName() + target);
100             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
101                     + redirect
102                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
103           } else {
104             redirect=res.encodeURL(http + "://" + req.getServerName() + ":" +req.getServerPort() + target);
105             redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
106                     + redirect
107                     + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
108           }
109           res.getWriter().println(redirectString);
110
111
112           //res.sendRedirect(redirect);
113
114         } else {
115           // redirecting to default target
116           theLog.printDebugInfo("--login: no target - redirecting to default");
117           _sendStartPage(res,req,res.getWriter(),userEntity);
118         }
119         return;
120       } // if login succesful
121     } // if login
122
123     if (moduleName!=null && moduleName.equals("logout")) {
124       theLog.printDebugInfo("--logout");
125       session.invalidate();
126       _sendLoginPage(res,req,res.getWriter());
127       return;
128     }
129
130     // Check if authed!
131     EntityUsers userEntity = (EntityUsers)session.getAttribute("login.uid");
132     if (userEntity == null) {
133       // redirect to loginpage
134       String redirectString = req.getRequestURI();
135       String queryString = req.getQueryString();
136       if (queryString!=null && !queryString.equals("")) {
137         redirectString += "?" + req.getQueryString();
138         theLog.printDebugInfo("STORING: " + redirectString);
139         session.setAttribute("login.target", redirectString);
140       }
141       _sendLoginPage(res,req,res.getWriter());
142       return;
143     }
144
145     // If no module is specified goto standard startpage
146     if (moduleName == null || moduleName.equals("")) {
147       theLog.printDebugInfo("no module: redirect to standardpage");
148       _sendStartPage(res,req, res.getWriter(),userEntity);
149       return;
150     }
151
152     //From now on regular dispatching...
153     try {
154       try {
155         theServletModule = Class.forName("mircoders.servlet.ServletModule" + moduleName);
156       } catch (ClassNotFoundException e) {
157         // searching servletmodule in mir.servlet-classes
158         theServletModule = Class.forName("mir.servlet.ServletModule" + moduleName);
159       }
160       //Instantiate the ServletModule
161       Method m = theServletModule.getMethod("getInstance",null);
162       smod = (ServletModule)m.invoke(null,null);
163       ServletModuleDispatch.dispatch(smod,req,res);
164     }
165     catch (NoSuchMethodException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " getInstance() not found."); }
166     catch (InvocationTargetException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " target not found."); }
167     catch (ClassNotFoundException e) { handleError(res, res.getWriter(), "ServletModule" + moduleName + " not found."); }
168     catch (IllegalArgumentException e) { handleError( res,res.getWriter(), "ServletModule" + moduleName + " not found."); }
169     catch (ServletModuleUserException e) {
170       handleUserError(res,res.getWriter(), e.getMsg());
171     }
172     catch (ServletModuleException e){ handleError(res,res.getWriter(), "ServletException in Module ServletModule" + moduleName + " -- " + e.toString()); }
173     catch (IllegalAccessException e){
174         handleError(res,res.getWriter(), "No access to class ServletModule" + moduleName + " -- " + e.toString()); }
175
176     // timing...
177     sessionConnectTime = new java.util.Date().getTime() - startTime;
178     theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
179   }
180
181   private void handleError(HttpServletResponse res, PrintWriter out, String errorString) {
182     try {
183       theLog.printError(errorString);
184       SimpleHash modelRoot = new SimpleHash();
185       modelRoot.put("errorstring", new SimpleScalar(errorString));
186       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
187       HTMLTemplateProcessor.process(res,MirConfig.getProp("Mir.ErrorTemplate"),modelRoot,out);
188       out.close();
189     }
190     catch (Exception e) {
191       System.err.println("Error in ErrorTemplate");
192     }
193   }
194
195   private void handleUserError(HttpServletResponse res,PrintWriter out, String errorString) {
196
197     try {
198       theLog.printError(errorString);
199       SimpleHash modelRoot = new SimpleHash();
200       modelRoot.put("errorstring", new SimpleScalar(errorString));
201       modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
202       HTMLTemplateProcessor.process(res,MirConfig.getProp("Mir.UserErrorTemplate"),modelRoot,out);
203       out.close();
204     }
205     catch (Exception e) {
206       System.err.println("Fehler in UserErrorTemplate");
207     }
208
209   }
210   /**
211    *  evaluate login for user / password
212    */
213   protected EntityUsers allowedUser(String user, String password) {
214     try {
215       if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
216       return usersModule.getUserForLogin(user, password);
217     }
218     catch(Exception e) { theLog.printDebugInfo(e.toString()); return null; }
219   }
220
221   // Redirect-methods
222   private void _sendLoginPage(HttpServletResponse res,HttpServletRequest req, PrintWriter out) {
223     String loginTemplate = "login.template";
224     String sessionUrl=res.encodeURL("");
225     //session = req.getSession(true);
226     try {
227       theLog.printDebugInfo("login: "+lang);
228       if(lang==null){
229         lang=getAcceptLanguage(req);
230       }
231       SimpleHash mergeData = new SimpleHash();
232       mergeData.put("session",sessionUrl);
233       HTMLTemplateProcessor.process(res,lang+"/"+loginTemplate, mergeData, out);
234     } catch(HTMLParseException e) {
235       handleError(res, out, "Error in logintemplate.");
236     }
237   }
238
239   private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
240     String startTemplate = "start_admin.template";
241     String sessionUrl=res.encodeURL("");
242     try {
243       // merge with logged in user and messages
244       SimpleHash mergeData = new SimpleHash();
245       mergeData.put("session",sessionUrl);
246       mergeData.put("login_user", userEntity);
247       if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
248       mergeData.put("messages", HTMLTemplateProcessor.makeSimpleList(messageModule.getByWhereClause(null, "webdb_create desc",0,10)));
249       HTMLTemplateProcessor.process(res,getLanguage(req,session)+"/"+startTemplate, mergeData,out);
250     }
251     catch(Exception e) {
252       handleError( res,out, "error while trying to send startpage. " + e.toString());
253     }
254   }
255
256   public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
257
258 }
259