[jboss-cvs] JBossCache/src-50/org/jboss/cache/pojo/impl ...

Ben Wang bwang at jboss.com
Fri Jul 14 12:35:48 EDT 2006


  User: bwang   
  Date: 06/07/14 12:35:48

  Modified:    src-50/org/jboss/cache/pojo/impl       
                        AdvisedPojoHandler.java CollectionClassHandler.java
                        InternalHelper.java ObjectGraphHandler.java
                        PojoCacheDelegate.java PojoCacheImpl.java
                        SerializableObjectHandler.java
  Log:
  Created a new AdvisedPojoHandler to handle specifically Advised pojo get/put/remove.
  
  Revision  Changes    Path
  1.2       +173 -10   JBossCache/src-50/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: AdvisedPojoHandler.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  --- AdvisedPojoHandler.java	14 Jul 2006 01:46:48 -0000	1.1
  +++ AdvisedPojoHandler.java	14 Jul 2006 16:35:48 -0000	1.2
  @@ -12,6 +12,10 @@
   import org.jboss.cache.pojo.PojoTreeCache;
   import org.jboss.cache.pojo.CachedType;
   import org.jboss.cache.pojo.PojoReference;
  +import org.jboss.cache.pojo.PojoUtil;
  +import org.jboss.cache.pojo.observable.Observer;
  +import org.jboss.cache.pojo.memory.FieldPersistentReference;
  +import org.jboss.cache.pojo.util.AopUtil;
   import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
   import org.jboss.cache.pojo.interceptors.dynamic.BaseInterceptor;
   import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
  @@ -22,19 +26,23 @@
   import org.jboss.aop.advice.Interceptor;
   import org.jboss.aop.InstanceAdvisor;
   import org.jboss.aop.Advised;
  +import org.jboss.aop.ClassInstanceAdvisor;
  +import org.jboss.aop.Advisor;
   
   import java.util.Map;
   import java.util.List;
   import java.util.Set;
   import java.util.Iterator;
   import java.util.Collection;
  +import java.util.HashMap;
  +import java.lang.reflect.Field;
   
   /**
    * Handling the Collection class management.
    *
    * @author Ben Wang
    *         Date: Aug 4, 2005
  - * @version $Id: AdvisedPojoHandler.java,v 1.1 2006/07/14 01:46:48 bwang Exp $
  + * @version $Id: AdvisedPojoHandler.java,v 1.2 2006/07/14 16:35:48 bwang Exp $
    */
   class AdvisedPojoHandler
   {
  @@ -43,20 +51,25 @@
      private PojoCacheImpl pCache_;
      private InternalHelper internal_;
      private ObjectGraphHandler graphHandler_;
  +   private PojoUtil util_;
  +   private Observer observer_;
   
      public AdvisedPojoHandler(PojoCacheImpl pCache, InternalHelper internal,
  -                             ObjectGraphHandler graphHandler)
  +                             ObjectGraphHandler graphHandler, PojoUtil util, Observer observer)
      {
         pCache_ = pCache;
         cache_ = (PojoTreeCache)pCache_.getCache();
         internal_ = internal;
         graphHandler_ = graphHandler;
  +      util_ = util;
  +      observer_ = observer;
      }
   
  -   Object get(Fqn fqn, Class clazz, CachedType type, PojoReference pojoReference)
  +   public Object get(Fqn fqn, Class clazz, PojoReference pojoReference)
              throws CacheException
      {
  -      Object obj;
  +      CachedType type = pCache_.getCachedType(clazz);
  +      Object obj = null;
         try
         {
            obj = clazz.newInstance();
  @@ -70,18 +83,168 @@
         InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
         CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
         interceptor.setAopInstance(pojoReference);
  -//      util_.attachInterceptor(obj, advisor, interceptor, observer_);
  -      return null;
  +      util_.attachInterceptor(obj, advisor, interceptor, observer_);
  +      return obj;
      }
   
  +   void put(Fqn fqn, Object obj) throws CacheException
  +   {
  +      CachedType type = pCache_.getCachedType(obj.getClass());
  +      // add interceptor
  +      InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
  +      if (advisor == null)
  +         throw new RuntimeException("_putObject(): InstanceAdvisor is null for: " + obj);
  +
  +      // Step Check for cross references
  +      Interceptor interceptor = AopUtil.findCacheInterceptor(advisor);
  +      if (interceptor != null && graphHandler_.put(fqn, interceptor, type))
  +      {
  +         // found cross references
  +         return;
  +      }
  +
  +      // We have a clean slate then.
  +      _regularPutObject(fqn, obj, advisor, type);
  +   }
  +
  +   void remove(Fqn fqn) throws CacheException
  +   {
  +   }
  +
  +
  +
  +   /*****************************************************************************************
  +    * private methods
  +    *******************************************************************************************/
  +
  +   private void _regularPutObject(Fqn fqn, Object obj, InstanceAdvisor advisor, CachedType type)
  +           throws CacheException
  +   {
  +      // TODO workaround for deserialiased objects
  +      if (advisor == null)
  +      {
  +         advisor = new ClassInstanceAdvisor(obj);
  +         ((Advised) obj)._setInstanceAdvisor(advisor);
  +      }
  +
  +      // Let's do batch update via Map instead
  +      Map map = new HashMap();
  +      // Always initialize the ref count so we can mark this as an AopNode.
  +      PojoReference pojoReference = InternalHelper.initializeAopInstance();
  +      // Insert interceptor at runtime
  +      CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
  +      interceptor.setAopInstance(pojoReference);
  +      util_.attachInterceptor(obj, advisor, interceptor, observer_);
  +
  +      map.put(PojoReference.KEY, pojoReference);
  +      // This is put into map first.
  +      InternalHelper.putAopClazz(type.getType(), map);
  +      // we will do it recursively.
  +      // Map of sub-objects that are non-primitive
  +      Map subPojoMap = new HashMap();
  +      boolean hasFieldAnnotation = hasAnnotation(obj.getClass(), ((Advised) obj)._getAdvisor(), type);
  +
  +      for (Iterator i = type.getFields().iterator(); i.hasNext();)
  +      {
  +         Field field = (Field) (((FieldPersistentReference) i.next())).get();
  +         Object value = null;
  +         try
  +         {
  +            value = field.get(obj);
  +         }
  +         catch (IllegalAccessException e)
  +         {
  +            throw new CacheException("field access failed", e);
  +         }
  +         CachedType fieldType = pCache_.getCachedType(field.getType());
  +         // check for non-replicatable types
  +         if (CachedType.isPrimitiveNonReplicatable(field))
  +         {
  +            continue;
  +         }
  +
  +         if (hasFieldAnnotation)
  +         {
  +            if (CachedType.hasTransientAnnotation(field, ((Advised) obj)._getAdvisor()))
  +            {
  +               continue;
  +            }
  +         }
  +
  +         // we simply treat field that has @Serializable as a primitive type.
  +         if (fieldType.isImmediate() ||
  +                 (hasFieldAnnotation &&
  +                         CachedType.hasSerializableAnnotation(field, ((Advised) obj)._getAdvisor())))
  +         {
  +            // switched using batch update
  +            map.put(field.getName(), value);
  +         } else
  +         {
  +            subPojoMap.put(field, value);
  +         }
  +      }
  +
  +      // Use option to skip locking since we have parent lock already.
  +      cache_.put(fqn, map, internal_.getLockOption());
  +      // This is in-memory operation only
  +      InternalHelper.setPojo(pojoReference, obj);
   
  -   boolean put(Fqn fqn, Object obj) throws CacheException
  +      for (Object o : subPojoMap.keySet())
      {
  -      return false;
  +         Field field = (Field) o;
  +         Object value = subPojoMap.get(field);
  +         Fqn tmpFqn = new Fqn(fqn, field.getName());
  +         pCache_.putObject(tmpFqn, value);
  +         // If it is Collection classes, we replace it with dynamic proxy.
  +         // But we will have to ignore it if value is null
  +         if (value instanceof Map || value instanceof List || value instanceof Set)
  +         {
  +            Object newValue = pCache_.getObject(tmpFqn);
  +            util_.collectionReplaceWithProxy(obj, field, newValue);
  +         }
      }
   
  -   boolean remove(Fqn fqn) throws CacheException
  +      // Need to make sure this is behind put such that obj.toString is done correctly.
  +      if (log.isDebugEnabled())
      {
  -      return false;
  +         log.debug("_regularPutObject(): inserting with fqn: " + fqn);
      }
  +   }
  +
  +   private static boolean hasAnnotation(Class clazz, Advisor advisor, CachedType type)
  +   {
  +      return CachedType.hasAnnotation(clazz, advisor, type);
  +   }
  +
  +
  +   public void remove(Fqn fqn, Object result, Class clazz
  +                ) throws CacheException
  +   {
  +      CachedType type = pCache_.getCachedType(clazz);
  +      for (Iterator i = type.getFields().iterator(); i.hasNext();)
  +      {
  +         Field field = (Field) (((FieldPersistentReference) i.next())).get();
  +         CachedType fieldType = pCache_.getCachedType(field.getType());
  +         Object value = null;
  +         if (!fieldType.isImmediate())
  +         {
  +            value = pCache_.removeObject(new Fqn(fqn, field.getName()));
  +
  +            // Check for Collection. If it is, we need to reset the original reference.
  +/*
  +            if ((value instanceof Map || value instanceof List || value instanceof Set) &&
  +                 (value instanceof ClassProxy))
  +            {
  +               Interceptor interceptor = CollectionInterceptorUtil.getInterceptor((ClassProxy) value);
  +               Object origValue = ((AbstractCollectionInterceptor)interceptor).getCurrecntCopy();
  +               util_.collectionReplaceWithProxy(value, field, origValue);
  +            }
  +*/
  +         }
  +      }
  +
  +      // batch remove
  +      cache_.removeData(fqn);
  +   }
  +
   }
  
  
  
  1.3       +8 -19     JBossCache/src-50/org/jboss/cache/pojo/impl/CollectionClassHandler.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: CollectionClassHandler.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/CollectionClassHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- CollectionClassHandler.java	14 Jul 2006 01:46:48 -0000	1.2
  +++ CollectionClassHandler.java	14 Jul 2006 16:35:48 -0000	1.3
  @@ -31,7 +31,7 @@
    *
    * @author Ben Wang
    *         Date: Aug 4, 2005
  - * @version $Id: CollectionClassHandler.java,v 1.2 2006/07/14 01:46:48 bwang Exp $
  + * @version $Id: CollectionClassHandler.java,v 1.3 2006/07/14 16:35:48 bwang Exp $
    */
   class CollectionClassHandler
   {
  @@ -50,7 +50,7 @@
         graphHandler_ = graphHandler;
      }
   
  -   Object get(Fqn fqn, Class clazz)
  +   Object get(Fqn fqn, Class clazz, PojoReference pojoReference)
              throws CacheException
      {
         Object obj = null;
  @@ -78,7 +78,7 @@
      }
   
   
  -   boolean put(Fqn fqn, Object obj) throws CacheException
  +   void put(Fqn fqn, Object obj) throws CacheException
      {
         boolean isCollection = false;
   
  @@ -110,7 +110,7 @@
                  // Let's check for object graph, e.g., multiple and circular references first
                  if (graphHandler_.put(fqn, interceptor, type))
                  { // found cross references
  -                  return true;
  +                  return;
                  }
               } else
               {
  @@ -119,7 +119,7 @@
                  interceptor.attach(fqn, copyToCache);
                  internal_.putAopClazz(fqn, type.getType());
                  internal_.setPojo(fqn, obj);
  -               return true; // we are done
  +               return; // we are done
               }
            }
         }
  @@ -232,20 +232,10 @@
   
            InternalHelper.setPojo(pojoReference, obj);
         }
  -      return isCollection;
      }
   
  -   boolean remove(Fqn fqn
  -   ) throws CacheException
  +   void remove(Fqn fqn, Object obj) throws CacheException
      {
  -      Class clazz = internal_.peekAopClazz(fqn);
  -
  -      if (!Map.class.isAssignableFrom(clazz) && !Collection.class.isAssignableFrom(clazz))
  -      {
  -         return false;
  -      }
  -
  -      Object obj = pCache_.getObject(fqn);
         if (!(obj instanceof ClassProxy))
         {
            throw new RuntimeException("CollectionClassHandler.collectionRemoveObject(): object is not a proxy :" + obj);
  @@ -253,8 +243,7 @@
   
         Interceptor interceptor = CollectionInterceptorUtil.getInterceptor((ClassProxy) obj);
         boolean removeFromCache = true;
  -      ((AbstractCollectionInterceptor) interceptor).detach(removeFromCache); // detach the interceptor. This will trigger a copy and remove.
  -
  -      return true;
  +      // detach the interceptor. This will trigger a copy and remove.
  +      ((AbstractCollectionInterceptor) interceptor).detach(removeFromCache);
      }
   }
  
  
  
  1.3       +10 -17    JBossCache/src-50/org/jboss/cache/pojo/impl/InternalHelper.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: InternalHelper.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/InternalHelper.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- InternalHelper.java	13 Jul 2006 16:53:12 -0000	1.2
  +++ InternalHelper.java	14 Jul 2006 16:35:48 -0000	1.3
  @@ -293,11 +293,9 @@
         cache_.remove(fqn, InternalConstant.CLASS_INTERNAL);
      }
   
  -   void cleanUp(Fqn fqn, boolean evict) throws CacheException
  +   void cleanUp(Fqn fqn) throws CacheException
      {
         // We can't do a brute force remove anymore?
  -      if (!evict)
  -      {
            if (!cache_._get(fqn).hasChildren())
            {
               // remove everything
  @@ -311,11 +309,6 @@
                  log.trace("cleanup(): fqn: " + fqn + " is not empty. That means it has sub-pojos. Will not remove node");
               }
            }
  -      } else
  -      {
  -         // This has to use plainEvict method otherwise it is recursively calling aop version of evict.
  -//         cache_.plainEvict(fqn);
  -      }
      }
   
      String createIndirectFqn(String fqn) throws CacheException
  
  
  
  1.3       +6 -9      JBossCache/src-50/org/jboss/cache/pojo/impl/ObjectGraphHandler.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ObjectGraphHandler.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/ObjectGraphHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- ObjectGraphHandler.java	14 Jul 2006 01:46:48 -0000	1.2
  +++ ObjectGraphHandler.java	14 Jul 2006 16:35:48 -0000	1.3
  @@ -27,7 +27,7 @@
    *
    * @author Ben Wang
    *         Date: Aug 4, 2005
  - * @version $Id: ObjectGraphHandler.java,v 1.2 2006/07/14 01:46:48 bwang Exp $
  + * @version $Id: ObjectGraphHandler.java,v 1.3 2006/07/14 16:35:48 bwang Exp $
    */
   class ObjectGraphHandler
   {
  @@ -96,7 +96,7 @@
         return true;
      }
   
  -   boolean remove(Fqn fqn, boolean removeCacheInterceptor, Object pojo, boolean evict)
  +   boolean remove(Fqn fqn, Object pojo)
              throws CacheException
      {
         boolean isTrue = false;
  @@ -112,8 +112,8 @@
               log.debug("remove(): removing object fqn: " + fqn + " but is actually from ref fqn: " + refFqn
                       + " Will just de-reference it.");
            }
  -         removeFromReference(fqn, refFqn, removeCacheInterceptor, evict);
  -         internal_.cleanUp(fqn, evict);
  +         removeFromReference(fqn, refFqn);
  +         internal_.cleanUp(fqn);
            isTrue = true;
         } else
         {
  @@ -170,12 +170,9 @@
       *
       * @param fqn
       * @param refFqn
  -    * @param removeCacheInterceptor
  -    * @param evict
       * @throws CacheException
       */
  -   private void removeFromReference(Fqn fqn, String refFqn, boolean removeCacheInterceptor,
  -                                    boolean evict) throws CacheException
  +   private void removeFromReference(Fqn fqn, String refFqn) throws CacheException
      {
         synchronized (refFqn)
         {  // we lock the internal fqn here so no one else has access.
  @@ -184,7 +181,7 @@
            {
               // No one is referring it so it is safe to remove
               // TODO we should make sure the parent nodes are also removed they are empty as well.
  -            pCache_._removeObject(Fqn.fromString(refFqn), removeCacheInterceptor, evict);
  +            pCache_._removeObject(Fqn.fromString(refFqn));
            }
         }
   
  
  
  
  1.3       +46 -204   JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheDelegate.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PojoCacheDelegate.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheDelegate.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- PojoCacheDelegate.java	14 Jul 2006 01:46:48 -0000	1.2
  +++ PojoCacheDelegate.java	14 Jul 2006 16:35:48 -0000	1.3
  @@ -26,6 +26,7 @@
   import org.jboss.cache.pojo.PojoUtil;
   import org.jboss.cache.pojo.CachedType;
   import org.jboss.cache.pojo.PojoReference;
  +import org.jboss.cache.pojo.collection.CollectionInterceptorUtil;
   
   import java.lang.reflect.Field;
   import java.util.Collection;
  @@ -46,6 +47,7 @@
      private PojoTreeCache cache_;
      private final static Log log = LogFactory.getLog(PojoCacheDelegate.class);
      private InternalHelper internal_;
  +   private AdvisedPojoHandler advisedHandler_;
      private ObjectGraphHandler graphHandler_;
      private CollectionClassHandler collectionHandler_;
      private SerializableObjectHandler serializableHandler_;
  @@ -65,6 +67,7 @@
         collectionHandler_ = new CollectionClassHandler(pCache_, internal_, graphHandler_);
         serializableHandler_ = new SerializableObjectHandler(pCache_, internal_);
         observer_ = observer;
  +      advisedHandler_ = new AdvisedPojoHandler(pCache_, internal_, graphHandler_, util_, observer_);
      }
   
      public void setBulkRemove(boolean bulk)
  @@ -116,7 +119,6 @@
         /**
          * Reconstruct the managed POJO
          */
  -      CachedType type = pCache_.getCachedType(clazz);
         Object obj;
   
         // Check for both Advised and Collection classes for object graph.
  @@ -131,42 +133,28 @@
   
         if (Advised.class.isAssignableFrom(clazz))
         {
  -         try
  -         {
  -            obj = clazz.newInstance();
  -            // TODO Need to populate the object from the cache as well.
  -         }
  -         catch (Exception e)
  -         {
  -            throw new CacheException("failed creating instance of " + clazz.getName(), e);
  -         }
  -         // Insert interceptor at runtime
  -         InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
  -         CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
  -         interceptor.setAopInstance(pojoReference);
  -         util_.attachInterceptor(obj, advisor, interceptor, observer_);
  -      } else
  +         obj = advisedHandler_.get(fqn, clazz, pojoReference);
  +      } else if(isCollectionGet(clazz))
         { // Must be Collection classes. We will use aop.ClassProxy instance instead.
  -         try
  -         {
  -            if ((obj = collectionHandler_.get(fqn, clazz)) != null)
  -            {
  +         obj = collectionHandler_.get(fqn, clazz, pojoReference);
               } else
               {
                  // Maybe it is just a serialized object.
  -               obj = serializableHandler_.get(fqn);
  -            }
  -         }
  -         catch (Exception e)
  -         {
  -            throw new CacheException("failure creating proxy", e);
  -         }
  +         obj = serializableHandler_.get(fqn, clazz, pojoReference);
         }
   
         InternalHelper.setPojo(pojoReference, obj);
         return obj;
      }
   
  +   private boolean isCollectionGet(Class clazz)
  +   {
  +      if(Map.class.isAssignableFrom(clazz) || Collection.class.isAssignableFrom(clazz))
  +         return true;
  +
  +      return false;
  +   }
  +
      /**
       * Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
       *
  @@ -181,7 +169,9 @@
         Object oldValue = internal_.getPojo(fqn);
         if (oldValue == obj) return obj;  // value already in cache. return right away.
   
  -      pCache_._removeObject(fqn, true); // remove old value before overwriting it.
  +      // remove old value before overwriting it. This is necessary to detach any interceptor.
  +      // TODO Or can we simply walk thru that somewhere? Well, there is also implication of Collection though
  +      pCache_._removeObject(fqn, true);
   
         if (obj == null)
         {
  @@ -197,45 +187,29 @@
            log.debug("putObject(): fqn: " + fqn);
         }
   
  -      // store object in cache
         if (obj instanceof Advised)
         {
  -         CachedType type = pCache_.getCachedType(obj.getClass());
  -         // add interceptor
  -         InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
  -         if (advisor == null)
  -            throw new RuntimeException("_putObject(): InstanceAdvisor is null for: " + obj);
  -
  -         // Step Check for cross references
  -         Interceptor interceptor = AopUtil.findCacheInterceptor(advisor);
  -         if (interceptor != null && graphHandler_.put(fqn, interceptor, type))
  -         { // found cross references
  -            return oldValue;
  -         }
  -
  -         // We have a clean slate then.
  -         _regularPutObject(fqn, obj, advisor, type);
  -
  -         /**
  -          * Handling collection classes here.
  -          * First check if obj has been aspectized? That is, if it is a ClassProxy or not.
  -          * If not, we will need to create a proxy first for the Collection classes
  -          */
  -      } else if (collectionHandler_.put(fqn, obj))
  +         advisedHandler_.put(fqn, obj);
  +      } else if (isCollection(obj))
         {
  +         collectionHandler_.put(fqn, obj);
            //
  -      } else if (serializableHandler_.put(fqn, obj))
  -      {
  -         // must be Serializable, including primitive types
         } else
         {
  -         // I really don't know what this is.
  -         throw new RuntimeException("putObject(): obj: " + obj + " type is not recognizable.");
  +         // must be Serializable, including primitive types
  +         serializableHandler_.put(fqn, obj);
         }
   
         return oldValue;
      }
   
  +   private boolean isCollection(Object obj)
  +   {
  +      if(obj instanceof Collection || obj instanceof Map) return true;
  +
  +      return false;
  +   }
  +
      /**
       * Based on the pojo to perform a bulk remove recursively if there is no object graph
       * relationship for performance optimization.
  @@ -244,7 +218,6 @@
      {
         // Check for cross-reference. If there is, we can't do bulk remove
         // map contains (pojo, cacheinterceptor) pair that needs to undo the the removal.
  -//      return false;
         Map undoMap = new HashMap();
         if (pojoGraphMultipleReferenced(obj, undoMap))
         {
  @@ -302,6 +275,11 @@
       */
      private boolean pojoGraphMultipleReferenced(Object obj, Map undoMap) throws CacheException
      {
  +      return true;
  +   }
  +
  +   private boolean XpojoGraphMultipleReferenced(Object obj, Map undoMap) throws CacheException
  +   {
         // store object in cache
         if (obj instanceof Advised)
         {
  @@ -409,99 +387,6 @@
         return false;
      }
   
  -   private void _regularPutObject(Fqn fqn, Object obj, InstanceAdvisor advisor, CachedType type) throws CacheException
  -   {
  -      // TODO workaround for deserialiased objects
  -      if (advisor == null)
  -      {
  -         advisor = new ClassInstanceAdvisor(obj);
  -         ((Advised) obj)._setInstanceAdvisor(advisor);
  -      }
  -
  -      // Let's do batch update via Map instead
  -      Map map = new HashMap();
  -      // Always initialize the ref count so we can mark this as an AopNode.
  -      PojoReference pojoReference = InternalHelper.initializeAopInstance();
  -      // Insert interceptor at runtime
  -      CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
  -      interceptor.setAopInstance(pojoReference);
  -      util_.attachInterceptor(obj, advisor, interceptor, observer_);
  -
  -      map.put(PojoReference.KEY, pojoReference);
  -      // This is put into map first.
  -      InternalHelper.putAopClazz(type.getType(), map);
  -      // we will do it recursively.
  -      // Map of sub-objects that are non-primitive
  -      Map subPojoMap = new HashMap();
  -      boolean hasFieldAnnotation = hasAnnotation(obj.getClass(), ((Advised) obj)._getAdvisor(), type);
  -
  -      for (Iterator i = type.getFields().iterator(); i.hasNext();)
  -      {
  -         Field field = (Field) (((FieldPersistentReference) i.next())).get();
  -         Object value = null;
  -         try
  -         {
  -            value = field.get(obj);
  -         }
  -         catch (IllegalAccessException e)
  -         {
  -            throw new CacheException("field access failed", e);
  -         }
  -         CachedType fieldType = pCache_.getCachedType(field.getType());
  -         // check for non-replicatable types
  -         if (CachedType.isPrimitiveNonReplicatable(field))
  -         {
  -            continue;
  -         }
  -
  -         if (hasFieldAnnotation)
  -         {
  -            if (CachedType.hasTransientAnnotation(field, ((Advised) obj)._getAdvisor()))
  -            {
  -               continue;
  -            }
  -         }
  -
  -         // we simply treat field that has @Serializable as a primitive type.
  -         if (fieldType.isImmediate() ||
  -                 (hasFieldAnnotation &&
  -                         CachedType.hasSerializableAnnotation(field, ((Advised) obj)._getAdvisor())))
  -         {
  -            // switched using batch update
  -            map.put(field.getName(), value);
  -         } else
  -         {
  -            subPojoMap.put(field, value);
  -         }
  -      }
  -
  -      // Use option to skip locking since we have parent lock already.
  -      cache_.put(fqn, map, internal_.getLockOption());
  -      // This is in-memory operation only
  -      InternalHelper.setPojo(pojoReference, obj);
  -
  -      for (Object o : subPojoMap.keySet())
  -      {
  -         Field field = (Field) o;
  -         Object value = subPojoMap.get(field);
  -         Fqn tmpFqn = new Fqn(fqn, field.getName());
  -         _putObject(tmpFqn, value);
  -         // If it is Collection classes, we replace it with dynamic proxy.
  -         // But we will have to ignore it if value is null
  -         if (value instanceof Map || value instanceof List || value instanceof Set)
  -         {
  -            Object newValue = pCache_.getObject(tmpFqn);
  -            util_.collectionReplaceWithProxy(obj, value, field, newValue);
  -         }
  -      }
  -
  -      // Need to make sure this is behind put such that obj.toString is done correctly.
  -      if (log.isDebugEnabled())
  -      {
  -         log.debug("_regularPutObject(): inserting with fqn: " + fqn);
  -      }
  -   }
  -
      private static boolean hasAnnotation(Class clazz, Advisor advisor, CachedType type)
      {
         return CachedType.hasAnnotation(clazz, advisor, type);
  @@ -511,13 +396,10 @@
       * Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
       *
       * @param fqn
  -    * @param removeCacheInterceptor
  -    * @param evict
       * @return
       * @throws CacheException
       */
  -   public Object _removeObject(Fqn fqn, boolean removeCacheInterceptor, boolean evict)
  -           throws CacheException
  +   public Object _removeObject(Fqn fqn) throws CacheException
      {
         Class clazz = internal_.peekAopClazz(fqn);
         if (clazz == null)
  @@ -541,13 +423,7 @@
            if (cache_.exists(fqn))
            {
               // TODO What do we do here. It can still have children pojo though.
  -            if (!evict)
  -            {
                  cache_.remove(fqn);
  -            } else
  -            {
  -               cache_._evict(fqn);
  -            }
            }
            return null;
         }
  @@ -560,7 +436,7 @@
               // Remember not to print obj here since it will trigger the CacheFieldInterceptor.
               if (log.isDebugEnabled())
               {
  -               log.debug("_removeObject(): fqn: " + fqn + "removing exisiting object in bulk.");
  +               log.debug("_removeObject(): fqn: " + fqn + "removing existing object in bulk.");
               }
   
               return result;
  @@ -568,7 +444,7 @@
            setBulkRemove(false);
         }
   
  -      if (graphHandler_.remove(fqn, removeCacheInterceptor, result, evict))
  +      if (graphHandler_.remove(fqn, result))
         {
            return result;
         }
  @@ -576,55 +452,21 @@
         // Not multi-referenced
         if (Advised.class.isAssignableFrom(clazz))
         {
  -         _regularRemoveObject(fqn, removeCacheInterceptor, result, clazz, evict);
  -      } else if (collectionHandler_.remove(fqn))
  +         advisedHandler_.remove(fqn, result, clazz);
  +      } else if (isCollectionGet(clazz))
         {
  +         collectionHandler_.remove(fqn, result);
         } else
         { // Just Serializable objects. Do a brute force remove is ok.
            serializableHandler_.remove();
         }
   
  -      internal_.cleanUp(fqn, evict);
  +      internal_.cleanUp(fqn);
   
         // remove the interceptor as well.
         return result;
      }
   
  -   private void _regularRemoveObject(Fqn fqn, boolean removeCacheInterceptor, Object result, Class clazz,
  -                                     boolean evict) throws CacheException
  -   {
  -      InstanceAdvisor advisor = ((Advised) result)._getInstanceAdvisor();
  -      CachedType type = pCache_.getCachedType(clazz);
  -      for (Iterator i = type.getFields().iterator(); i.hasNext();)
  -      {
  -         Field field = (Field) (((FieldPersistentReference) i.next())).get();
  -         CachedType fieldType = pCache_.getCachedType(field.getType());
  -         if (!fieldType.isImmediate())
  -         {
  -            _removeObject(new Fqn(fqn, field.getName()), removeCacheInterceptor, evict);
  -         }
  -      }
  -
  -      // batch remove
  -      cache_.removeData(fqn);
  -
  -      // Determine if we want to keep the interceptor for later use.
  -      if (removeCacheInterceptor)
  -      {
  -         CacheFieldInterceptor interceptor = (CacheFieldInterceptor) AopUtil.findCacheInterceptor(advisor);
  -         // Remember to remove the interceptor from in-memory object but make sure it belongs to me first.
  -         if (interceptor != null)
  -         {
  -            if (log.isDebugEnabled())
  -            {
  -               log.debug("regularRemoveObject(): removed cache interceptor fqn: " + fqn + " interceptor: " + interceptor);
  -            }
  -            util_.detachInterceptor(advisor, interceptor, observer_);
  -         }
  -      }
  -
  -   }
  -
      Map _findObjects(Fqn fqn) throws CacheException
      {
   
  
  
  
  1.9       +4 -3      JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheImpl.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PojoCacheImpl.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheImpl.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -b -r1.8 -r1.9
  --- PojoCacheImpl.java	13 Jul 2006 15:56:12 -0000	1.8
  +++ PojoCacheImpl.java	14 Jul 2006 16:35:48 -0000	1.9
  @@ -38,7 +38,7 @@
    * Implementation class for PojoCache interface
    *
    * @author Ben Wang
  - * @version $Id: PojoCacheImpl.java,v 1.8 2006/07/13 15:56:12 bwang Exp $
  + * @version $Id: PojoCacheImpl.java,v 1.9 2006/07/14 16:35:48 bwang Exp $
    */
   public class PojoCacheImpl implements PojoCache, Observer
   {
  @@ -248,7 +248,7 @@
         // Don't trigger bulk remove now since there is still some problem with Collection class
         // when it is detached.
         delegate_.setBulkRemove(true);
  -      return delegate_._removeObject(fqn, removeCacheInterceptor, evict);
  +      return delegate_._removeObject(fqn);
      }
   
      /**
  @@ -263,7 +263,8 @@
         // evicted.
   //      if(detachPojoWhenEvicted_) removeCacheInterceptor = true;
         delegate_.setBulkRemove(false);
  -      return delegate_._removeObject(fqn, removeCacheInterceptor, evict);
  +//      return delegate_._removeObject(fqn, removeCacheInterceptor);
  +      return null;
      }
   
      /**
  
  
  
  1.4       +2 -2      JBossCache/src-50/org/jboss/cache/pojo/impl/SerializableObjectHandler.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: SerializableObjectHandler.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/SerializableObjectHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -b -r1.3 -r1.4
  --- SerializableObjectHandler.java	14 Jul 2006 01:46:48 -0000	1.3
  +++ SerializableObjectHandler.java	14 Jul 2006 16:35:48 -0000	1.4
  @@ -22,7 +22,7 @@
    * Handle Serializable object cache management.
    *
    * @author Ben Wang
  - * @version $Id: SerializableObjectHandler.java,v 1.3 2006/07/14 01:46:48 bwang Exp $
  + * @version $Id: SerializableObjectHandler.java,v 1.4 2006/07/14 16:35:48 bwang Exp $
    */
   class SerializableObjectHandler
   {
  @@ -38,7 +38,7 @@
         internal_ = internal;
      }
   
  -   Object get(Fqn fqn)
  +   Object get(Fqn fqn, Class clazz, PojoReference pojoReference)
              throws CacheException
      {
         Object obj = internal_.get(fqn, InternalConstant.SERIALIZED);
  
  
  



More information about the jboss-cvs-commits mailing list