Author: bayard Date: Mon Jan 5 01:09:55 2009 New Revision: 731498 URL: http://svn.apache.org/viewvc?rev=731498&view=rev Log: Applying my patch from COLLECTIONS-307. Fixes the bug raised by Christian Semrau that SetUniqueList.subList() was not redefining the uniqueness set when creating the sublist.
Modified: commons/proper/collections/trunk/src/java/org/apache/commons/collections/list/SetUniqueList.java commons/proper/collections/trunk/src/test/org/apache/commons/collections/list/TestSetUniqueList.java Modified: commons/proper/collections/trunk/src/java/org/apache/commons/collections/list/SetUniqueList.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/list/SetUniqueList.java?rev=731498&r1=731497&r2=731498&view=diff ============================================================================== --- commons/proper/collections/trunk/src/java/org/apache/commons/collections/list/SetUniqueList.java (original) +++ commons/proper/collections/trunk/src/java/org/apache/commons/collections/list/SetUniqueList.java Mon Jan 5 01:09:55 2009 @@ -283,7 +283,26 @@ } 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); + } + + 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/trunk/src/test/org/apache/commons/collections/list/TestSetUniqueList.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/org/apache/commons/collections/list/TestSetUniqueList.java?rev=731498&r1=731497&r2=731498&view=diff ============================================================================== --- commons/proper/collections/trunk/src/test/org/apache/commons/collections/list/TestSetUniqueList.java (original) +++ commons/proper/collections/trunk/src/test/org/apache/commons/collections/list/TestSetUniqueList.java Mon Jan 5 01:09:55 2009 @@ -22,6 +22,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; +import java.util.Set; import junit.framework.Test; import junit.framework.TestSuite; @@ -470,4 +471,50 @@ assertEquals(4, decoratedList.size()); } + 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); + } + } + }