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

Gavin King gavin.king at jboss.com
Thu Oct 4 20:43:21 EDT 2007


  User: gavin   
  Date: 07/10/04 20:43:21

  Modified:    src/main/org/jboss/seam/persistence   
                        PersistenceContexts.java
                        HibernatePersistenceProvider.java
                        PersistenceProvider.java
  Log:
  Fix prob when Hibernate is in cp, but is *not* implementing this EM
  
  Revision  Changes    Path
  1.4       +8 -3      jboss-seam/src/main/org/jboss/seam/persistence/PersistenceContexts.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PersistenceContexts.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/PersistenceContexts.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -b -r1.3 -r1.4
  --- PersistenceContexts.java	22 Jun 2007 09:28:51 -0000	1.3
  +++ PersistenceContexts.java	5 Oct 2007 00:43:21 -0000	1.4
  @@ -81,15 +81,20 @@
            PersistenceContextManager pcm = (PersistenceContextManager) Contexts.getConversationContext().get(name);
            if (pcm!=null)
            {
  +            try
  +            {
               pcm.changeFlushMode(flushMode);
            }
  +            catch (UnsupportedOperationException uoe) { 
  +               //swallow 
  +            }
  +         }
         }
      }
      
      public void beforeRender()
      {
  -      PersistenceProvider pp = PersistenceProvider.instance();
  -      flushMode = pp==null ? FlushModeType.MANUAL : pp.getRenderFlushMode();
  +      flushMode = FlushModeType.MANUAL;
         changeFlushModes();
      }
      
  
  
  
  1.24      +147 -61   jboss-seam/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: HibernatePersistenceProvider.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -b -r1.23 -r1.24
  --- HibernatePersistenceProvider.java	4 Oct 2007 01:54:40 -0000	1.23
  +++ HibernatePersistenceProvider.java	5 Oct 2007 00:43:21 -0000	1.24
  @@ -1,11 +1,14 @@
   package org.jboss.seam.persistence;
   import static org.jboss.seam.annotations.Install.FRAMEWORK;
  +
   import java.lang.reflect.Constructor;
   import java.lang.reflect.Field;
   import java.lang.reflect.Method;
   import java.util.Map;
  +
   import javax.persistence.EntityManager;
   import javax.transaction.Synchronization;
  +
   import org.hibernate.EntityMode;
   import org.hibernate.FlushMode;
   import org.hibernate.Hibernate;
  @@ -16,7 +19,6 @@
   import org.hibernate.type.VersionType;
   import org.jboss.seam.ScopeType;
   import org.jboss.seam.Seam;
  -import org.jboss.seam.annotations.FlushModeType;
   import org.jboss.seam.annotations.Install;
   import org.jboss.seam.annotations.Name;
   import org.jboss.seam.annotations.Scope;
  @@ -113,6 +115,10 @@
         {
            return proxySession( (Session) delegate );
         }
  +      catch (NotHibernateException nhe)
  +      {
  +         return super.proxyDelegate(delegate);
  +      }
         catch (Exception e)
         {
            throw new RuntimeException("could not proxy delegate", e);
  @@ -122,13 +128,29 @@
      @Override
      public void setFlushModeManual(EntityManager entityManager)
      {
  +       try
  +       {
         getSession(entityManager).setFlushMode(FlushMode.MANUAL);
      }
  +       catch (NotHibernateException nhe)
  +       {
  +          super.setFlushModeManual(entityManager);
  +       }
  +   }
  +   
      @Override
      public boolean isDirty(EntityManager entityManager)
      {
  +       try
  +       {
         return getSession(entityManager).isDirty();
      }
  +       catch (NotHibernateException nhe)
  +       {
  +          return super.isDirty(entityManager);
  +       }
  +   }
  +   
      @Override
      public Object getId(Object bean, EntityManager entityManager) 
      {
  @@ -136,25 +158,47 @@
         {
            return getSession(entityManager).getIdentifier(bean);
         }
  +       catch (NotHibernateException nhe)
  +       {
  +          return super.getId(bean, entityManager);
  +       }
         catch (TransientObjectException e) 
         {
            return super.getId(bean, entityManager);
         }
      }
  +   
      @Override
      public Object getVersion(Object bean, EntityManager entityManager) 
      {
  +       try
  +       {
         return getVersion( bean, getSession(entityManager) );
      }
  +       catch (NotHibernateException nhe)
  +       {
  +          return super.getVersion(bean, entityManager);
  +       }
  +   }
      
      @Override
      public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
      {
  +       try
  +       {
         checkVersion(bean, getSession(entityManager), oldVersion, version);
      }
  +       catch (NotHibernateException nhe)
  +       {
  +          super.checkVersion(bean, entityManager, oldVersion, version);
  +       }
  +   }
  +   
      @Override
      public void enableFilter(Filter f, EntityManager entityManager)
      {
  +      try
  +      {
         org.hibernate.Filter filter = getSession(entityManager).enableFilter( f.getName() );
         for ( Map.Entry<String, ValueExpression> me: f.getParameters().entrySet() )
         {
  @@ -162,26 +206,68 @@
         }
         filter.validate();
      }
  +      catch (NotHibernateException nhe)
  +      {
  +         super.enableFilter(f, entityManager);
  +      }
  +
  +   }
      
      @Override
      public boolean registerSynchronization(Synchronization sync, EntityManager entityManager)
      {
  +      try
  +      {
         //TODO: just make sure that a Hibernate JPA EntityTransaction
         //      delegates to the Hibernate Session transaction
         getSession(entityManager).getTransaction().registerSynchronization(sync);
         return true;
      }
  +      catch (NotHibernateException nhe)
  +      {
  +         return super.registerSynchronization(sync, entityManager);
  +      }
  +
  +   }
      
      @Override
  -   public FlushModeType getRenderFlushMode()
  +   public String getName(Object bean, EntityManager entityManager)
  +   {
  +      try 
  +      {
  +         return getSession(entityManager).getEntityName(bean);
  +      } 
  +      catch (NotHibernateException nhe)
  +      {
  +         return super.getName(bean, entityManager);
  +      }
  +      catch (TransientObjectException e) 
      {
  -      return FlushModeType.MANUAL;
  +         return super.getName(bean, entityManager);
  +      }
      }
      
  -   private Session getSession(EntityManager entityManager)
  +   @Override
  +   public EntityManager proxyEntityManager(EntityManager entityManager)
  +   {
  +      if (FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR==null)
      {
  -      return (Session) entityManager.getDelegate();
  +         return super.proxyEntityManager(entityManager);
      }
  +      else
  +      {
  +         try
  +         {
  +            return (EntityManager) FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR.newInstance( FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR.invoke(null, entityManager) );
  +         }
  +         catch (Exception e)
  +         {
  +            //throw new RuntimeException("could not proxy FullTextEntityManager", e);
  +            return super.proxyEntityManager(entityManager);
  +         }
  +      }
  +   }
  +   
      public static void checkVersion(Object value, Session session, Object oldVersion, Object version)
      {
         ClassMetadata classMetadata = getClassMetadata(value, session);
  @@ -191,12 +277,14 @@
            throw new StaleStateException("current database version number does not match passivated version number");
         }
      }
  +   
      public static Object getVersion(Object value, Session session)
      {
         ClassMetadata classMetadata = getClassMetadata(value, session);
         return classMetadata!=null && classMetadata.isVersioned() ? 
                  classMetadata.getVersion(value, EntityMode.POJO) : null;
      }
  +   
      private static ClassMetadata getClassMetadata(Object value, Session session)
      {
         Class entityClass = Seam.getEntityClass( value.getClass() );
  @@ -215,48 +303,23 @@
         return classMetadata;
      }
      
  +   /**
  +    * Returns the class of the specified Hibernate entity
  +    */
      @Override
  -   public String getName(Object bean, EntityManager entityManager)
  -   {
  -      try 
  -      {
  -         return getSession(entityManager).getEntityName(bean);
  -      } 
  -      catch (TransientObjectException e) 
  -      {
  -         return super.getName(bean, entityManager);
  -      }
  -   }
  -   @Override
  -   public EntityManager proxyEntityManager(EntityManager entityManager)
  -   {
  -      if (FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR==null)
  -      {
  -         return super.proxyEntityManager(entityManager);
  -      }
  -      else
  +   public Class getBeanClass(Object bean)
         {
            try
            {
  -            return (EntityManager) FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR.newInstance( FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR.invoke(null, entityManager) );
  -         }
  -         catch (Exception e)
  -         {
  -            throw new RuntimeException("could not proxy FullTextEntityManager", e);
  -         }
  +         return super.getBeanClass(bean);
         }
  -   }
  -   
  -   /**
  -    * Returns the class of the specified hibernate bean
  -    */
  -   @Override
  -   public Class getBeanClass(Object bean)
  +      catch (IllegalArgumentException iae)
      {
         return Hibernate.getClass(bean);
      }
  +   }
      
  -   @Override
  +   /*@Override
      public Method getPostLoadMethod(Class beanClass)
      {
         return null;      
  @@ -267,6 +330,7 @@
      {
         return null;
      }
  +   
      @Override
      public Method getPreUpdateMethod(Class beanClass)
      {
  @@ -277,5 +341,27 @@
      public Method getPreRemoveMethod(Class beanClass)
      {
         return null;
  +   }*/
  +   
  +   private Session getSession(EntityManager entityManager)
  +   {
  +      Object delegate = entityManager.getDelegate();
  +      if ( delegate instanceof Session )
  +      {
  +         return (Session) delegate;
  +      }
  +      else
  +      {
  +         throw new NotHibernateException();
      }   
  +   }
  +   
  +   /**
  +    * Occurs when Hibernate is in the classpath, but this particular
  +    * EntityManager is not from Hibernate
  +    * 
  +    * @author Gavin King
  +    *
  +    */
  +   static class NotHibernateException extends IllegalArgumentException {}
   }
  
  
  
  1.22      +6 -13     jboss-seam/src/main/org/jboss/seam/persistence/PersistenceProvider.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PersistenceProvider.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/PersistenceProvider.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -b -r1.21 -r1.22
  --- PersistenceProvider.java	4 Oct 2007 01:54:40 -0000	1.21
  +++ PersistenceProvider.java	5 Oct 2007 00:43:21 -0000	1.22
  @@ -1,14 +1,16 @@
   package org.jboss.seam.persistence;
   import static org.jboss.seam.annotations.Install.BUILT_IN;
  +
   import java.lang.reflect.Method;
   import java.util.Date;
  +
   import javax.persistence.EntityManager;
   import javax.persistence.OptimisticLockException;
   import javax.transaction.Synchronization;
  +
   import org.jboss.seam.Component;
   import org.jboss.seam.Entity;
   import org.jboss.seam.ScopeType;
  -import org.jboss.seam.annotations.FlushModeType;
   import org.jboss.seam.annotations.Install;
   import org.jboss.seam.annotations.Name;
   import org.jboss.seam.annotations.Scope;
  @@ -121,17 +123,6 @@
      {
         return (PersistenceProvider) Component.getInstance(PersistenceProvider.class, ScopeType.STATELESS);
      }
  -   /**
  -    * What flush policy should we use during the render response phase?
  -    * We should not be changing data during the render, so we can 
  -    * optimize performance by choosing not to flush.
  -    * 
  -    * @return COMMIT or MANUAL
  -    */
  -   public FlushModeType getRenderFlushMode()
  -   {
  -      return FlushModeType.COMMIT;
  -   }
      
      /**
       * Wrap the delegate before returning it to the application
  @@ -167,6 +158,7 @@
      {
         return Entity.forClass(beanClass).getPrePersistMethod();
      }
  +   
      public Method getPreUpdateMethod(Class beanClass)
      {
         return Entity.forClass(beanClass).getPreUpdateMethod();
  @@ -176,4 +168,5 @@
      {
         return Entity.forClass(beanClass).getPreRemoveMethod();
      }
  +   
   }
  
  
  



More information about the jboss-cvs-commits mailing list