[jboss-cvs] jboss-seam/src/main/org/jboss/seam/contexts ...
Gavin King
gavin.king at jboss.com
Sun Jun 10 15:25:58 EDT 2007
User: gavin
Date: 07/06/10 15:25:58
Modified: src/main/org/jboss/seam/contexts Lifecycle.java
ServerConversationContext.java
Added: src/main/org/jboss/seam/contexts BasicContext.java
SessionContext.java
Removed: src/main/org/jboss/seam/contexts
ContextAdaptor.java FacesApplicationContext.java
MapContext.java WebApplicationContext.java
WebRequestContext.java WebSessionContext.java
Log:
major refactor of contexts impl
JBSEAM-953
Revision Changes Path
1.91 +91 -59 jboss-seam/src/main/org/jboss/seam/contexts/Lifecycle.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Lifecycle.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/Lifecycle.java,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -b -r1.90 -r1.91
--- Lifecycle.java 8 Jun 2007 19:22:47 -0000 1.90
+++ Lifecycle.java 10 Jun 2007 19:25:58 -0000 1.91
@@ -6,13 +6,14 @@
*/
package org.jboss.seam.contexts;
+import java.util.Map;
import java.util.Set;
import javax.faces.context.ExternalContext;
import javax.faces.event.PhaseId;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpServletRequest;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
@@ -25,11 +26,14 @@
import org.jboss.seam.core.ServletSession;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
+import org.jboss.seam.servlet.ServletApplicationMap;
+import org.jboss.seam.servlet.ServletRequestMap;
+import org.jboss.seam.servlet.ServletRequestSessionMap;
/**
* @author Gavin King
* @author <a href="mailto:theute at jboss.org">Thomas Heute</a>
- * @version $Revision: 1.90 $
+ * @version $Revision: 1.91 $
*/
public class Lifecycle
{
@@ -39,38 +43,35 @@
public static void beginRequest(ExternalContext externalContext)
{
log.debug( ">>> Begin web request" );
- Contexts.eventContext.set( new WebRequestContext( ContextAdaptor.getRequest(externalContext) ) );
- Contexts.applicationContext.set( new FacesApplicationContext(externalContext) );
- ContextAdaptor session = ContextAdaptor.getSession(externalContext);
- Contexts.sessionContext.set( new WebSessionContext(session) );
- ServletSession servletSession = ServletSession.instance();
- if ( servletSession!=null /*yuck! unit tests!*/ && servletSession.isInvalidDueToNewScheme() )
- {
- session.invalidate();
- session = ContextAdaptor.getSession(externalContext);
- Contexts.sessionContext.set( new WebSessionContext(session) );
+ Contexts.eventContext.set( new BasicContext( ScopeType.EVENT, externalContext.getRequestMap() ) );
+ Contexts.applicationContext.set( new BasicContext( ScopeType.APPLICATION, externalContext.getApplicationMap() ) );
+ Contexts.sessionContext.set( new SessionContext( externalContext.getSessionMap() ) );
+ ServletSession servletSession = ServletSession.getInstance();
+ if ( servletSession!=null && servletSession.isInvalidDueToNewScheme() )
+ {
+ invalidateSession(externalContext);
}
Contexts.conversationContext.set(null); //in case endRequest() was never called
//Events.instance(); //TODO: only for now, until we have a way to do EL outside of JSF!
}
- public static void beginRequest(ServletContext servletContext, HttpSession session, ServletRequest request)
+ public static void beginRequest(ServletContext servletContext, HttpServletRequest request)
{
log.debug( ">>> Begin web request" );
- Contexts.eventContext.set( new WebRequestContext( ContextAdaptor.getRequest(request) ) );
- Contexts.sessionContext.set( new WebSessionContext( ContextAdaptor.getSession(session) ) );
- Contexts.applicationContext.set( new WebApplicationContext(servletContext) );
+ Contexts.eventContext.set( new BasicContext( ScopeType.EVENT, new ServletRequestMap(request) ) );
+ Contexts.sessionContext.set( new SessionContext( new ServletRequestSessionMap(request) ) );
+ Contexts.applicationContext.set( new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap(servletContext) ) );
Contexts.conversationContext.set(null); //in case endRequest() was never called
}
public static void beginCall()
{
log.debug( ">>> Begin call" );
- Contexts.eventContext.set( new MapContext(ScopeType.EVENT) );
- Contexts.sessionContext.set( new MapContext(ScopeType.SESSION) );
- Contexts.conversationContext.set( new MapContext(ScopeType.CONVERSATION) );
+ Contexts.eventContext.set( new BasicContext(ScopeType.EVENT) );
+ Contexts.sessionContext.set( new BasicContext(ScopeType.SESSION) );
+ Contexts.conversationContext.set( new BasicContext(ScopeType.CONVERSATION) );
Contexts.businessProcessContext.set( new BusinessProcessContext() );
- Contexts.applicationContext.set( new WebApplicationContext( getServletContext() ) );
+ Contexts.applicationContext.set( new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap( getServletContext() ) ) );
}
public static void endCall()
@@ -94,7 +95,7 @@
public static void mockApplication()
{
- Contexts.applicationContext.set( new WebApplicationContext( getServletContext() ) );
+ Contexts.applicationContext.set( new BasicContext(ScopeType.APPLICATION, new ServletApplicationMap( getServletContext() ) ) );
}
public static void unmockApplication()
@@ -105,7 +106,7 @@
public static Context beginMethod()
{
Context result = Contexts.methodContext.get();
- Contexts.methodContext.set( new MapContext(ScopeType.METHOD) );
+ Contexts.methodContext.set( new BasicContext(ScopeType.METHOD) );
return result;
}
@@ -116,25 +117,25 @@
public static void beginInitialization(ServletContext servletContext)
{
- Contexts.applicationContext.set( new WebApplicationContext(servletContext) );
- Contexts.eventContext.set( new MapContext(ScopeType.EVENT) );
- Contexts.conversationContext.set( new MapContext(ScopeType.CONVERSATION) );
+ Contexts.applicationContext.set( new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap(servletContext) ) );
+ Contexts.eventContext.set( new BasicContext(ScopeType.EVENT) );
+ Contexts.conversationContext.set( new BasicContext(ScopeType.CONVERSATION) );
}
- public static void beginReinitialization(ServletContext servletContext, HttpSession session)
+ public static void beginReinitialization(ServletContext servletContext, HttpServletRequest request)
{
- Contexts.applicationContext.set( new WebApplicationContext(servletContext) );
- Contexts.eventContext.set( new MapContext(ScopeType.EVENT) );
- Contexts.sessionContext.set( new WebSessionContext( ContextAdaptor.getSession(session) ) );
- Contexts.conversationContext.set( new MapContext(ScopeType.CONVERSATION) );
+ Contexts.applicationContext.set(new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap(servletContext) ) );
+ Contexts.eventContext.set( new BasicContext(ScopeType.EVENT) );
+ Contexts.sessionContext.set( new SessionContext( new ServletRequestSessionMap(request) ) );
+ Contexts.conversationContext.set( new BasicContext(ScopeType.CONVERSATION) );
}
public static void beginExceptionRecovery(ExternalContext externalContext)
{
- Contexts.applicationContext.set( new FacesApplicationContext(externalContext) );
- Contexts.eventContext.set( new WebRequestContext( ContextAdaptor.getRequest(externalContext) ) );
- Contexts.sessionContext.set( new WebSessionContext( ContextAdaptor.getSession(externalContext) ) );
- Contexts.conversationContext.set( new ServerConversationContext( ContextAdaptor.getSession(externalContext) ) );
+ Contexts.applicationContext.set( new BasicContext( ScopeType.APPLICATION, externalContext.getApplicationMap() ) );
+ Contexts.eventContext.set( new BasicContext( ScopeType.EVENT, externalContext.getRequestMap() ) );
+ Contexts.sessionContext.set( new SessionContext( externalContext.getSessionMap() ) );
+ Contexts.conversationContext.set( new ServerConversationContext( externalContext.getSessionMap() ) );
Contexts.pageContext.set(null);
Contexts.businessProcessContext.set(null); //TODO: is this really correct?
}
@@ -197,7 +198,7 @@
{
log.debug("Undeploying, destroying application context");
- Context tempApplicationContext = new WebApplicationContext(servletContext);
+ Context tempApplicationContext = new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap(servletContext) );
Contexts.applicationContext.set( tempApplicationContext );
Contexts.destroy(tempApplicationContext);
Contexts.applicationContext.set(null);
@@ -209,7 +210,7 @@
/***
* Instantiate @Startup components for session scoped component
*/
- public static void beginSession(ServletContext servletContext, ContextAdaptor session)
+ public static void beginSession(ServletContext servletContext, Map<String, Object> session)
{
log.debug("Session started");
@@ -219,31 +220,32 @@
boolean applicationContextActive = Contexts.isApplicationContextActive();
boolean eventContextActive = Contexts.isEventContextActive();
boolean conversationContextActive = Contexts.isConversationContextActive();
+ boolean sessionContextActive = Contexts.isSessionContextActive();
if ( !applicationContextActive )
{
- Context tempApplicationContext = new WebApplicationContext(servletContext);
+ Context tempApplicationContext = new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap(servletContext) );
Contexts.applicationContext.set(tempApplicationContext);
}
+ if ( !sessionContextActive )
+ {
+ Context tempSessionContext = new SessionContext(session);
+ Contexts.sessionContext.set(tempSessionContext);
+ }
Context tempEventContext = null;
if ( !eventContextActive )
{
- tempEventContext = new MapContext(ScopeType.EVENT);
+ tempEventContext = new BasicContext(ScopeType.EVENT);
Contexts.eventContext.set(tempEventContext);
}
Context tempConversationContext = null;
if ( !conversationContextActive )
{
- tempConversationContext = new MapContext(ScopeType.CONVERSATION);
+ tempConversationContext = new BasicContext(ScopeType.CONVERSATION);
Contexts.conversationContext.set(tempConversationContext);
}
- Context tempSessionContext = new WebSessionContext(session);
- Contexts.sessionContext.set(tempSessionContext);
-
startup(ScopeType.SESSION);
- Contexts.sessionContext.set(null);
-
if ( !conversationContextActive )
{
Contexts.destroy(tempConversationContext);
@@ -254,6 +256,10 @@
Contexts.destroy(tempEventContext);
Contexts.eventContext.set(null);
}
+ if ( !sessionContextActive )
+ {
+ Contexts.sessionContext.set(null);
+ }
if ( !applicationContextActive )
{
Contexts.applicationContext.set(null);
@@ -261,7 +267,7 @@
}
- public static void endSession(ServletContext servletContext, ContextAdaptor session)
+ public static void endSession(ServletContext servletContext, Map<String, Object> session)
{
log.debug("End of session, destroying contexts");
@@ -274,16 +280,16 @@
throw new IllegalStateException("Please end the HttpSession via Seam.invalidateSession()");
}
- Context tempApplicationContext = new WebApplicationContext(servletContext);
+ Context tempApplicationContext = new BasicContext( ScopeType.APPLICATION, new ServletApplicationMap(servletContext) );
Contexts.applicationContext.set(tempApplicationContext);
//this is used just as a place to stick the ConversationManager
- Context tempEventContext = new MapContext(ScopeType.EVENT);
+ Context tempEventContext = new BasicContext(ScopeType.EVENT);
Contexts.eventContext.set(tempEventContext);
//this is used (a) for destroying session-scoped components
//and is also used (b) by the ConversationManager
- Context tempSessionContext = new WebSessionContext(session);
+ Context tempSessionContext = new SessionContext(session);
Contexts.sessionContext.set(tempSessionContext);
Set<String> conversationIds = ConversationEntries.instance().getConversationIds();
@@ -295,7 +301,7 @@
//we need some conversation-scope components for destroying
//the session context...
- Context tempConversationContext = new MapContext(ScopeType.CONVERSATION);
+ Context tempConversationContext = new BasicContext(ScopeType.CONVERSATION);
Contexts.conversationContext.set(tempConversationContext);
log.debug("destroying session context");
@@ -317,7 +323,8 @@
log.debug("After render response, destroying contexts");
try
{
- boolean sessionInvalid = ServletSession.instance().isInvalid();
+ ServletSession servletSession = ServletSession.getInstance();
+ boolean sessionInvalid = servletSession!=null && servletSession.isInvalid();
flushAndDestroyContexts();
@@ -325,7 +332,7 @@
{
clearThreadlocals();
Lifecycle.setPhaseId(null);
- ContextAdaptor.getSession(externalContext).invalidate(); //huh? we create a session just to invalidate it?
+ invalidateSession(externalContext);
//actual session context will be destroyed from the listener
}
}
@@ -337,6 +344,27 @@
log.debug( "<<< End web request" );
}
+ /**
+ * Invalidate the session, no matter what kind of session it is
+ * (portlet or servlet). Why is this method not on ExternalContext?!
+ * Oh boy, those crazy rascals in the JSF EG...
+ */
+ public static void invalidateSession(ExternalContext externalContext)
+ {
+ Object session = externalContext.getSession(false);
+ if (session!=null)
+ {
+ try
+ {
+ session.getClass().getMethod("invalidate").invoke(session);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
public static void endRequest()
{
@@ -354,21 +382,22 @@
log.debug( "<<< End web request" );
}
- public static void endRequest(HttpSession session)
+ public static void endRequest(HttpServletRequest request)
{
log.debug("After request, destroying contexts");
try
{
- boolean sessionInvalid = ServletSession.instance().isInvalid();
+ ServletSession servletSession = ServletSession.getInstance();
+ boolean sessionInvalid = servletSession!=null && servletSession.isInvalid();
flushAndDestroyContexts();
if (sessionInvalid)
{
clearThreadlocals();
- ContextAdaptor.getSession(session).invalidate(); //huh? we create a session just to invalidate it?
+ request.getSession().invalidate();
//actual session context will be destroyed from the listener
}
}
@@ -429,7 +458,10 @@
}
//uses the event and session contexts
+ if ( ServletSession.getInstance()!=null )
+ {
Manager.instance().unlockConversation();
+ }
}
@@ -460,14 +492,14 @@
Init init = Init.instance();
Context conversationContext = init.isClientSideConversations() ?
(Context) new ClientConversationContext() :
- (Context) new ServerConversationContext( ContextAdaptor.getSession(externalContext) );
+ (Context) new ServerConversationContext( externalContext.getSessionMap() );
Contexts.conversationContext.set( conversationContext );
Contexts.businessProcessContext.set( new BusinessProcessContext() );
}
- public static void resumeConversation(HttpSession session)
+ public static void resumeConversation(HttpServletRequest request)
{
- Context conversationContext = new ServerConversationContext( ContextAdaptor.getSession(session) );
+ Context conversationContext = new ServerConversationContext( new ServletRequestSessionMap(request) );
Contexts.conversationContext.set( conversationContext );
Contexts.businessProcessContext.set( new BusinessProcessContext() );
}
@@ -534,7 +566,7 @@
return attribute instanceof Mutable && ( (Mutable) attribute ).clearDirty();
}
- public static void destroyConversationContext(ContextAdaptor session, String conversationId)
+ public static void destroyConversationContext(Map<String, Object> session, String conversationId)
{
ServerConversationContext conversationContext = new ServerConversationContext(session, conversationId);
Context old = Contexts.getConversationContext();
1.23 +17 -18 jboss-seam/src/main/org/jboss/seam/contexts/ServerConversationContext.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ServerConversationContext.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/ServerConversationContext.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- ServerConversationContext.java 3 Jun 2007 19:19:06 -0000 1.22
+++ ServerConversationContext.java 10 Jun 2007 19:25:58 -0000 1.23
@@ -6,7 +6,6 @@
*/
package org.jboss.seam.contexts;
-import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
@@ -27,11 +26,11 @@
*
* @author Gavin King
* @author <a href="mailto:theute at jboss.org">Thomas Heute</a>
- * @version $Revision: 1.22 $
+ * @version $Revision: 1.23 $
*/
public class ServerConversationContext implements Context {
- private final ContextAdaptor session;
+ private final Map<String, Object> session;
private final Map<String, Object> additions = new HashMap<String, Object>();
private final Set<String> removals = new HashSet<String>();
private final String id;
@@ -67,14 +66,14 @@
return ScopeType.CONVERSATION.getPrefix() + '#' + id + '$';
}
- public ServerConversationContext(ContextAdaptor session)
+ public ServerConversationContext(Map<String, Object> session)
{
this.session = session;
id = null;
idStack = null;
}
- public ServerConversationContext(ContextAdaptor session, String id)
+ public ServerConversationContext(Map<String, Object> session, String id)
{
this.session = session;
this.id = id;
@@ -100,14 +99,14 @@
List<String> stack = getIdStack();
if (stack==null)
{
- return unwrapEntityBean( session.getAttribute( getKey(name) ) );
+ return unwrapEntityBean( session.get( getKey(name) ) );
}
else
{
for ( int i=0; i<stack.size(); i++ )
{
String id = stack.get(i);
- result = session.getAttribute( getKey(name, id) );
+ result = session.get( getKey(name, id) );
if (result != null)
{
@@ -126,7 +125,8 @@
}
}
- private boolean isPerNestedConversation(String name) {
+ private boolean isPerNestedConversation(String name)
+ {
Component component = Component.forName(name);
return (component != null) && component.beanClassHasAnnotation(PerNestedConversation.class);
}
@@ -187,11 +187,10 @@
private Set<String> getNamesFromSession()
{
HashSet<String> results = new HashSet<String>();
- Enumeration names = session.getAttributeNames();
String prefix = getPrefix( getId() );
- while ( names.hasMoreElements() ) {
- String name = (String) names.nextElement();
- if ( name.startsWith(prefix) && session.getAttribute(name)!=null )
+ for ( String name: session.keySet() )
+ {
+ if ( name.startsWith(prefix) )
{
name = name.substring( prefix.length() );
if ( !removals.contains(name) ) results.add(name);
@@ -227,31 +226,31 @@
for ( String name: getNamesFromSession() )
{
String key = getKey(name);
- Object attribute = session.getAttribute(key);
+ Object attribute = session.get(key);
if ( attribute!=null && Lifecycle.isAttributeDirty(attribute) )
{
- session.setAttribute(key, attribute);
+ session.put(key, attribute);
}
}
//remove removed objects
for (String name: removals)
{
- session.removeAttribute( getKey(name) );
+ session.remove( getKey(name) );
}
removals.clear();
//add new objects
for (Map.Entry<String, Object> entry: additions.entrySet())
{
- session.setAttribute( getKey( entry.getKey() ), entry.getValue() );
+ session.put( getKey( entry.getKey() ), entry.getValue() );
}
additions.clear();
}
else
{
//TODO: for a pure temporary conversation, this is unnecessary, optimize it
- for (String name: getNamesFromSession())
+ for ( String name: getNamesFromSession() )
{
- session.removeAttribute( getKey(name) );
+ session.remove( getKey(name) );
}
}
}
1.1 date: 2007/06/10 19:25:58; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/contexts/BasicContext.java
Index: BasicContext.java
===================================================================
//$Id: BasicContext.java,v 1.1 2007/06/10 19:25:58 gavin Exp $
package org.jboss.seam.contexts;
import java.util.HashMap;
import java.util.Map;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.core.Events;
public class BasicContext implements Context
{
private final Map<String, Object> map;
private final ScopeType scope;
public BasicContext(ScopeType scope)
{
this.scope = scope;
this.map = new HashMap<String, Object>();
}
public BasicContext(ScopeType scope, Map<String, Object> map)
{
this.scope = scope;
this.map = map;
}
public ScopeType getType()
{
return scope;
}
public Object get(Class clazz)
{
return get( Component.getComponentName(clazz) );
}
public Object get(String name)
{
return map.get(name);
}
public String[] getNames()
{
return map.keySet().toArray(new String[0]);
}
public boolean isSet(String name)
{
return map.containsKey(name);
}
public void remove(String name)
{
if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.preRemoveVariable." + name);
map.remove(name);
if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.postRemoveVariable." + name);
}
public void set(String name, Object value)
{
if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.preSetVariable." + name);
map.put(name, value);
if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.postSetVariable." + name);
}
public void flush() {}
}
1.1 date: 2007/06/10 19:25:58; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/contexts/SessionContext.java
Index: SessionContext.java
===================================================================
/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.contexts;
import java.util.ArrayList;
import java.util.Map;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Seam;
/**
* @author Gavin King
* @author <a href="mailto:theute at jboss.org">Thomas Heute</a>
* @version $Revision: 1.1 $
*/
public class SessionContext extends BasicContext
{
public SessionContext(Map<String, Object> map)
{
super(ScopeType.SESSION, map);
}
@Override
public String[] getNames()
{
ArrayList<String> results = new ArrayList<String>();
String prefix = ScopeType.CONVERSATION.getPrefix();
for ( String name: super.getNames() )
{
if ( !name.contains(prefix) )
{
results.add(name);
}
}
return results.toArray(new String[]{});
}
@Override
public void flush()
{
for ( String name: getNames() )
{
Object attribute = get(name);
boolean dirty = attribute!=null &&
( Lifecycle.isAttributeDirty(attribute) || Seam.isEntityClass( attribute.getClass() ) );
if ( dirty )
{
set(name, attribute);
}
}
}
}
More information about the jboss-cvs-commits
mailing list