You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2015/11/08 22:12:28 UTC

svn commit: r1713295 - in /commons/proper/collections/branches/COLLECTIONS_3_2_X/src: changes/changes.xml java/org/apache/commons/collections/list/SetUniqueList.java test/org/apache/commons/collections/list/TestSetUniqueList.java

Author: tn
Date: Sun Nov  8 21:12:28 2015
New Revision: 1713295

URL: http://svn.apache.org/viewvc?rev=1713295&view=rev
Log:
Backport COLLECTIONS-307 to 3.2.2.

Modified:
    commons/proper/collections/branches/COLLECTIONS_3_2_X/src/changes/changes.xml
    commons/proper/collections/branches/COLLECTIONS_3_2_X/src/java/org/apache/commons/collections/list/SetUniqueList.java
    commons/proper/collections/branches/COLLECTIONS_3_2_X/src/test/org/apache/commons/collections/list/TestSetUniqueList.java

Modified: commons/proper/collections/branches/COLLECTIONS_3_2_X/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/COLLECTIONS_3_2_X/src/changes/changes.xml?rev=1713295&r1=1713294&r2=1713295&view=diff
==============================================================================
--- commons/proper/collections/branches/COLLECTIONS_3_2_X/src/changes/changes.xml (original)
+++ commons/proper/collections/branches/COLLECTIONS_3_2_X/src/changes/changes.xml Sun Nov  8 21:12:28 2015
@@ -38,6 +38,10 @@
     <action issue="COLLECTIONS-334" dev="jochen" type="fix" due-to="sebb">
       Synchronized access to lock in "StaticBucketMap#size()".
     </action>
+    <action issue="COLLECTIONS-307" dev="bayard" type="fix" due-to="Christian Semrau">
+      "SetUniqueList#subList()#contains(Object)" will now correctly check the subList
+      rather than the parent list.
+    </action>
     <action issue="COLLECTIONS-294" dev="bayard" type="fix" due-to="Benjamin Bentmann">
       "CaseInsensitiveMap" will now convert input strings to lower-case in a
       locale-independent manner.
@@ -82,10 +86,6 @@
     <action issue="COLLECTIONS-330" dev="mbenson" type="fix" due-to="Joerg Schaible">
       "LRUMap#keySet()#remove(Object)" will not throw a "ConcurrentModificationException" anymore.
     </action>
-    <action issue="COLLECTIONS-307" dev="bayard" type="fix" due-to="Christian Semrau">
-      "SetUniqueList#subList()#contains(Object)" will now correctly check the subList
-      rather than the parent list.
-    </action>
     <action issue="COLLECTIONS-304" dev="bayard" type="fix" due-to="Rafał Figas,Bjorn Townsend">
       "SetUniqueList#set(int, Object)" will now correctly enforce the uniqueness constraint.
     </action>

Modified: commons/proper/collections/branches/COLLECTIONS_3_2_X/src/java/org/apache/commons/collections/list/SetUniqueList.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/COLLECTIONS_3_2_X/src/java/org/apache/commons/collections/list/SetUniqueList.java?rev=1713295&r1=1713294&r2=1713295&view=diff
==============================================================================
--- commons/proper/collections/branches/COLLECTIONS_3_2_X/src/java/org/apache/commons/collections/list/SetUniqueList.java (original)
+++ commons/proper/collections/branches/COLLECTIONS_3_2_X/src/java/org/apache/commons/collections/list/SetUniqueList.java Sun Nov  8 21:12:28 2015
@@ -277,7 +277,35 @@ public class SetUniqueList extends Abstr
     }
 
     public List subList(int fromIndex, int toIndex) {
-        return new SetUniqueList(super.subList(fromIndex, toIndex), set);
+        List superSubList = super.subList(fromIndex, toIndex);
+        Set subSet = createSetBasedOnList(set, superSubList);
+        return new SetUniqueList(superSubList, subSet);
+    }
+
+    /**
+     * Create a new {@link Set} with the same type as the provided {@code set}
+     * and populate it with all elements of {@code list}.
+     *
+     * @param set  the {@link Set} to be used as return type, must not be null
+     * @param list  the {@link List} to populate the {@link Set}
+     * @return a new {@link Set} populated with all elements of the provided
+     *   {@link List}
+     */
+    protected Set createSetBasedOnList(Set set, List list) {
+        Set subSet = null;
+        if(set.getClass().equals(HashSet.class)) {
+            subSet = new HashSet();
+        } else {
+            try {
+                subSet = (Set) set.getClass().newInstance();
+            } catch(InstantiationException ie) {
+                subSet = new HashSet();
+            } catch(IllegalAccessException iae) {
+                subSet = new HashSet();
+            }
+        }
+        subSet.addAll(list);
+        return subSet;        
     }
 
     //-----------------------------------------------------------------------

Modified: commons/proper/collections/branches/COLLECTIONS_3_2_X/src/test/org/apache/commons/collections/list/TestSetUniqueList.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/COLLECTIONS_3_2_X/src/test/org/apache/commons/collections/list/TestSetUniqueList.java?rev=1713295&r1=1713294&r2=1713295&view=diff
==============================================================================
--- commons/proper/collections/branches/COLLECTIONS_3_2_X/src/test/org/apache/commons/collections/list/TestSetUniqueList.java (original)
+++ commons/proper/collections/branches/COLLECTIONS_3_2_X/src/test/org/apache/commons/collections/list/TestSetUniqueList.java Sun Nov  8 21:12:28 2015
@@ -22,6 +22,7 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Set;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -430,6 +431,43 @@ public class TestSetUniqueList extends A
         assertTrue(s.contains(c));
     }
 
+    public void testCollections307() {
+        List list = new ArrayList();
+        List uniqueList = SetUniqueList.decorate(list);
+        String hello = "Hello";
+        String world = "World";
+        uniqueList.add(hello);
+        uniqueList.add(world);
+        List subList = list.subList(0, 0);
+        List subUniqueList = uniqueList.subList(0, 0);
+        assertFalse(subList.contains(world)); // passes
+        assertFalse(subUniqueList.contains(world)); // fails
+        List worldList = new ArrayList();
+        worldList.add(world);
+        assertFalse(subList.contains("World")); // passes
+        assertFalse(subUniqueList.contains("World")); // fails
+        // repeat the test with a different class than HashSet; 
+        // which means subclassing SetUniqueList below
+        list = new ArrayList();
+        uniqueList = new SetUniqueList307(list, new java.util.TreeSet());
+        uniqueList.add(hello);
+        uniqueList.add(world);
+        subList = list.subList(0, 0);
+        subUniqueList = uniqueList.subList(0, 0);
+        assertFalse(subList.contains(world)); // passes
+        assertFalse(subUniqueList.contains(world)); // fails
+        worldList = new ArrayList();
+        worldList.add(world);
+        assertFalse(subList.contains("World")); // passes
+        assertFalse(subUniqueList.contains("World")); // fails
+    }
+
+    class SetUniqueList307 extends SetUniqueList {
+        public SetUniqueList307(List list, Set set) {
+            super(list, set);
+        }
+    }
+
     //-----------------------------------------------------------------------
     public String getCompatibilityVersion() {
         return "3.1";