[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