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";