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

Ben Wang bwang at jboss.com
Thu Nov 9 11:53:28 EST 2006


  User: bwang   
  Date: 06/11/09 11:53:28

  Modified:    src-50/org/jboss/cache/pojo/impl 
                        CollectionClassHandler.java
  Log:
  Added detection for Collection hashCode recursion.
  
  Revision  Changes    Path
  1.11      +49 -1     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.10
  retrieving revision 1.11
  diff -u -b -r1.10 -r1.11
  --- CollectionClassHandler.java	19 Sep 2006 03:27:47 -0000	1.10
  +++ CollectionClassHandler.java	9 Nov 2006 16:53:28 -0000	1.11
  @@ -20,6 +20,7 @@
   import org.jboss.cache.pojo.PojoTreeCache;
   import org.jboss.cache.pojo.CachedType;
   import org.jboss.cache.pojo.PojoInstance;
  +import org.jboss.cache.pojo.PojoCacheException;
   
   import java.util.Iterator;
   import java.util.List;
  @@ -31,7 +32,7 @@
    *
    * @author Ben Wang
    *         Date: Aug 4, 2005
  - * @version $Id: CollectionClassHandler.java,v 1.10 2006/09/19 03:27:47 bwang Exp $
  + * @version $Id: CollectionClassHandler.java,v 1.11 2006/11/09 16:53:28 bwang Exp $
    */
   class CollectionClassHandler
   {
  @@ -116,6 +117,8 @@
               {
                  throw new CacheException("failure creating proxy", e);
               }
  +
  +            checkMapRecursion(map, obj);
            }
   
            isCollection = true;
  @@ -147,6 +150,8 @@
               {
                  throw new CacheException("failure creating proxy", e);
               }
  +
  +            checkListRecursion(list, obj);
            }
   
            isCollection = true;
  @@ -177,6 +182,8 @@
               {
                  throw new CacheException("failure creating proxy", e);
               }
  +
  +            checkSetRecursion(set, obj);
            }
   
            isCollection = true;
  @@ -199,6 +206,47 @@
         }
      }
   
  +   private void checkListRecursion(List list, Object obj)
  +   {
  +      while(true)
  +      {
  +         int i = list.indexOf(list); // check for recursion
  +         if(i == -1) break;
  +
  +         list.remove(list);
  +         list.add(i, obj);
  +      }
  +   }
  +
  +   private void checkSetRecursion(Set set, Object obj)
  +   {
  +      if(set.remove(set))
  +      {
  +         set.add(obj); // replace with proxy
  +      }
  +   }
  +
  +   private void checkMapRecursion(Map map, Object obj)
  +   {
  +      Map m = java.util.Collections.unmodifiableMap(map);
  +
  +      for( Object k : m.keySet() )
  +      {
  +         if( m == k)
  +         {
  +            throw new PojoCacheException("CollectionClassHandler.checkMapRecursion(): " +
  +            " Can't handle the recursion map where it is nested in a constant key " +map);
  +         }
  +
  +         Object v = m.get(k);
  +         if( v == map )
  +         {
  +            // recursion here, replace it with proxy
  +            map.put(k, obj);
  +         }
  +      }
  +   }
  +
      Object remove(Fqn fqn, Object obj) throws CacheException
      {
         if (!(obj instanceof ClassProxy))
  
  
  



More information about the jboss-cvs-commits mailing list