[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