package org.jboss.seam.persistence;
import static org.jboss.seam.ComponentType.STATEFUL_SESSION_BEAN;
import static org.jboss.seam.ComponentType.STATELESS_SESSION_BEAN;
import org.hibernate.Session;
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;
import org.jboss.seam.util.Reflections;
/**
* Proxy the Hibernate Session if injected using @PersistenceContext
*
* @author Pete Muir
*
*/
@Interceptor(stateless=true)
public class HibernateSessionProxyInterceptor 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 HibernateSessionProxy) && object instanceof Session)
{
ba.set( bean, HibernatePersistenceProvider.proxySession( (Session) object ) );
}
}
}
public boolean isInterceptorEnabled()
{
return (getComponent().getType()==STATEFUL_SESSION_BEAN || getComponent().getType()==STATELESS_SESSION_BEAN) && Reflections.isClassAvailable("org.hibernate.Session");
}
}