package org.jboss.cache.invalidation.triggers;
import org.jboss.metadata.XmlLoadable;
import org.jboss.metadata.MetaData;
import org.w3c.dom.Element;
public class EntityBeanCacheBatchInvalidatorInterceptor
extends org.jboss.ejb.plugins.AbstractInterceptor
implements XmlLoadable
{
protected boolean doCacheInvalidations = true;
protected org.jboss.cache.invalidation.InvalidationManagerMBean invalMgr = null;
protected org.jboss.cache.invalidation.InvalidationGroup ig = null;
protected org.jboss.ejb.EntityContainer container = null;
public boolean invalidateRelated;
public void start() throws Exception
{
org.jboss.metadata.EntityMetaData emd = ((org.jboss.metadata.EntityMetaData)this.getContainer ().getBeanMetaData ());
doCacheInvalidations = emd.doDistributedCacheInvalidations ();
if (doCacheInvalidations)
{
String groupName = emd.getDistributedCacheInvalidationConfig ().getInvalidationGroupName ();
String imName = emd.getDistributedCacheInvalidationConfig ().getInvalidationManagerName ();
this.invalMgr = (org.jboss.cache.invalidation.InvalidationManagerMBean)org.jboss.system.Registry.lookup (imName);
this.ig = this.invalMgr.getInvalidationGroup (groupName);
}
}
public void stop()
{
this.invalMgr = null;
if(ig != null)
{
this.ig.removeReference (); this.ig = null;
}
}
protected boolean changed (org.jboss.invocation.Invocation mi, org.jboss.ejb.EntityEnterpriseContext ctx) throws Exception
{
if (ctx.getId() == null) return true;
if(!container.isReadOnly())
{
java.lang.reflect.Method method = mi.getMethod();
if(method == null ||
!container.getBeanMetaData().isMethodReadOnly(method.getName()))
{
return invalidateRelated ?
container.getPersistenceManager().isModified(ctx) :
container.getPersistenceManager().isStoreRequired(ctx);
}
}
return false;
}
public Object invoke(org.jboss.invocation.Invocation mi) throws Exception
{
if (doCacheInvalidations)
{
org.jboss.ejb.EntityEnterpriseContext ctx = (org.jboss.ejb.EntityEnterpriseContext)mi.getEnterpriseContext();
Object id = ctx.getId();
javax.transaction.Transaction tx = mi.getTransaction();
if (tx != null && tx.getStatus() != javax.transaction.Status.STATUS_NO_TRANSACTION)
{
Object retVal = getNext().invoke(mi);
if (changed(mi, ctx))
{
org.jboss.cache.invalidation.InvalidationsTxGrouper.registerInvalidationSynchronization (tx, this.ig, (java.io.Serializable)id);
}
return retVal;
}
else
{ Object result = getNext().invoke(mi);
if (changed(mi, ctx))
{
org.jboss.cache.invalidation.InvalidationsTxGrouper.registerInvalidationSynchronization (tx, this.ig, (java.io.Serializable)id);
}
return result;
}
}
else
{
return getNext().invoke(mi);
}
}
public void setContainer(org.jboss.ejb.Container container) { this.container = (org.jboss.ejb.EntityContainer)container; }
public org.jboss.ejb.Container getContainer() { return container; }
public void importXml(Element element) throws Exception
{
String str = MetaData.getElementAttribute(element, "invalidate-related");
invalidateRelated = (str == null ? true : Boolean.valueOf(str).booleanValue());
if(log.isTraceEnabled())
{
log.trace("invalidate-related: " + invalidateRelated);
}
}
}