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;
+ }
}