4 import java.lang.reflect.*;
5 import javax.servlet.*;
6 import javax.servlet.http.*;
7 import javax.servlet.UnavailableException;
10 import freemarker.template.*;
14 import mir.storage.StorageObjectException;
16 import mircoders.servlet.*;
17 import mircoders.module.*;
18 import mircoders.entity.*;
19 import mircoders.storage.*;
22 * Mir.java - main servlet, that dispatches to servletmodules
24 * @author RK 1999-2001
29 public class Mir extends AbstractServlet
32 private static ModuleUsers usersModule=null;
33 private static ModuleMessage messageModule=null;
34 //private static boolean confed=false;
35 public HttpSession session;
37 public void doGet(HttpServletRequest req, HttpServletResponse res)
38 throws ServletException, IOException {
42 public void doPost(HttpServletRequest req, HttpServletResponse res)
43 throws ServletException, IOException, UnavailableException {
45 long startTime = (new java.util.Date()).getTime();
46 Class theServletModule;
48 long sessionConnectTime=0;
51 // get the configration
52 if(getServletContext().getAttribute("mir.confed") == null) {
55 MirConfig.setServletName(getServletName());
57 session = req.getSession(true);
59 if (req.getServerPort() == 443) http="https"; else http="http";
60 res.setContentType("text/html");
61 String moduleName = req.getParameter("module");
63 if(session.getAttribute("Language")==null){
64 setLanguage(session,getAcceptLanguage(req));
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());
82 //if accept-language!=selected language change language
83 if(!getLanguage(req,session).equals(lang)){
84 setLanguage(session,lang);
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");
93 theLog.printDebugInfo("Redirect: "+target);
94 int serverPort = req.getServerPort();
96 String redirectString ="";
100 redirect=res.encodeURL(http + "://" + req.getServerName() + target);
101 redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
103 + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
105 redirect=res.encodeURL(http + "://" + req.getServerName() + ":" +req.getServerPort() + target);
106 redirectString = "<html><head><meta http-equiv=refresh content=\"1;URL="
108 + "\"></head><body>going <a href=\"" + redirect + "\">Mir</a></body></html>";
110 res.getWriter().println(redirectString);
113 //res.sendRedirect(redirect);
116 // redirecting to default target
117 theLog.printDebugInfo("--login: no target - redirecting to default");
118 _sendStartPage(res,req,res.getWriter(),userEntity);
121 } // if login succesful
124 if (moduleName!=null && moduleName.equals("logout")) {
125 theLog.printDebugInfo("--logout");
126 session.invalidate();
127 _sendLoginPage(res,req,res.getWriter());
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);
142 _sendLoginPage(res,req,res.getWriter());
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);
153 //From now on regular dispatching...
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);
161 //Instantiate the ServletModule
162 Method m = theServletModule.getMethod("getInstance",null);
163 smod = (ServletModule)m.invoke(null,null);
164 ServletModuleDispatch.dispatch(smod,req,res);
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());
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()); }
178 sessionConnectTime = new java.util.Date().getTime() - startTime;
179 theLog.printInfo("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
182 private void handleError(HttpServletResponse res, PrintWriter out, String errorString) {
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);
191 catch (Exception e) {
192 System.err.println("Error in ErrorTemplate");
196 private void handleUserError(HttpServletResponse res,PrintWriter out, String errorString) {
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);
206 catch (Exception e) {
207 System.err.println("Fehler in UserErrorTemplate");
212 * evaluate login for user / password
214 protected EntityUsers allowedUser(String user, String password) {
216 if (usersModule == null) usersModule = new ModuleUsers(DatabaseUsers.getInstance());
217 return usersModule.getUserForLogin(user, password);
218 } catch(Exception e) {
219 theLog.printDebugInfo(e.toString());
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);
231 theLog.printDebugInfo("login: "+lang);
233 lang=getAcceptLanguage(req);
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.");
243 private void _sendStartPage(HttpServletResponse res, HttpServletRequest req,PrintWriter out, EntityUsers userEntity) {
244 String startTemplate = "start_admin.template";
245 String sessionUrl=res.encodeURL("");
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);
256 handleError( res,out, "error while trying to send startpage. " + e.toString());
260 public String getServletInfo(){ return "Mir 1.0 rev02 multilanguage"; }