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.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/collections/trunk@731498 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Henri Yandell 2009-01-05 09:09:55 +00:00
parent 0122245f02
commit 3290bbc854
2 changed files with 67 additions and 1 deletions

View File

@ -283,7 +283,26 @@ public class SetUniqueList extends AbstractSerializableListDecorator {
}
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;
}
//-----------------------------------------------------------------------

View File

@ -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;
@ -470,4 +471,50 @@ public class TestSetUniqueList extends AbstractTestList {
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);
}
}
}