You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/09/26 19:27:13 UTC

svn commit: r1762367 - in /uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/cas/impl/Subiterator.java test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java

Author: schor
Date: Mon Sep 26 19:27:13 2016
New Revision: 1762367

URL: http://svn.apache.org/viewvc?rev=1762367&view=rev
Log:
[UIMA-5121] check subiterator ends up in bounds after moveTo(fs)

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java?rev=1762367&r1=1762366&r2=1762367&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java Mon Sep 26 19:27:13 2016
@@ -457,11 +457,22 @@ public class Subiterator<T extends Annot
       }
     } else {
       // is ambiguous, may be strict, always bounded (either by annotation or begin / end
-      it.moveTo(fs);
+      it.moveTo(fs);  // moves to left-most
       if (isBeginEndCompare) {
         adjustAfterMoveToForBeginEndComparator(fsa);
       }
       adjustForStrictForward();
+    
+      if (it.isValid()) {
+        // mark invalid if end up outside of bounds after adjustments
+        if (it.getBegin() > boundingEnd) {
+          it.moveToLast();
+          it.moveToNext();  // make invalid
+        } else if (fsIndexRepo.getAnnotationFsComparator().compare(it.get(), boundingAnnotation) < 0) {
+          it.moveToFirst();
+          it.moveToPrevious(); // make invalid
+        } 
+      }
     }
   }
   
@@ -504,6 +515,17 @@ public class Subiterator<T extends Annot
         it.moveToPrevious();  
       }
       adjustForStrictForward();
+      
+      if (it.isValid()) {
+        // mark invalid if end up outside of bounds after adjustments
+        if (it.getBegin() > boundingEnd) {
+          it.moveToLast();
+          it.moveToNext();  // make invalid
+        } else if (fsIndexRepo.getAnnotationFsComparator().compare(it.get(), boundingAnnotation) < 0) {
+          it.moveToFirst();
+          it.moveToPrevious(); // make invalid
+        } 
+      }
     }
     
     

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java?rev=1762367&r1=1762366&r2=1762367&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java Mon Sep 26 19:27:13 2016
@@ -240,7 +240,10 @@ public class AnnotationIteratorTest exte
     AnnotationIndex<AnnotationFS> tokenIndex = cas.getAnnotationIndex(tokenType);
     it = tokenIndex.subiterator(a1);
     assertCount("multi equal", 0, it);
-            
+    it = tokenIndex.subiterator(a1);
+    // make a new iterator that hasn't been converted to a list form internally
+    it.moveTo(cas.getDocumentAnnotation());
+    assertFalse(it.isValid());            
   }
   /**
    * The tests include: