package org.jboss.seam.persistence; import static org.jboss.seam.ComponentType.STATEFUL_SESSION_BEAN; import static org.jboss.seam.ComponentType.STATELESS_SESSION_BEAN; import javax.persistence.EntityManager; import org.jboss.seam.Component.BijectedAttribute; import org.jboss.seam.annotations.intercept.AroundInvoke; import org.jboss.seam.annotations.intercept.Interceptor; import org.jboss.seam.annotations.intercept.PostActivate; import org.jboss.seam.annotations.intercept.PostConstruct; import org.jboss.seam.intercept.AbstractInterceptor; import org.jboss.seam.intercept.InvocationContext; /** * Proxy the EntityManager if injected using @PersistenceContext * * @author Pete Muir */ @Interceptor(stateless=true) public class EntityManagerProxyInterceptor extends AbstractInterceptor { @AroundInvoke public Object aroundInvoke(InvocationContext ic) throws Exception { return ic.proceed(); } @PostActivate public void postActivate(InvocationContext invocation) throws Exception { //just in case the container does some special handling of PC serialization proxyPersistenceContexts(invocation.getTarget()); invocation.proceed(); } @PostConstruct public void postConstruct(InvocationContext invocation) throws Exception { proxyPersistenceContexts(invocation.getTarget()); invocation.proceed(); } private void proxyPersistenceContexts(Object bean) { //wrap any @PersistenceContext attributes in our proxy for ( BijectedAttribute ba: getComponent().getPersistenceContextAttributes() ) { Object object = ba.get(bean); if ( ! ( object instanceof EntityManagerProxy ) && object instanceof EntityManager ) { PersistenceProvider provider = PersistenceProvider.instance(); ba.set( bean, provider.proxyEntityManager( (EntityManager) object ) ); } } } public boolean isInterceptorEnabled() { return getComponent().getType()==STATEFUL_SESSION_BEAN || getComponent().getType()==STATELESS_SESSION_BEAN; } }