Initial revision
[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 webdb.misc.*;
12 import webdb.servlet.*;
13
14 import mir.servlet.*;
15 import mir.module.*;
16 import mir.entity.*;
17 import mir.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
34
35         public void doGet(HttpServletRequest req, HttpServletResponse res)
36                 throws ServletException, IOException {
37                 doPost(req,res);
38         }
39
40         public void doPost(HttpServletRequest req, HttpServletResponse res)
41                 throws ServletException, IOException {
42
43                 long            startTime = (new java.util.Date()).getTime();
44                 Class           theServletModule;
45                 ServletModule   smod;
46                 long            sessionConnectTime=0;
47                 String          http="";
48
49                 // get the configration
50     if (!confed){
51       confed = getConfig(req);
52     }
53
54
55                 if (req.getServerPort() == 443) http="https";   else http="http";
56                 res.setContentType("text/html");
57                 String moduleName = req.getParameter("module");
58     HttpSession session = req.getSession(true);
59
60     if(session.getAttribute("Language")==null){
61       setLanguage(req,getAcceptLanguage(req));
62     }
63
64                 // Authentifizierung
65                 if (moduleName!=null && moduleName.equals("login")) {
66                         String user=req.getParameter("login");
67                         String passwd= req.getParameter("password");
68       String lang = req.getParameter("lang");
69                         theLog.printDebugInfo("--login: evaluating for user: "+user);
70                         EntityUsers userEntity = allowedUser(user,passwd);
71                         if (userEntity==null) {
72                                 // login failed: redirecting to login
73                                 theLog.printWarning("--login: failed!");
74                                 _sendLoginPage(req,res.getWriter());
75                                 return;
76                         }       else {
77                                 // login successful
78
79         //if accept-language!=selected language change language
80         if(!getLanguage(req).equals(lang)){
81           setLanguage(req,lang);
82         }
83
84                                 theLog.printInfo("--login: successful! setting uid: " + userEntity.getId());
85                                 session.setAttribute("login.uid", userEntity);
86                                 theLog.printDebugInfo("--login: trying to retrieve login.target");
87                                 String target = (String)session.getAttribute("login.target");
88                                 if (target != null) {
89                                         theLog.printDebugInfo("Redirect: "+target);
90                                         res.getWriter().println("<html><head><meta http-equiv=refresh content=\0421;URL="
91                                                                         + res.encodeURL(http +"://" + req.getServerName()+ target)
92                                                                         + "\"></head><body>going " + target + "</body></html>");
93                                 } else {
94                                         // redirecting to default target
95                                         //theLog.printDebugInfo("--login: no target - redirecting to default");
96                                         _sendStartPage(req, res.getWriter(),userEntity);
97                                 }
98                                 return;
99                         } // if login succesful
100                 } // if login
101
102                 if (moduleName!=null && moduleName.equals("logout")) {
103                         theLog.printDebugInfo("--logout");
104                         session.invalidate();
105                         _sendLoginPage(req,res.getWriter());
106                         return;
107                 }
108
109                 // Check if authed!
110                 EntityUsers userEntity = (EntityUsers)session.getAttribute("login.uid");
111                 if (userEntity == null) {
112                         // redirect to loginpage
113                         String redirectString = req.getRequestURI();
114                         if (req.getQueryString()!=null) redirectString += "?" + req.getQueryString();
115                         theLog.printDebugInfo("STORING: " + redirectString);
116                         session.setAttribute("login.target", redirectString);
117                         _sendLoginPage(req,res.getWriter());
118                         return;
119                 }
120
121                 // Bei blossem Serveltaufruf redirect auf Standardstarttemplate
122                 if (moduleName == null || moduleName.equals("")) {
123                         _sendStartPage(req, res.getWriter(),userEntity);
124                         return;
125                 }
126
127                 //From now on normal Dispatching...
128                 try {
129                         try {
130         theServletModule = Class.forName("mir.servlet.ServletModule" + moduleName);
131                         } catch (ClassNotFoundException e) {
132         // searching Servlet webdb.servlet-classes
133         theServletModule = Class.forName("webdb.servlet.ServletModule" + moduleName);
134                         }
135       //Instanciate the ServletModule
136                         Method m = theServletModule.getMethod("getInstance",null);
137                         smod = (ServletModule)m.invoke(null,null);
138                         ServletModuleDispatch.dispatch(smod,req,res);
139                 }
140                 catch (NoSuchMethodException e) { handleError( res.getWriter(), "ServletModule" + moduleName + " getInstance() nicht gefunden."); }
141                 catch (InvocationTargetException e) { handleError( res.getWriter(), "ServletModule" + moduleName + " target nicht gefunden."); }
142                 catch (ClassNotFoundException e) { handleError( res.getWriter(), "ServletModule" + moduleName + " nicht gefunden."); }
143                 catch (IllegalArgumentException e) { handleError( res.getWriter(), "ServletModule" + moduleName + " nicht gefunden."); }
144                 catch (ServletModuleException e){ handleError(res.getWriter(), "ServletException in Module ServletModule" + moduleName + " -- " + e.toString()); }
145                 catch (IllegalAccessException e){
146                                 handleError(res.getWriter(), "Kein Zugriff auf Klasse ServletModule" + moduleName + " -- " + e.toString()); }
147
148                 // timing...
149                 sessionConnectTime = new java.util.Date().getTime() - startTime;
150                 theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
151         }
152
153         private void handleError(PrintWriter out, String errorString) {
154                 try {
155                         theLog.printError(errorString);
156                         SimpleHash modelRoot = new SimpleHash();
157                         modelRoot.put("errorstring", new SimpleScalar(errorString));
158                         modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
159                         HTMLTemplateProcessor.process(Configuration.getProperty("Mir.ErrorTemplate"),modelRoot,out);
160                         out.close();
161                 }
162                 catch (Exception e) {
163                         System.err.println("Fehler in ErrorTemplate");
164                 }
165         }
166
167         /**
168          *  evaluate login for user / password
169          */
170         protected EntityUsers allowedUser(String user, String password) {
171                 try {
172                         if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
173                         return usersModule.getUserForLogin(user, password);
174                 }
175                 catch(Exception e) { theLog.printDebugInfo(e.toString()); return null; }
176         }
177
178         // Redirect-methods
179         private void _sendLoginPage(HttpServletRequest req, PrintWriter out) {
180     String loginTemplate = "login.template";
181                 try {
182       theLog.printDebugInfo("login: "+lang);
183                         if(lang==null){
184                                 lang=getAcceptLanguage(req);
185                         }
186                         HTMLTemplateProcessor.process(lang+"/"+loginTemplate, new SimpleHash(), out);
187                 }       catch(HTMLParseException e) {
188                         handleError( out, "fehler in logintemplate.");
189                 }
190         }
191
192         private void _sendStartPage(HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
193                 String startTemplate = "start_admin.template";
194                 try {
195                         // merge with logged in user and messages
196                         SimpleHash mergeData = new SimpleHash();
197                         mergeData.put("login_user", HTMLTemplateProcessor.makeSimpleHash(userEntity));
198                         if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
199                         mergeData.put("messages", HTMLTemplateProcessor.makeSimpleList(messageModule.getByWhereClause(null, "webdb_create desc",0,10)));
200                         HTMLTemplateProcessor.process(getLanguage(req)+"/"+startTemplate, mergeData,out);
201                 }
202                 catch(Exception e) {
203                         handleError( out, "error while trying to send startpage. " + e.toString());
204                 }
205         }
206
207         public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }
208
209 }
210