[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