+ if ((queryString != null) && !queryString.equals("")) {
+ redirectString += ("?" + aRequest.getQueryString());
+ logger.debug("STORING: " + redirectString);
+ session.setAttribute("login.target", redirectString);
+ }
+
+ _sendLoginPage(aResponse, aRequest, aResponse.getWriter());
+
+ return;
+ }
+
+ // If no module is specified goto standard startpage
+ if ((moduleName == null) || moduleName.equals("")) {
+ logger.debug("no module: redirect to standardpage");
+ _sendStartPage(aResponse, aRequest, aResponse.getWriter(), userEntity);
+
+ return;
+ }
+
+ // end of auth
+ // From now on regular dispatching...
+ try {
+ // get servletmodule by parameter and continue with dispacher
+ ServletModule smod = getServletModuleForName(moduleName);
+ ServletModuleDispatch.dispatch(smod, aRequest, aResponse);
+ }
+ catch (Throwable e) {
+ Throwable cause = ExceptionFunctions.traceCauseException(e);
+
+ if (cause instanceof ServletModuleUserExc)
+ handleUserError(aRequest, aResponse, aResponse.getWriter(), (ServletModuleUserExc) cause);
+ else
+ handleError(aRequest, aResponse, aResponse.getWriter(), cause);
+
+ }
+
+ // timing...
+ sessionConnectTime = System.currentTimeMillis() - startTime;
+ logger.info("EXECTIME (" + moduleName + "): " + sessionConnectTime + " ms");
+ }
+
+ /**
+ * Private method getServletModuleForName returns ServletModule
+ * from Cache
+ *
+ * @param moduleName
+ * @return ServletModule
+ *
+ */
+ private static ServletModule getServletModuleForName(String moduleName) throws ServletModuleExc {
+ // Instance in Map ?
+ if (!servletModuleInstanceHash.containsKey(moduleName)) {
+ // was not found in hash...
+ try {
+ Class theServletModuleClass = null;
+
+ try {
+ // first we try to get ServletModule from stern.che3.servlet
+ theServletModuleClass =
+ Class.forName("mircoders.servlet.ServletModule" + moduleName);
+ } catch (ClassNotFoundException e) {
+ // on failure, we try to get it from lib-layer
+ theServletModuleClass =
+ Class.forName("mir.servlet.ServletModule" + moduleName);
+ }
+
+ Method m = theServletModuleClass.getMethod("getInstance", null);
+ ServletModule smod = (ServletModule) m.invoke(null, null);
+
+ // we put it into map for further reference
+ servletModuleInstanceHash.put(moduleName, smod);
+
+ return smod;
+ }
+ catch (Exception e) {
+ throw new ServletModuleExc("*** error resolving classname for " + moduleName + " -- " + e.getMessage());
+ }
+ }
+ else {
+ return (ServletModule) servletModuleInstanceHash.get(moduleName);
+ }
+ }
+
+ private void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse,
+ PrintWriter out, ServletModuleUserExc anException) {
+ try {
+ logger.info("user error: " + anException.getMessage());
+ SimpleHash modelRoot = new SimpleHash();
+ MessageResources messages = MessageResources.getMessageResources("bundles.admin");
+ modelRoot.put("errorstring",
+ new SimpleScalar(
+ messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters())
+ ));
+ modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
+ HTMLTemplateProcessor.process(
+ aResponse,
+ MirPropertiesConfiguration.instance().getString("Mir.UserErrorTemplate"),
+ modelRoot,
+ null,
+ out,
+ getLocale(aRequest),
+ fallbackLocale);
+ out.close();
+ }
+ catch (Exception e) {
+ logger.error("Error in UserErrorTemplate");
+ }
+
+ }
+
+ private void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) {
+
+ try {
+ logger.error("error: " + anException);
+ SimpleHash modelRoot = new SimpleHash();
+ modelRoot.put("errorstring", new SimpleScalar(anException.getMessage()));
+ modelRoot.put("date", new SimpleScalar(StringUtil.date2readableDateTime(
+ new GregorianCalendar())));
+ HTMLTemplateProcessor.process(
+ aResponse,MirPropertiesConfiguration.instance().getString("Mir.ErrorTemplate"),
+ modelRoot,null,out, getLocale(aRequest), getFallbackLocale());
+ out.close();
+ }
+ catch (Exception e) {
+ logger.error("Error in ErrorTemplate");
+ }
+ }
+
+ /**
+ * evaluate login for user / password
+ */
+ protected EntityUsers allowedUser(String user, String password) {
+ try {
+ if (usersModule == null) {
+ usersModule = new ModuleUsers(DatabaseUsers.getInstance());
+ }
+
+ return usersModule.getUserForLogin(user, password);
+ }
+ catch (Exception e) {
+ logger.debug(e.getMessage());
+ e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
+
+ return null;
+ }
+ }
+
+ // Redirect-methods
+ private void _sendLoginPage(HttpServletResponse aResponse, HttpServletRequest aRequest,
+ PrintWriter out) {
+ String loginTemplate = configuration.getString("Mir.LoginTemplate");
+ String sessionUrl = aResponse.encodeURL("");
+
+ try {
+ SimpleHash mergeData = new SimpleHash();
+ SimpleList languages = new SimpleList();
+
+ mergeData.put("session", sessionUrl);
+
+ mergeData.put("defaultlanguage", getDefaultLanguage(aRequest));
+ mergeData.put("languages", getLoginLanguages());
+
+ HTMLTemplateProcessor.process(aResponse, loginTemplate, mergeData, null, out, getLocale(aRequest), getFallbackLocale());
+ }
+ catch (Throwable e) {
+ handleError(aRequest, aResponse, out, e);
+ }
+ }
+
+ private void _sendStartPage(HttpServletResponse aResponse, HttpServletRequest aRequest,
+ PrintWriter out, EntityUsers userEntity) {
+ String startTemplate = configuration.getString("Mir.StartTemplate");
+ String sessionUrl = aResponse.encodeURL("");
+
+ try {
+ Map mergeData = ServletHelper.makeGenerationData(new Locale[] {getLocale(aRequest), getFallbackLocale()}, "bundles.admin", "bundles.adminlocal");
+ mergeData.put("messages",
+ new CachingRewindableIterator(
+ new EntityIteratorAdapter( "", "webdb_create desc", 10,
+ MirGlobal.localizer().dataModel().adapterModel(), "internalMessage", 10, 0)));
+
+ mergeData.put("fileeditentries", ((ServletModuleFileEdit) ServletModuleFileEdit.getInstance()).getEntries());
+ mergeData.put("administeroperations", ((ServletModuleLocalizer) ServletModuleLocalizer.getInstance()).getAdministerOperations());
+
+ mergeData.put("searchvalue", null);
+ mergeData.put("searchfield", null);
+ mergeData.put("searchispublished", null);
+ mergeData.put("searcharticletype", null);
+ mergeData.put("searchorder", null);
+ mergeData.put("selectarticleurl", null);
+
+ ServletHelper.generateResponse(aResponse.getWriter(), mergeData, startTemplate);
+ }
+ catch (Exception e) {
+ e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
+ handleError(aRequest, aResponse, out, e);
+ }
+ }
+
+ public String getServletInfo() {
+ return "Mir " + configuration.getString("Mir.Version");
+ }
+
+ private void checkLanguage(HttpSession session, HttpServletRequest aRequest) {
+ // a lang parameter always sets the language
+ String lang = aRequest.getParameter("language");
+
+ if (lang != null) {
+ logger.info("selected language " + lang + " overrides accept-language");
+ setLanguage(session, lang);
+ }
+ // otherwise store language from accept header in session
+ else if (session.getAttribute("language") == null) {
+ logger.info("accept-language is " + aRequest.getLocale().getLanguage());
+ setLanguage(session, aRequest.getLocale().getLanguage());
+ }
+ }
+}