[jboss-cvs] jboss-seam/src/main/org/jboss/seam/contexts ...
Gavin King
gavin.king at jboss.com
Thu Jun 21 16:32:00 EDT 2007
User: gavin
Date: 07/06/21 16:32:00
Modified: src/main/org/jboss/seam/contexts EntityBean.java
EntityBeanList.java EntityBeanMap.java
EntityBeanSet.java FacesLifecycle.java
PassivatedEntity.java
ServerConversationContext.java
ServletLifecycle.java Wrapper.java
Log:
make optimistic locking functional again
Revision Changes Path
1.11 +22 -18 jboss-seam/src/main/org/jboss/seam/contexts/EntityBean.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EntityBean.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/EntityBean.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- EntityBean.java 20 Jun 2007 05:34:31 -0000 1.10
+++ EntityBean.java 21 Jun 2007 20:32:00 -0000 1.11
@@ -1,5 +1,6 @@
package org.jboss.seam.contexts;
+import static org.jboss.seam.contexts.PassivatedEntity.passivateEntity;
/**
* Swizzles entities held in the conversation context at
@@ -25,33 +26,36 @@
//TODO: use @Unwrap
public Object getInstance()
{
- if (passivatedEntity==null)
- {
return instance;
}
- else
- {
- return passivatedEntity.toEntityReference();
- }
- }
- public boolean clearDirty()
- {
- if (passivatedEntity==null)
+ public boolean passivate()
{
- if ( !PassivatedEntity.isTransactionRolledBackOrMarkedRollback() )
- {
- passivatedEntity = PassivatedEntity.createPassivatedEntity(instance);
- if (passivatedEntity!=null)
+ /*if (passivatedEntityKey==null) (ie. its new) or the version number changed!
+ {*/
+ if ( PassivatedEntity.isTransactionRolledBackOrMarkedRollback() )
{
- instance = null;
+ passivatedEntity = null;
}
+ else
+ {
+ passivatedEntity = passivateEntity(instance);
+ if (passivatedEntity!=null) instance = null;
}
return true;
- }
+ /*}
else
{
return false;
+ }*/
+ }
+
+ public void activate()
+ {
+ //TODO: if not versioned, we can do this lazily!
+ if (passivatedEntity!=null)
+ {
+ instance = passivatedEntity.toEntityReference(true);
}
}
1.4 +13 -6 jboss-seam/src/main/org/jboss/seam/contexts/EntityBeanList.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EntityBeanList.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/EntityBeanList.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- EntityBeanList.java 20 Jun 2007 05:34:31 -0000 1.3
+++ EntityBeanList.java 21 Jun 2007 20:32:00 -0000 1.4
@@ -24,8 +24,7 @@
this.instance = instance;
}
- //TODO: use @Unwrap
- public Object getInstance()
+ public void activate()
{
if (passivatedEntityList!=null)
{
@@ -34,17 +33,25 @@
PassivatedEntity passivatedEntity = passivatedEntityList.get(i);
if (passivatedEntity!=null)
{
- instance.set( i, passivatedEntity.toEntityReference() );
+ instance.set( i, passivatedEntity.toEntityReference(true) );
}
}
passivatedEntityList = null;
}
+ }
+
+ public Object getInstance()
+ {
return instance;
}
- public boolean clearDirty()
+ public boolean passivate()
+ {
+ if ( PassivatedEntity.isTransactionRolledBackOrMarkedRollback() )
{
- if ( !PassivatedEntity.isTransactionRolledBackOrMarkedRollback() )
+ passivatedEntityList = null;
+ }
+ else
{
passivatedEntityList = new ArrayList<PassivatedEntity>( instance.size() );
boolean found = false;
@@ -54,7 +61,7 @@
PassivatedEntity passivatedEntity = null;
if (value!=null)
{
- passivatedEntity = PassivatedEntity.createPassivatedEntity(value);
+ passivatedEntity = PassivatedEntity.passivateEntity(value);
if (passivatedEntity!=null)
{
if (!found) instance = new ArrayList(instance);
1.4 +9 -5 jboss-seam/src/main/org/jboss/seam/contexts/EntityBeanMap.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EntityBeanMap.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/EntityBeanMap.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- EntityBeanMap.java 20 Jun 2007 05:34:31 -0000 1.3
+++ EntityBeanMap.java 21 Jun 2007 20:32:00 -0000 1.4
@@ -25,21 +25,25 @@
this.instance = instance;
}
- //TODO: use @Unwrap
- public Object getInstance()
+ public void activate()
{
if (passivatedEntityMap!=null)
{
for ( Map.Entry<Object, PassivatedEntity> me: passivatedEntityMap.entrySet() )
{
- instance.put( me.getKey(), me.getValue().toEntityReference() );
+ instance.put( me.getKey(), me.getValue().toEntityReference(true) );
}
passivatedEntityMap = null;
}
+ }
+
+ //TODO: use @Unwrap
+ public Object getInstance()
+ {
return instance;
}
- public boolean clearDirty()
+ public boolean passivate()
{
if ( !PassivatedEntity.isTransactionRolledBackOrMarkedRollback() )
{
@@ -50,7 +54,7 @@
Object value = me.getValue();
if (value!=null)
{
- PassivatedEntity passivatedEntity = PassivatedEntity.createPassivatedEntity(value);
+ PassivatedEntity passivatedEntity = PassivatedEntity.passivateEntity(value);
if (passivatedEntity!=null)
{
if (!found) instance = new HashMap(instance);
1.3 +9 -5 jboss-seam/src/main/org/jboss/seam/contexts/EntityBeanSet.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EntityBeanSet.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/EntityBeanSet.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- EntityBeanSet.java 20 Jun 2007 05:34:31 -0000 1.2
+++ EntityBeanSet.java 21 Jun 2007 20:32:00 -0000 1.3
@@ -26,21 +26,25 @@
this.instance = instance;
}
- //TODO: use @Unwrap
- public Object getInstance()
+ public void activate()
{
if (passivatedEntityList!=null)
{
for ( PassivatedEntity pe: passivatedEntityList )
{
- instance.add( pe.toEntityReference() );
+ instance.add( pe.toEntityReference(true) );
}
passivatedEntityList = null;
}
+ }
+
+ //TODO: use @Unwrap
+ public Object getInstance()
+ {
return instance;
}
- public boolean clearDirty()
+ public boolean passivate()
{
if ( !PassivatedEntity.isTransactionRolledBackOrMarkedRollback() )
{
@@ -50,7 +54,7 @@
{
if (value!=null)
{
- PassivatedEntity passivatedEntity = PassivatedEntity.createPassivatedEntity(value);
+ PassivatedEntity passivatedEntity = PassivatedEntity.passivateEntity(value);
if (passivatedEntity!=null)
{
if (!found) instance = new HashSet(instance);
1.6 +6 -2 jboss-seam/src/main/org/jboss/seam/contexts/FacesLifecycle.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: FacesLifecycle.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/FacesLifecycle.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- FacesLifecycle.java 20 Jun 2007 22:11:30 -0000 1.5
+++ FacesLifecycle.java 21 Jun 2007 20:32:00 -0000 1.6
@@ -61,9 +61,11 @@
Contexts.applicationContext.set( new ApplicationContext( externalContext.getApplicationMap() ) );
Contexts.eventContext.set( new EventContext( externalContext.getRequestMap() ) );
Contexts.sessionContext.set( new SessionContext( externalContext.getSessionMap() ) );
- Contexts.conversationContext.set( new ServerConversationContext( externalContext.getSessionMap() ) );
+ ServerConversationContext conversationContext = new ServerConversationContext( externalContext.getSessionMap() );
+ Contexts.conversationContext.set(conversationContext);
Contexts.pageContext.set(null);
Contexts.businessProcessContext.set(null); //TODO: is this really correct?
+ conversationContext.unflush();
}
public static void endRequest(ExternalContext externalContext)
@@ -114,11 +116,13 @@
public static void resumeConversation(ExternalContext externalContext)
{
+ ServerConversationContext conversationContext = new ServerConversationContext( externalContext.getSessionMap() );
/*Context conversationContext = Init.instance().isClientSideConversations() ?
(Context) new ClientConversationContext() :
(Context) new ServerConversationContext( externalContext.getSessionMap() );*/
- Contexts.conversationContext.set( new ServerConversationContext( externalContext.getSessionMap() ) );
+ Contexts.conversationContext.set(conversationContext);
Contexts.businessProcessContext.set( new BusinessProcessContext() );
+ conversationContext.unflush();
}
public static void resumePage()
1.16 +79 -31 jboss-seam/src/main/org/jboss/seam/contexts/PassivatedEntity.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PassivatedEntity.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/PassivatedEntity.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- PassivatedEntity.java 20 Jun 2007 05:34:31 -0000 1.15
+++ PassivatedEntity.java 21 Jun 2007 20:32:00 -0000 1.16
@@ -39,22 +39,22 @@
this.version = version;
}
- public String getPersistenceContext()
+ private String getPersistenceContext()
{
return persistenceContext;
}
- public Object getId()
+ private Object getId()
{
return id;
}
- public Class<?> getEntityClass()
+ private Class<?> getEntityClass()
{
return entityClass;
}
- public Object toEntityReference()
+ public Object toEntityReference(boolean checkVersion)
{
Object persistenceContext = Component.getInstance( getPersistenceContext() );
if ( persistenceContext==null )
@@ -65,29 +65,25 @@
{
if (persistenceContext instanceof EntityManager)
{
- return getEntityFromEntityManager(persistenceContext);
+ return getEntityFromEntityManager(persistenceContext, checkVersion);
}
else
{
- return getEntityFromHibernate(persistenceContext);
+ return getEntityFromHibernate(persistenceContext, checkVersion);
}
}
}
- private Object getEntityFromHibernate(Object persistenceContext)
+ private Object getEntityFromHibernate(Object persistenceContext, boolean checkVersion)
{
//TODO: split this out to somewhere to isolate the Hibernate dependency!!
Session session = (Session) persistenceContext;
if ( session.isOpen() )
{
Object result = session.load( getEntityClass(), (Serializable) getId() );
- if (result!=null)
+ if (result!=null && checkVersion)
{
- Object version = HibernatePersistenceProvider.getVersion(result, session);
- if (version!=null)
- {
- HibernatePersistenceProvider.checkVersion(result, session, this.version, version);
- }
+ checkVersion(session, result);
}
return result;
}
@@ -97,13 +93,34 @@
}
}
- private Object getEntityFromEntityManager(Object persistenceContext)
+ private void checkVersion(Session session, Object result)
+ {
+ Object version = HibernatePersistenceProvider.getVersion(result, session);
+ if (version!=null)
+ {
+ HibernatePersistenceProvider.checkVersion(result, session, this.version, version);
+ }
+ }
+
+ private Object getEntityFromEntityManager(Object persistenceContext, boolean checkVersion)
{
EntityManager em = (EntityManager) persistenceContext;
if ( em.isOpen() )
{
Object result = em.getReference( getEntityClass(), getId() );
- if (result!=null)
+ if (result!=null && checkVersion)
+ {
+ checkVersion(em, result);
+ }
+ return result;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ private void checkVersion(EntityManager em, Object result)
{
Object version = PersistenceProvider.instance().getVersion(result, em);
if (version!=null)
@@ -111,15 +128,24 @@
PersistenceProvider.instance().checkVersion(result, em, this.version, version);
}
}
- return result;
- }
- else
+
+ /*public static Object unpassivateEntityAndCheckVersion(String key)
{
- return null;
+ return unpassivateEntity(key, true);
}
+
+ public static Object unpassivateEntity(String key)
+ {
+ return unpassivateEntity(key, false);
}
- public static PassivatedEntity createPassivatedEntity(Object value)
+ private static Object unpassivateEntity(String key, boolean checkVersion)
+ {
+ PassivatedEntity passivatedEntity = (PassivatedEntity) Contexts.getConversationContext().get(key);
+ return passivatedEntity==null ? null : passivatedEntity.toEntityReference(checkVersion);
+ }*/
+
+ public static PassivatedEntity passivateEntity(Object value)
{
Class entityClass = Seam.getEntityClass( value.getClass() );
if (entityClass!=null)
@@ -127,20 +153,42 @@
for ( String persistenceContextName: PersistenceContexts.instance().getTouchedContexts() )
{
Object persistenceContext = Component.getInstance(persistenceContextName);
- PassivatedEntity result;
+ return createPassivatedEntity(value, entityClass, persistenceContextName, persistenceContext);
+ }
+ }
+ return null;
+ }
+
+ private static PassivatedEntity createPassivatedEntity(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
+ {
if (persistenceContext instanceof EntityManager)
{
- result = createUsingEntityManager(value, entityClass, persistenceContextName, persistenceContext);
+ return createUsingEntityManager(value, entityClass, persistenceContextName, persistenceContext);
}
else
{
- result = createUsingHibernate(value, entityClass, persistenceContextName, persistenceContext);
- }
- if (result!=null) return result;
+ return createUsingHibernate(value, entityClass, persistenceContextName, persistenceContext);
}
}
+
+ /*private static String storeConversationContext(PassivatedEntity result)
+ {
+ if (result==null)
+ {
return null;
}
+ else
+ {
+ String key = result.getKey();
+ Contexts.getConversationContext().set( key, result );
+ return key;
+ }
+ }
+
+ private String getKey()
+ {
+ return "org.jboss.seam.passivatedEntity." + entityClass.getName() + '#' + getId();
+ }*/
private static PassivatedEntity createUsingHibernate(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
{
1.30 +20 -1 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.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- ServerConversationContext.java 20 Jun 2007 08:23:17 -0000 1.29
+++ ServerConversationContext.java 21 Jun 2007 20:32:00 -0000 1.30
@@ -222,6 +222,19 @@
removals.addAll( getNamesFromSession() );
}
+ public void unflush()
+ {
+ for ( String name: getNamesFromSession() )
+ {
+ String key = getKey(name);
+ Object attribute = session.get(key);
+ if ( attribute!=null && attribute instanceof Wrapper )
+ {
+ ( (Wrapper) attribute ).activate();
+ }
+ }
+ }
+
/**
* Propagate additions and removals to the HttpSession if
* the current conversation is long-running, or remove all
@@ -239,7 +252,7 @@
{
String key = getKey(name);
Object attribute = session.get(key);
- if ( attribute!=null && Contexts.isAttributeDirty(attribute) )
+ if ( attribute!=null && isAttributeDirty(attribute) )
{
session.put(key, attribute);
}
@@ -267,6 +280,12 @@
}
}
+ private boolean isAttributeDirty(Object attribute)
+ {
+ return Contexts.isAttributeDirty(attribute) ||
+ ( attribute instanceof Wrapper && ( (Wrapper) attribute ).passivate() );
+ }
+
private boolean isCurrent()
{
return id==null || id.equals( Manager.instance().getCurrentConversationId() );
1.3 +3 -2 jboss-seam/src/main/org/jboss/seam/contexts/ServletLifecycle.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ServletLifecycle.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/ServletLifecycle.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- ServletLifecycle.java 20 Jun 2007 22:11:30 -0000 1.2
+++ ServletLifecycle.java 21 Jun 2007 20:32:00 -0000 1.3
@@ -131,9 +131,10 @@
public static void resumeConversation(HttpServletRequest request)
{
- Context conversationContext = new ServerConversationContext( new ServletRequestSessionMap(request) );
- Contexts.conversationContext.set( conversationContext );
+ ServerConversationContext conversationContext = new ServerConversationContext( new ServletRequestSessionMap(request) );
+ Contexts.conversationContext.set(conversationContext);
Contexts.businessProcessContext.set( new BusinessProcessContext() );
+ conversationContext.unflush();
}
}
1.3 +3 -2 jboss-seam/src/main/org/jboss/seam/contexts/Wrapper.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Wrapper.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/Wrapper.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- Wrapper.java 20 Jun 2007 05:34:31 -0000 1.2
+++ Wrapper.java 21 Jun 2007 20:32:00 -0000 1.3
@@ -1,8 +1,9 @@
package org.jboss.seam.contexts;
-import org.jboss.seam.core.Mutable;
-interface Wrapper extends Mutable
+interface Wrapper
{
public Object getInstance();
+ public void activate();
+ public boolean passivate();
}
More information about the jboss-cvs-commits
mailing list