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