[jboss-cvs] jboss-seam/src/main/org/jboss/seam/contexts ...

Gavin King gavin.king at jboss.com
Mon Jun 18 16:38:22 EDT 2007


  User: gavin   
  Date: 07/06/18 16:38:22

  Modified:    src/main/org/jboss/seam/contexts  PassivatedEntity.java
  Log:
  JBSEAM-1489
  
  Revision  Changes    Path
  1.13      +120 -68   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.12
  retrieving revision 1.13
  diff -u -b -r1.12 -r1.13
  --- PassivatedEntity.java	18 Jun 2007 15:53:55 -0000	1.12
  +++ PassivatedEntity.java	18 Jun 2007 20:38:22 -0000	1.13
  @@ -3,7 +3,6 @@
   import java.io.Serializable;
   
   import javax.persistence.EntityManager;
  -import javax.persistence.OptimisticLockException;
   
   import org.hibernate.Session;
   import org.jboss.seam.Component;
  @@ -64,39 +63,60 @@
         }
         else
         {
  -         Object result = null;
  -         Object version = null;
            if (persistenceContext instanceof EntityManager)
            {
  -            EntityManager em = (EntityManager) persistenceContext;
  -            if ( em.isOpen() )
  -            {
  -               result = em.getReference( getEntityClass(), getId() );
  -               if (result!=null)
  +            return getEntityFromEntityManager(persistenceContext);
  +         }
  +         else
                  {
  -                  version = PersistenceProvider.instance().getVersion(result, em);
  +            return getEntityFromHibernate(persistenceContext);
                  }
               }
            }
  -         else
  +
  +   private Object getEntityFromHibernate(Object persistenceContext)
            {
               //TODO: split this out to somewhere to isolate the Hibernate dependency!!
               Session session = (Session) persistenceContext;
               if ( session.isOpen() )
               {
  -               result = session.load( getEntityClass(), (Serializable) getId() );
  +         Object result = session.load( getEntityClass(), (Serializable) getId() );
                  if (result!=null)
                  {
  -                  version = HibernatePersistenceProvider.getVersion(result, session);
  +            Object version = HibernatePersistenceProvider.getVersion(result, session);
  +            if (version!=null) 
  +            {
  +               HibernatePersistenceProvider.checkVersion(result, session, this.version, version);
                  }
               }
  +         return result;
            }
  -         if ( result!=null && this.version!=null && !this.version.equals(version) )
  +      else
            {
  -            throw new OptimisticLockException("current database version number does not match passivated version number");
  +         return null;
  +      }
  +   }
  +
  +   private Object getEntityFromEntityManager(Object persistenceContext)
  +   {
  +      EntityManager em = (EntityManager) persistenceContext;
  +      if ( em.isOpen() )
  +      {
  +         Object result = em.getReference( getEntityClass(), getId() );
  +         if (result!=null)
  +         {
  +            Object version = PersistenceProvider.instance().getVersion(result, em);
  +            if (version!=null) 
  +            {
  +               PersistenceProvider.instance().checkVersion(result, em, this.version, version);
  +            }
            }
            return result;
         }
  +      else
  +      {
  +         return null;
  +      }
      }
   
      public static PassivatedEntity createPassivatedEntity(Object value)
  @@ -107,31 +127,40 @@
            for ( String persistenceContextName: PersistenceContexts.instance().getTouchedContexts() )
            {
               Object persistenceContext = Component.getInstance(persistenceContextName);
  -            boolean managed;
  -            Object id = null;
  -            Object version = null;
  +            PassivatedEntity result;
               if (persistenceContext instanceof EntityManager)
               {
  -               EntityManager em = (EntityManager) persistenceContext;
  -               try
  -               {
  -                  managed = em.isOpen() && em.contains(value);
  +               result = createUsingEntityManager(value, entityClass, persistenceContextName, persistenceContext);
                  }
  -               catch (RuntimeException re) 
  +            else
                  {
  -                  //workaround for bug in HEM! //TODO; deleteme
  -                  managed = false;
  +               result = createUsingHibernate(value, entityClass, persistenceContextName, persistenceContext);
                  }
  -               if (managed)
  -               {
  -                  id = PersistenceProvider.instance().getId(value, em);
  -                  version = PersistenceProvider.instance().getVersion(value, em);
  +            if (result!=null) return result;
                  }
               }
  -            else
  +      return null;
  +   }
  +
  +   private static PassivatedEntity createUsingHibernate(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
               {
                  //TODO: split this out to somewhere to isolate the Hibernate dependency!!
                  Session session = (Session) persistenceContext;
  +      if ( isManaged(value, session) )
  +      {
  +         Object id = session.getIdentifier(value);
  +         Object version = HibernatePersistenceProvider.getVersion(value, session);
  +         return create(entityClass, persistenceContextName, id, version);
  +      }
  +      else
  +      {
  +         return null;
  +      }
  +   }
  +
  +   private static boolean isManaged(Object value, Session session)
  +   {
  +      boolean managed;
                  try
                  {
                     managed = session.isOpen() && session.contains(value);
  @@ -141,13 +170,40 @@
                     //just in case! //TODO; deleteme
                     managed = false;
                  }
  -               if (managed)
  +      return managed;
  +   }
  +
  +   private static PassivatedEntity createUsingEntityManager(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
  +   {
  +      EntityManager em = (EntityManager) persistenceContext;
  +      if ( isManaged(value, em) )
  +      {
  +         Object id = PersistenceProvider.instance().getId(value, em);
  +         Object version = PersistenceProvider.instance().getVersion(value, em);
  +         return create(entityClass, persistenceContextName, id, version);
  +      }
  +      else
  +      {
  +         return null;
  +      }
  +   }
  +
  +   private static boolean isManaged(Object value, EntityManager em)
                  {
  -                  id = session.getIdentifier(value);
  -                  version = HibernatePersistenceProvider.getVersion(value, session);
  +      boolean managed;
  +      try
  +      {
  +         managed = em.isOpen() && em.contains(value);
                  }
  +      catch (RuntimeException re) 
  +      {
  +         //workaround for bug in HEM! //TODO; deleteme
  +         managed = false;
               }
  -            if (managed)
  +      return managed;
  +   }
  +
  +   private static PassivatedEntity create(Class entityClass, String persistenceContextName, Object id, Object version)
               {
                  if (id==null)
                  {
  @@ -159,10 +215,6 @@
                     return new PassivatedEntity(id, version, entityClass, persistenceContextName);
                  }
               }
  -         }
  -      }
  -      return null;
  -   }
   
      public static boolean isTransactionRolledBackOrMarkedRollback()
      {
  
  
  



More information about the jboss-cvs-commits mailing list