From 6d3bdf02dc4ce32456732fea26353d94401523a1 Mon Sep 17 00:00:00 2001 From: Christian Corsano Date: Mon, 28 Jan 2008 09:22:35 +0000 Subject: [PATCH] =?UTF-8?q?Corrig=C3=A9=20headerchoose.jsp=20Mis=20en=20pl?= =?UTF-8?q?ace=20SessionService=20pour=20la=20mise=20en=20session=20et=20l?= =?UTF-8?q?a=20recuperation=20automatique=20de=20la=20conference=20courant?= =?UTF-8?q?e=20SessionService=20est=20un=20filtre=20maintenant,=20etape=20?= =?UTF-8?q?suivante=20:=20en=20faire=20une=20classe=20statique=20pour=20en?= =?UTF-8?q?=20faciliter=20l'acces,=20et=20supprimer=20les=20parametres=20H?= =?UTF-8?q?ttpRequest=20dans=20les=20methodes=20Modifi=C3=A9=20les=20class?= =?UTF-8?q?es=20ayant=20besoin=20de=20la=20conference=20courante=20pour=20?= =?UTF-8?q?qu'elles=20utilisent=20SessionService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/decorators/headerchoose.jsp | 5 +- YACOSWeb/WebContent/WEB-INF/web.xml | 19 ++ YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml | 9 +- .../ChoosePreferenceController.java | 14 +- .../controller/CreateReportController.java | 4 - .../controller/DispatchArticleController.java | 17 +- .../controller/EvaluationController.java | 1 - .../controller/ListArticleController.java | 3 +- .../web/author/controller/MainController.java | 4 +- .../author/controller/SArticleController.java | 14 +- .../controller/AddConferenceController.java | 7 +- .../ChooseConferenceController.java | 2 - .../SUserRegistrationController.java | 2 +- .../web/system/controller/SessionService.java | 163 +++++++++++++++++- 14 files changed, 216 insertions(+), 48 deletions(-) diff --git a/YACOSWeb/WebContent/WEB-INF/decorators/headerchoose.jsp b/YACOSWeb/WebContent/WEB-INF/decorators/headerchoose.jsp index 94cdf3f..e81047c 100644 --- a/YACOSWeb/WebContent/WEB-INF/decorators/headerchoose.jsp +++ b/YACOSWeb/WebContent/WEB-INF/decorators/headerchoose.jsp @@ -12,8 +12,9 @@
- - La conférence courante est : ${idCurrentConference}.
+ + La conférence courante est :
+ ${currentConference.title} ">
diff --git a/YACOSWeb/WebContent/WEB-INF/web.xml b/YACOSWeb/WebContent/WEB-INF/web.xml index 865180e..f0e36e3 100644 --- a/YACOSWeb/WebContent/WEB-INF/web.xml +++ b/YACOSWeb/WebContent/WEB-INF/web.xml @@ -37,6 +37,12 @@ /dwr/* + + + lazyLoadingFilter + org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter + + sitemesh @@ -77,6 +83,19 @@ + + + SessionService + + org.yacos.web.system.controller.SessionService + + + + + SessionService + /* + + \ No newline at end of file diff --git a/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml b/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml index 9b440ae..a6b8c37 100644 --- a/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml +++ b/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml @@ -83,7 +83,8 @@ - + + - + + - + + listArticle; try { - listArticle = articleManager.getArticles((Integer) WebUtils.getSessionAttribute(request, "currentConferenceId")); + listArticle = articleManager.getArticles(sessionService.getCurrentConferenceId(request)); getServletContext().setAttribute("listArticle", listArticle); } catch (ConferenceDoesntExistException e) { logger.error(e.getMessage()); diff --git a/YACOSWeb/src/org/yacos/web/author/controller/MainController.java b/YACOSWeb/src/org/yacos/web/author/controller/MainController.java index f21f3be..e4185ac 100644 --- a/YACOSWeb/src/org/yacos/web/author/controller/MainController.java +++ b/YACOSWeb/src/org/yacos/web/author/controller/MainController.java @@ -2,8 +2,6 @@ package org.yacos.web.author.controller; import org.springframework.web.servlet.mvc.SimpleFormController; import org.springframework.web.servlet.ModelAndView; -import org.yacos.core.conferences.Conference; - import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -20,7 +18,7 @@ public class MainController extends SimpleFormController { logger.info("Returning main view"); - /*ajout en session d'un idconf et loginUser;*/ + // FIXME : this is no longer necessary request.getSession().setAttribute("user","toto"); request.getSession().setAttribute("conference",1); //FIXME diff --git a/YACOSWeb/src/org/yacos/web/author/controller/SArticleController.java b/YACOSWeb/src/org/yacos/web/author/controller/SArticleController.java index f2ce371..67e5fc8 100644 --- a/YACOSWeb/src/org/yacos/web/author/controller/SArticleController.java +++ b/YACOSWeb/src/org/yacos/web/author/controller/SArticleController.java @@ -6,11 +6,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.List; - import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.validation.BindException; @@ -18,9 +16,6 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; import org.springframework.web.servlet.view.RedirectView; -import org.springframework.web.util.WebUtils; -import org.yacos.core.article.*; -import org.yacos.web.author.form.*; import org.yacos.web.system.controller.SessionService; import org.yacos.core.article.Article; import org.yacos.core.article.IArticleManager; @@ -34,15 +29,16 @@ public class SArticleController extends SimpleFormController { protected final Log logger = LogFactory.getLog(getClass()); private IArticleManager articleManager; + private SessionService sessionService; public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws ServletException, IllegalStateException { - // Fetching conference id - Conference conf = (Conference)request.getSession().getAttribute("conference"); - // Fetching user login - User user = (User)request.getSession().getAttribute("user"); + // Fetching conference + Conference conf = sessionService.getCurrentConference(request); + // Fetching user + User user = sessionService.getCurrentUser(request); String title = ((FormSubmission) command).getTitle(); String theme = ((FormSubmission) command).getTheme(); diff --git a/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java b/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java index e43962b..91e3887 100644 --- a/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java +++ b/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java @@ -1,14 +1,10 @@ package org.yacos.web.chairman.controller; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - -import javax.naming.Context; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.validation.BindException; @@ -17,9 +13,10 @@ import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndViewDefiningException; import org.springframework.web.servlet.mvc.AbstractWizardFormController; import org.yacos.core.conferences.IConferenceManager; -import org.yacos.core.evaluation.Criterion; import org.yacos.web.chairman.form.FormConference; + +// TODO : Clean this class public class AddConferenceController extends AbstractWizardFormController { protected final Log logger = LogFactory.getLog(getClass()); diff --git a/YACOSWeb/src/org/yacos/web/system/controller/ChooseConferenceController.java b/YACOSWeb/src/org/yacos/web/system/controller/ChooseConferenceController.java index ec7e329..8e7f0d6 100644 --- a/YACOSWeb/src/org/yacos/web/system/controller/ChooseConferenceController.java +++ b/YACOSWeb/src/org/yacos/web/system/controller/ChooseConferenceController.java @@ -2,10 +2,8 @@ package org.yacos.web.system.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; -import org.springframework.web.util.WebUtils; public class ChooseConferenceController implements Controller { private SessionService sessionService; diff --git a/YACOSWeb/src/org/yacos/web/system/controller/SUserRegistrationController.java b/YACOSWeb/src/org/yacos/web/system/controller/SUserRegistrationController.java index 88493ba..d634dff 100644 --- a/YACOSWeb/src/org/yacos/web/system/controller/SUserRegistrationController.java +++ b/YACOSWeb/src/org/yacos/web/system/controller/SUserRegistrationController.java @@ -45,7 +45,7 @@ public class SUserRegistrationController extends SimpleFormController { FormUser userCommand = (FormUser) command; // Tries to retrieve the current user : case of user modification - User user = (User) request.getSession().getAttribute("currentUser"); + User user = sessionService.getCurrentUser(request); if( (userCommand.getIsNew()) && (usersManager.getUser(userCommand.getLogin()) != null)){ errors.rejectValue("login", "form.register.error.alreadyExists"); diff --git a/YACOSWeb/src/org/yacos/web/system/controller/SessionService.java b/YACOSWeb/src/org/yacos/web/system/controller/SessionService.java index 2b781eb..df852c4 100644 --- a/YACOSWeb/src/org/yacos/web/system/controller/SessionService.java +++ b/YACOSWeb/src/org/yacos/web/system/controller/SessionService.java @@ -1,5 +1,17 @@ package org.yacos.web.system.controller; +import java.io.IOException; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.springframework.web.util.WebUtils; import org.yacos.core.conferences.Conference; @@ -12,7 +24,10 @@ import org.yacos.core.users.User; * @author christiancorsano * */ -public class SessionService { +public class SessionService implements Filter { + private static ServletContext servletContext = null; + private static HttpServletRequest request = null; + private IConferenceManager conferenceManager; private IUserManager userManager; @@ -20,7 +35,31 @@ public class SessionService { private Conference currentConference; public SessionService(){ - + } + + /** + * Init method to be called at filter time + * Makes the sessionAttributes available in the request context + */ + private void init(){ + if(request != null && servletContext != null){ + try { + if(userManager == null || conferenceManager == null){ + Context context = new InitialContext(); + userManager = (IUserManager) context.lookup("UserManagerBean/remote"); + conferenceManager = (IConferenceManager) context.lookup("ConferenceManagerBean/remote"); + } + // Put the current conference in the request context to make it accessible in JSPs + // This avoid to put the whole object in the session + request.setAttribute("currentConference", getCurrentConference(request)); + // Put the current conference in the request context to make it accessible in JSPs + // This avoid to put the whole object in the session + request.setAttribute("currentUser", getCurrentUser(request)); + } catch (NamingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } public void setConferenceManager(IConferenceManager conferenceManager) { @@ -39,52 +78,158 @@ public class SessionService { return userManager; } + /** + * Gets the current conference Id + * Additionally, put the current conference object in the request context + * with the key "currentConference". + * @param request The current HTTP request object, necessary for session operations + * @return The current conference id + */ public Integer getCurrentConferenceId(HttpServletRequest request) { - return (Integer) WebUtils.getSessionAttribute(request, "currentConferenceId"); + // Retrieve the ID from the session + Integer confId = (Integer) WebUtils.getSessionAttribute(request, "currentConferenceId"); + return confId; } + /** + * Sets the current conference id + * @param request The current HTTP request object, necessary for session operations + * @param currentConferenceId The id to set as the new current conference + */ public void setCurrentConferenceId(HttpServletRequest request,Integer currentConferenceId) { WebUtils.setSessionAttribute(request, "currentConferenceId", currentConferenceId); + currentConference = conferenceManager.getConference(currentConferenceId); + request.setAttribute("currentConference", currentConference); } + /** + * Sets the current conference using a conference object + * @param request The current HTTP request object, necessary for session operations + * @param c The conference object to set as current + */ public void setCurrentConference(HttpServletRequest request, Conference c){ - currentConference = c; setCurrentConferenceId(request, c.getId() ); + currentConference = c; } + /** + * Gets (if necessary) and returns the current conference of the session + * @param request The current HTTP request object, necessary for session operations + * @return The conference object + */ public Conference getCurrentConference(HttpServletRequest request){ - if(currentConference == null){ - currentConference = conferenceManager.getConference(getCurrentConferenceId(request)); + Integer id = getCurrentConferenceId(request); + + // The currentConference can be out to date : force the update + if(currentConference != null && id != currentConference.getId()){ + currentConference = null; + } + + if( currentConference == null && id != null ){ + currentConference = conferenceManager.getConference(id); } return currentConference; } + /** + * Sets the current user by providing the user object + * @param request The current HTTP request object, necessary for session operations + * @param currentUser The new current user to set + */ public void setCurrentUser(HttpServletRequest request,User currentUser) { this.currentUser = currentUser; this.setCurrentUserLogin(request,currentUser.getLogin()); } + /** + * Sets the current user login + * @param request The current HTTP request object, necessary for session operations + * @param login The new current user login + */ public void setCurrentUserLogin(HttpServletRequest request, String login) { WebUtils.setSessionAttribute(request, "currentUserLogin", login); + currentUser = userManager.getUser(login); + request.setAttribute("currentUser", currentUser); } + /** + * Gets the current user login from the session + * Additionally, puts the current User object in the request context + * with the key "currentUser" + * @param request The current HTTP request object, necessary for session operations + * @return The current user login + */ public String getCurrentUserLogin(HttpServletRequest request){ - return (String)WebUtils.getSessionAttribute(request, "currentUserLogin"); + // Retrieve the login from the session + String login = (String) WebUtils.getSessionAttribute(request, "currentUserLogin"); + return login; } + /** + * Get (if necessary) and returns the current user object + * @param request The current HTTP request object, necessary for session operations + * @return The current User + */ public User getCurrentUser(HttpServletRequest request) { - if(currentUser == null){ - String login = this.getCurrentUserLogin(request); + // Retrieve the login from the session + String login = this.getCurrentUserLogin(request); + + // The user can be out to date : force the update + if(currentUser != null && (! currentUser.getLogin().equals(login)) ){ + currentUser = null; + } + + // Check if the user object is already in cache + if(currentUser == null || (this.getCurrentUser(request).getLogin().equals(login)) ){ + // Checks login for validity if(login == null || login.equals("")){ currentUser = null; } else { + // Puts the user object in the cache object currentUser = userManager.getUser(login); } } return currentUser; } + /** + * Returns whether the user is logged (is there a current User for this session) + * @param request The current HTTP request object, necessary for session operations + * @return true if there's a current user in the session, false otherwise + */ public boolean isUserLogged(HttpServletRequest request){ return getCurrentUser(request) != null; } + + /* ========================= */ + /* = Filter implementation = */ + /* ========================= */ + + /** + * Inits the filter, and set the servletContext for this session service + */ + public void init(FilterConfig config) throws ServletException { + SessionService.servletContext = config.getServletContext(); + } + + /** + * Fetch the current session data so that every JSP has access to it + */ + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + if(request instanceof HttpServletRequest){ + SessionService.request = (HttpServletRequest) request; + init(); + } + + chain.doFilter(request, response); + } + + /** + * Clean the static attributes + */ + public void destroy() { + SessionService.servletContext = null; + SessionService.request = null; + } }