package com.processpuzzle.user.session.control;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.application.security.domain.User;
import com.processpuzzle.application.security.domain.UserRepository;
import com.processpuzzle.user_session.domain.UserRequestContext;
import com.processpuzzle.user_session.domain.UserRequestManager;
import com.processpuzzle.user_session.domain.UserSession;
import com.processpuzzle.user_session.domain.UserSessionHolder;
/**
* A Servlet Filter for ensuring the presence of a requestcontext, with associated application session
*
* @author kkj
* @since 27-01-2005 13:01:23
*/
public class UserRequestContextCreator implements Filter {
private static final Logger log = LoggerFactory.getLogger( UserRequestContextCreator.class );
private Application application;
private UserRequestManager requestManager;
private UserRequestContext requestContext;
private UserSession userSession;
private UserSessionHolder sessionHolder;
public UserRequestContextCreator() {
}
public void doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain ) throws IOException, ServletException {
log.debug( "UserRequestContextCreator.doFilter()" );
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
userSession = wireUserSessionToTheCurrentRequest( httpRequest, application );
requestContext = createNewUserRequestContext( userSession );
try{
filterChain.doFilter( servletRequest, servletResponse );
}finally{
requestManager.desctroyRequestContext( requestContext );
}
}
public void init( FilterConfig filterConfig ) throws ServletException {
requestManager = UserRequestManager.getInstance();
application = requestManager.getApplicationInContext();
//application = (Application) filterConfig.getServletContext().getAttribute( ApplicationLifecycleListener.APPLICATION_OBJECT );
}
public void destroy() {}
//Properties
public Application getApplication() { return application; }
public UserRequestManager getRequestManager() { return requestManager; }
public UserSession getUserSession() { return userSession; }
// Private helper methods
private UserRequestContext createNewUserRequestContext( UserSession userSession ) {
return requestManager.createRequestContext( sessionHolder );
}
private User determineUser() {
UserSession currentSession = sessionHolder.getSession();
if( currentSession != null && currentSession.getUser() != null ) return currentSession.getUser();
else {
UserRepository userRepository = application.getContext().getRepository( UserRepository.class );
User currentUser = userRepository.findAnonymousUser();
return currentUser;
}
}
private UserSession wireUserSessionToTheCurrentRequest( HttpServletRequest httpServletRequest, Application application ) {
sessionHolder = new HttpSessionUserSessionHolder( httpServletRequest );
UserSession currentSession = sessionHolder.getSession();
if( currentSession == null ) {
User user = determineUser();
return UserRequestManager.getInstance().createSession( sessionHolder, user, application );
}else return currentSession;
}
}