Author: manik.surtani(a)jboss.com
Date: 2008-09-23 10:58:35 -0400 (Tue, 23 Sep 2008)
New Revision: 6782
Modified:
core/branches/1.4.X/src/org/jboss/cache/marshall/TreeCacheMarshaller140.java
core/branches/1.4.X/tests/functional/org/jboss/cache/marshall/TreeCacheMarshaller140Test.java
Log:
JBCACHE-1412: Marshaller uses equals() to test object equality instead of identity when
performing reference counting
Modified: core/branches/1.4.X/src/org/jboss/cache/marshall/TreeCacheMarshaller140.java
===================================================================
---
core/branches/1.4.X/src/org/jboss/cache/marshall/TreeCacheMarshaller140.java 2008-09-23
14:52:26 UTC (rev 6781)
+++
core/branches/1.4.X/src/org/jboss/cache/marshall/TreeCacheMarshaller140.java 2008-09-23
14:58:35 UTC (rev 6782)
@@ -30,6 +30,7 @@
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
+import java.util.IdentityHashMap;
/**
* An enhanced marshaller for RPC calls between TreeCache instances.
@@ -74,7 +75,7 @@
public void objectToStream(Object o, ObjectOutputStream out) throws Exception
{
if (log.isTraceEnabled()) log.trace("Marshalling object " + o);
- Map refMap = new HashMap();
+ Map refMap = new IdentityHashMap();
if (useRegionBasedMarshalling)
{
@@ -108,7 +109,7 @@
public Object objectFromStream(ObjectInputStream in) throws Exception
{
Object retValue;
- Map refMap = new HashMap();
+ Map refMap = new IdentityHashMap();
if (useRegionBasedMarshalling)
{
Modified:
core/branches/1.4.X/tests/functional/org/jboss/cache/marshall/TreeCacheMarshaller140Test.java
===================================================================
---
core/branches/1.4.X/tests/functional/org/jboss/cache/marshall/TreeCacheMarshaller140Test.java 2008-09-23
14:52:26 UTC (rev 6781)
+++
core/branches/1.4.X/tests/functional/org/jboss/cache/marshall/TreeCacheMarshaller140Test.java 2008-09-23
14:58:35 UTC (rev 6782)
@@ -11,6 +11,10 @@
import org.jgroups.stack.IpAddress;
import java.io.ObjectInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -18,6 +22,7 @@
import java.util.LinkedList;
import java.util.TreeMap;
import java.util.TreeSet;
+import java.util.List;
/**
* @author <a href="mailto:manik@jboss.org">Manik Surtani
(manik(a)jboss.org)</a>
@@ -31,6 +36,39 @@
expectedMarshallerClass = TreeCacheMarshaller140.class;
}
+ public void testBadEquals() throws Exception
+ {
+ // object1 and Object2 should NOT be equal, even though their equals() methods are
broken.
+ Broken o1 = new Broken();
+ Broken o2 = new Broken();
+
+ o1.name = "o1";
+ o2.name = "o2";
+
+ assertNotSame(o1, o2);
+ assertEquals(o1, o2);
+
+ List l = new ArrayList(2); // lists will allow "duplicate" entries.
+ l.add(o1);
+ l.add(o2);
+
+ TreeCacheMarshaller140 marsh = new TreeCacheMarshaller140(null, false, false);
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream(bout);
+ marsh.objectToStream(l, out);
+ out.close();
+ ObjectInputStream in = new ObjectInputStream(new
ByteArrayInputStream(bout.toByteArray()));
+ List l2 = (List) marsh.objectFromStream(in);
+
+ assertEquals(l2.size(), 2);
+ assertEquals("o1", ((Broken) l2.get(0)).name);
+ assertEquals("o2", ((Broken) l2.get(1)).name);
+
+ assertNotSame(l2.get(0), l2.get(1));
+ assertEquals(l2.get(0), l2.get(1));
+ }
+
+
public void testKnownCollectionMagicNumbers() throws Exception
{
doMagicNumberTest(new ArrayList(), TreeCacheMarshaller140.MAGICNUMBER_ARRAY_LIST);
@@ -73,3 +111,18 @@
assertEquals("Magic number mismatch", magicNumber, magicNumberFound);
}
}
+
+class Broken implements Serializable
+{
+ String name;
+
+ public boolean equals(Object o)
+ {
+ return true;
+ }
+
+ public int hashCode()
+ {
+ return 10;
+ }
+}
Show replies by date