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

Norman Richards norman.richards at jboss.com
Wed Oct 11 23:38:51 EDT 2006


  User: nrichards
  Date: 06/10/11 23:38:51

  Modified:    src/main/org/jboss/seam/util  Persistence.java
  Log:
  JBSEAM-364: use reflection
  
  Revision  Changes    Path
  1.6       +49 -22    jboss-seam/src/main/org/jboss/seam/util/Persistence.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Persistence.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/util/Persistence.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -b -r1.5 -r1.6
  --- Persistence.java	8 Oct 2006 14:01:54 -0000	1.5
  +++ Persistence.java	12 Oct 2006 03:38:51 -0000	1.6
  @@ -2,44 +2,71 @@
   
   import javax.persistence.EntityManager;
   
  -import org.hibernate.FlushMode;
  -import org.hibernate.Session;
  +import java.lang.reflect.Method;
  +import java.lang.reflect.Field;
   
   public class Persistence
   {
  +   private static Object hibernateSession(EntityManager entityManager) {
  +      try {
  +          Object session = entityManager.getDelegate();
  +
  +          if (Reflections.classForName("org.hibernate.Session").isAssignableFrom(session.getClass())) {
  +              return session;
  +          }
  +      } catch (Exception e) {
  +          // eat it
  +      }
  +
  +      return null;
  +   }
   
      public static void setFlushModeManual(EntityManager entityManager)
      {
  -      if (entityManager.getDelegate() instanceof Session)
  -      {
  -         ( (Session) entityManager.getDelegate() ).setFlushMode(FlushMode.NEVER);
  +       Object session = hibernateSession(entityManager);
  +       if (session != null) {           
  +           try {
  +               Class flushMode = Reflections.classForName("org.hibernate.FlushMode");
  +               Method setFlushMode = Reflections.getSetterMethod(session.getClass(), "flushMode");
  +               Object never = Reflections.getField(flushMode,"NEVER").get(null);
  +               Reflections.invokeAndWrap(setFlushMode, session, never);
  +           } catch (Exception e) {
  +               throw new IllegalArgumentException("FlushMode.MANUAL only supported for Hibernate EntityManager", e);
         }
  -      else
  -      {
  +
  +       }  else {
            throw new IllegalArgumentException("FlushMode.MANUAL only supported for Hibernate EntityManager");
         }
  +
      }
   
      public static boolean isDirty(EntityManager entityManager)
      {
  -      if (entityManager.getDelegate() instanceof Session)
  -      {
  -         return ( (Session) entityManager.getDelegate() ).isDirty();
  +       Object session = hibernateSession(entityManager);
  +       if (session != null) {
  +           try {
  +               Method isDirty = session.getClass().getMethod("isDirty", new Class[] {});
  +               return (Boolean) Reflections.invokeAndWrap(isDirty, session);
  +           } catch (NoSuchMethodException e) {
  +               return true; // same asssumption as below
         }
  -      else
  -      {
  +       } else {
            return true; //best we can do!
         }
      }
   
      public static Object getId(Object bean, EntityManager entityManager) 
      {
  -      if (entityManager.getDelegate() instanceof Session)
  -      {
  -         return ( (Session) entityManager.getDelegate() ).getIdentifier(bean);
  +      Object session = hibernateSession(entityManager);
  +      if (session != null) {
  +          try {
  +              Method getIdentifier = session.getClass().getMethod("getIdentifier", 
  +                                                                  new Class[] {Object.class});
  +              return Reflections.invokeAndWrap(getIdentifier, session, bean);
  +          } catch (NoSuchMethodException e) {
  +              throw new IllegalArgumentException("Please use Hibernate as the persistence provider");
         }
  -      else
  -      {
  +      } else {
            throw new IllegalArgumentException("Please use Hibernate as the persistence provider");
         }
         /*for (Class beanClass=entityClass; beanClass!=Object.class; beanClass=beanClass.getSuperclass() )
  
  
  



More information about the jboss-cvs-commits mailing list