[jboss-cvs] jboss-seam/src/ioc/org/jboss/seam/ioc/spring ...

Michael Youngstrom youngm at gmail.com
Wed Mar 28 18:46:50 EDT 2007


  User: myoungstrom
  Date: 07/03/28 18:46:50

  Modified:    src/ioc/org/jboss/seam/ioc/spring     SeamFactoryBean.java
  Added:       src/ioc/org/jboss/seam/ioc/spring    
                        SeamLifecycleUtils.java
                        SeamManagedEntityManagerFactoryBean.java
                        SeamManagedEntityManagerFactory.java
  Log:
  Initial Commit for JBSEAM-991
  
  Revision  Changes    Path
  1.7       +4 -0      jboss-seam/src/ioc/org/jboss/seam/ioc/spring/SeamFactoryBean.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: SeamFactoryBean.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/ioc/org/jboss/seam/ioc/spring/SeamFactoryBean.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -b -r1.6 -r1.7
  --- SeamFactoryBean.java	19 Mar 2007 21:28:29 -0000	1.6
  +++ SeamFactoryBean.java	28 Mar 2007 22:46:50 -0000	1.7
  @@ -110,6 +110,10 @@
      @Override
      public Class getObjectType()
      {
  +      //Incase spring calls getObjectType without calling afterPropertiesSet() 
  +      if(targetSource == null) {
  +         return null;
  +      }
         return targetSource.getTargetClass();
      }
   
  
  
  
  1.1      date: 2007/03/28 22:46:50;  author: myoungstrom;  state: Exp;jboss-seam/src/ioc/org/jboss/seam/ioc/spring/SeamLifecycleUtils.java
  
  Index: SeamLifecycleUtils.java
  ===================================================================
  package org.jboss.seam.ioc.spring;
  
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.contexts.Lifecycle;
  import org.jboss.seam.log.LogProvider;
  import org.jboss.seam.log.Logging;
  import org.springframework.transaction.support.TransactionSynchronizationAdapter;
  import org.springframework.transaction.support.TransactionSynchronizationManager;
  
  /**
   * Utility Class for managing a spring Transactional Seam lifecycle
   * 
   * @author Mike Youngstrom
   * 
   */
  public class SeamLifecycleUtils
  {
     private static final LogProvider log = Logging.getLogProvider(SeamLifecycleUtils.class);
  
     /**
      * Ensure Seam lifecycle Synchronization happens last
      */
     public static final int SEAM_LIFECYCLE_SYNCHRONIZATION_ORDER = Integer.MAX_VALUE;
  
     /**
      * Starts a Seam Call if one is not available and if executing within a Spring
      * Transaction.
      */
     public static void beginTransactionalSeamCall()
     {
        if (ScopeType.APPLICATION.isContextActive())
        {
           log.debug("Application available.  Won't start a new call");
           return;
        }
        if (TransactionSynchronizationManager.isSynchronizationActive())
        {
           TransactionSynchronizationManager
                    .registerSynchronization(new SeamLifecycleSynchronization());
           log.debug("Beginning Transactional Seam Call");
           Lifecycle.beginCall();
           return;
        }
        throw new IllegalStateException(
                 "Seam application context not available and cannot be started.  "
                          + "Seam Managed Persistence Context not available.  "
                          + "Try placing the spring bean call inside of a spring transaction or making the spring bean "
                          + "a Seam Component.");
     }
  
     /**
      * Callback for resource cleanup at the end of a transaction where a Seam
      * Lifecycle was created.
      * 
      * @see org.springframework.transaction.jta.JtaTransactionManager
      */
     private static class SeamLifecycleSynchronization extends TransactionSynchronizationAdapter
     {
  
        @Override
        public int getOrder()
        {
           return SEAM_LIFECYCLE_SYNCHRONIZATION_ORDER;
        }
  
        @Override
        public void afterCompletion(int status)
        {
           log.debug("Ending Transactional Seam Call");
           Lifecycle.endCall();
        }
     }
  }
  
  
  
  1.1      date: 2007/03/28 22:46:50;  author: myoungstrom;  state: Exp;jboss-seam/src/ioc/org/jboss/seam/ioc/spring/SeamManagedEntityManagerFactoryBean.java
  
  Index: SeamManagedEntityManagerFactoryBean.java
  ===================================================================
  package org.jboss.seam.ioc.spring;
  
  import javax.persistence.EntityManagerFactory;
  import javax.persistence.PersistenceException;
  
  import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
  
  /**
   * A FactoryBean the constructs EntityManagerFactories that proxy to a Seam
   * ManagedPersistenceContext.
   * 
   * @author Mike Youngstrom
   */
  public class SeamManagedEntityManagerFactoryBean extends AbstractEntityManagerFactoryBean
  {
     private String persistenceContextName;
  
     @Override
     protected EntityManagerFactory createNativeEntityManagerFactory() throws PersistenceException
     {
        return new SeamManagedEntityManagerFactory(persistenceContextName);
     }
  
     @Override
     public String getPersistenceUnitName()
     {
        String persistenceUnitName = super.getPersistenceUnitName();
        if (persistenceUnitName == null || "".equals(persistenceUnitName))
        {
           return persistenceContextName;
        }
        return persistenceUnitName;
     }
  
     public void setPersistenceContextName(String persistenceContextName)
     {
        this.persistenceContextName = persistenceContextName;
     }
  }
  
  
  1.1      date: 2007/03/28 22:46:50;  author: myoungstrom;  state: Exp;jboss-seam/src/ioc/org/jboss/seam/ioc/spring/SeamManagedEntityManagerFactory.java
  
  Index: SeamManagedEntityManagerFactory.java
  ===================================================================
  package org.jboss.seam.ioc.spring;
  
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  import java.util.Map;
  
  import javax.persistence.EntityManager;
  import javax.persistence.EntityManagerFactory;
  
  import org.jboss.seam.Component;
  import org.jboss.seam.log.LogProvider;
  import org.jboss.seam.log.Logging;
  import org.springframework.util.ClassUtils;
  
  /**
   * An EntityManagerFactory that defers creation and management of an
   * EntityManager to a Seam ManagedPersistenceContext.
   * 
   * @author Mike Youngstrom
   */
  public class SeamManagedEntityManagerFactory implements EntityManagerFactory
  {
     private static final LogProvider log = Logging
              .getLogProvider(SeamManagedEntityManagerFactory.class);
  
     private String persistenceContextName;
  
     private boolean closed = false;
  
     public SeamManagedEntityManagerFactory(String seamPersistenceContextName)
     {
        super();
        if (seamPersistenceContextName == null || "".equals(seamPersistenceContextName))
        {
           throw new IllegalArgumentException("persistenceContextName cannot be null");
        }
        this.persistenceContextName = seamPersistenceContextName;
     }
  
     public void close()
     {
        closed = true;
     }
  
     /**
      * Wraps the Seam ManagedPersistenceContext in a close suppressing proxy and
      * returns.
      */
     public EntityManager createEntityManager()
     {
        if (closed)
        {
           throw new IllegalStateException("EntityManagerFactory is closed");
        }
        log.debug("Returning a Seam Managed PC from createEntityManager()");
        SeamLifecycleUtils.beginTransactionalSeamCall();
        EntityManager em = (EntityManager) Component.getInstance(persistenceContextName);
        return (EntityManager) Proxy.newProxyInstance(getClass().getClassLoader(), ClassUtils
                 .getAllInterfaces(em), new SeamManagedPersistenceContextHandler(em));
     }
  
     public EntityManager createEntityManager(Map properties)
     {
        // Not really sure if I should throw an exception here or just ignore the Map
        throw new UnsupportedOperationException(
                 "Cannot change properties of a Seam ManagedPersistenceContext this way.  "
                          + "This must be done on the ManagedPersistenceContext seam component.");
     }
  
     public boolean isOpen()
     {
        return !closed;
     }
  
     /**
      * EntityManager InvocationHandler used to correctly calls to close and
      * isOpen. We don't want Spring closing the SeamEntityManager only this
      * proxy.
      * 
      * @author Mike Youngstrom
      * 
      */
     public static class SeamManagedPersistenceContextHandler implements InvocationHandler
     {
        private static final LogProvider log = Logging
                 .getLogProvider(SeamManagedPersistenceContextHandler.class);
  
        private EntityManager delegate;
  
        private boolean closed = false;
  
        public SeamManagedPersistenceContextHandler(EntityManager delegate)
        {
           super();
           this.delegate = delegate;
        }
  
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
           if (method.getName().equals("isOpen"))
           {
              return delegate.isOpen() && !closed;
           }
           if (!delegate.isOpen())
           {
              // Defer to delegate error if it's closed.
              try
              {
                 return method.invoke(delegate, args);
              }
              catch (InvocationTargetException ex)
              {
                 throw ex.getTargetException();
              }
           }
           if (closed)
           {
              throw new IllegalStateException("This EntityManager is closed.");
           }
           if (method.getName().equals("close"))
           {
              log.debug("Closing EntityManager Proxy.");
              closed = true;
              return null;
           }
           try
           {
              return method.invoke(delegate, args);
           }
           catch (InvocationTargetException ex)
           {
              throw ex.getTargetException();
           }
        }
     }
  }
  
  
  



More information about the jboss-cvs-commits mailing list