Author: schor Date: Wed May 22 14:30:40 2013 New Revision: 1485226 URL: http://svn.apache.org/r1485226 Log: [UIMA-2934] updated test case to verify removing item not in index doesn't cause failure.
Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIntArrayIndex.java uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/IteratorTest.java Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIntArrayIndex.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIntArrayIndex.java?rev=1485226&r1=1485225&r2=1485226&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIntArrayIndex.java (original) +++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIntArrayIndex.java Wed May 22 14:30:40 2013 @@ -250,6 +250,7 @@ public class FSIntArrayIndex<T extends F // } // Do binary search on index. + // return negative number of insertion point if not found private final int binarySearch(int[] array, int ele, int start, int end) { --end; // Make end a legal value. int i; // Current position @@ -355,8 +356,26 @@ public class FSIntArrayIndex<T extends F // } } + + /* + * Some day we may want to remove all occurrances of this feature structure, not just the + * first one we come to (in the case where the exact identical FS has been added to the + * index multiple times). The issues around this are: + * multiple adds are lost on serialization/ deserialization + * it take time to remove all instances - especially from bag indexes + */ + + /** + * This code is written to remove (if it exists) + * the exact FS, not just one which matches in the sort comparator. + * + * + */ public void remove(int fsRef) { final int pos = find(fsRef); // finds "same" element per compare key + if (pos < 0) { + return; // not in index + } if (this.index.get(pos) == fsRef) { this.index.remove(pos); return; Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/IteratorTest.java URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/IteratorTest.java?rev=1485226&r1=1485225&r2=1485226&view=diff ============================================================================== --- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/IteratorTest.java (original) +++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/IteratorTest.java Wed May 22 14:30:40 2013 @@ -175,7 +175,7 @@ public class IteratorTest extends TestCa this.sentenceType = null; this.annotationType = null; } - + public void testGetIndexes() { Iterator<FSIndex<FeatureStructure>> it = this.cas.getIndexRepository().getIndexes(); while (it.hasNext()) { @@ -730,6 +730,7 @@ public class IteratorTest extends TestCa // different FS. for (int i = 0; i < fsArray.length; i++) { ir.removeFS(fsArray[i]); + ir.removeFS(fsArray[i]); // a 2nd remove should be a no-op https://issues.apache.org/jira/browse/UIMA-2934 setIt.moveTo(fsArray[i]); if (setIt.isValid()) { int oldRef = this.cas.ll_getFSRef(fsArray[i]); @@ -808,12 +809,12 @@ public class IteratorTest extends TestCa verifyMoveToFirst(subsortedIt, true); ir.removeAllIncludingSubtypes(sentenceType); - verifyConcMod(setIt); - verifyConcMod(bagIt); - verifyConcMod(sortedIt); - verifyConcMod(subsetIt); - verifyConcMod(subbagIt); - verifyConcMod(subsortedIt); + verifyConcurrantModificationDetected(setIt); + verifyConcurrantModificationDetected(bagIt); + verifyConcurrantModificationDetected(sortedIt); + verifyConcurrantModificationDetected(subsetIt); + verifyConcurrantModificationDetected(subbagIt); + verifyConcurrantModificationDetected(subsortedIt); verifyMoveToFirst(setIt, false); verifyMoveToFirst(bagIt, false); @@ -859,8 +860,8 @@ public class IteratorTest extends TestCa verifyMoveToFirst(subsortedIt, false); } - - private void verifyConcMod(FSIterator<?> it) { + + private void verifyConcurrantModificationDetected(FSIterator<?> it) { boolean caught = false; try { it.moveToNext();