[jboss-cvs] JBossCache/src-50/org/jboss/cache/pojo ...
Ben Wang
bwang at jboss.com
Wed Aug 2 11:44:19 EDT 2006
User: bwang
Date: 06/08/02 11:44:19
Modified: src-50/org/jboss/cache/pojo PojoUtil.java
Log:
Added interceptor to check for recursive Collection pojo
Revision Changes Path
1.9 +59 -1 JBossCache/src-50/org/jboss/cache/pojo/PojoUtil.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PojoUtil.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/PojoUtil.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- PojoUtil.java 31 Jul 2006 02:44:42 -0000 1.8
+++ PojoUtil.java 2 Aug 2006 15:44:19 -0000 1.9
@@ -8,21 +8,30 @@
package org.jboss.cache.pojo;
import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.aop.Advised;
+import org.jboss.aop.pointcut.ast.ParseException;
import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.advice.AdviceBinding;
import org.jboss.cache.pojo.annotation.TxUndo;
import org.jboss.cache.pojo.observable.Observer;
import org.jboss.cache.pojo.observable.Subject;
import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.ReentrancyStopperInterceptor;
import java.lang.reflect.Field;
/**
* Utility class for method wrappers that we are interested to rollback (i.e., rollback).
* @author Ben Wang
- * @version $Id: PojoUtil.java,v 1.8 2006/07/31 02:44:42 bwang Exp $
+ * @version $Id: PojoUtil.java,v 1.9 2006/08/02 15:44:19 bwang Exp $
*/
public class PojoUtil
{
+ private static final String BindingName = "ReentrancyStopperInterceptor.";
+ private boolean checkRecursive = false;
+
@TxUndo
public void attachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor,
Observer observer)
@@ -72,6 +81,41 @@
// Note that subject interceptor should come before the cache interceptor.
advisor.appendInterceptor(interceptor);
+
+ if(checkRecursive)
+ {
+ // Insert interceptor to detect recursive call
+ Class clazz = pojo.getClass();
+ Field[] fields = clazz.getDeclaredFields();
+ String clazzName = clazz.getName();
+ for(Field field: fields)
+ {
+ String name = field.getName();
+ if(name.contains("$aop")) continue; // this is aop declared field.
+ StringBuffer buf = new StringBuffer().append("set(* ").append(clazzName).append("->").
+ append(name).append(")");
+
+ AdviceBinding binding = null;
+ try
+ {
+ binding = new AdviceBinding(BindingName + name, buf.toString(), null);
+ } catch (ParseException e)
+ {
+ e.printStackTrace();
+ throw new PojoCacheException("PojoUtil._attachInterceptor(): can't parse the field binding: "
+ +e);
+ }
+ binding.addInterceptor(ReentrancyStopperInterceptor.class);
+ getInstanceDomain(pojo).addBinding(binding);
+ }
+ }
+ }
+
+ private Domain getInstanceDomain(Object obj)
+ {
+ Advised advised = ((Advised)obj);
+ InstanceAdvisor advisor = advised._getInstanceAdvisor();
+ return advisor.getDomain();
}
private void _fieldReplaceNewValue(Object obj, Field field, Object newValue)
@@ -99,5 +143,19 @@
}
((Subject)pojo).removeObserver(observer);
+
+ if(checkRecursive)
+ {
+ // Insert interceptor to detect recursive call
+ Class clazz = pojo.getClass();
+ Field[] fields = clazz.getDeclaredFields();
+ String clazzName = clazz.getName();
+ for(Field field: fields)
+ {
+ String name = field.getName();
+ if(name.contains("$aop")) continue; // this is aop declared field.
+ getInstanceDomain(pojo).removeBinding(BindingName +name);
+ }
+ }
}
}
More information about the jboss-cvs-commits
mailing list