[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