You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2021/03/15 17:41:58 UTC

[uima-uimaj] branch bugfix/UIMA-6342-Moving-iterator-beyond-bounds-does-not-invalidate-it created (now 6fbaab4)

This is an automated email from the ASF dual-hosted git repository.

rec pushed a change to branch bugfix/UIMA-6342-Moving-iterator-beyond-bounds-does-not-invalidate-it
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git.


      at 6fbaab4  [UIMA-6342] Moving iterator beyond bounds does not invalidate it

This branch includes the following new commits:

     new 6fbaab4  [UIMA-6342] Moving iterator beyond bounds does not invalidate it

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[uima-uimaj] 01/01: [UIMA-6342] Moving iterator beyond bounds does not invalidate it

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rec pushed a commit to branch bugfix/UIMA-6342-Moving-iterator-beyond-bounds-does-not-invalidate-it
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit 6fbaab487acce1d124aaf2d24cde3e55446b2c1e
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Mon Mar 15 18:41:46 2021 +0100

    [UIMA-6342] Moving iterator beyond bounds does not invalidate it
    
    - Added unit test
    - First attempt at fixing it
---
 .../java/org/apache/uima/cas/impl/Subiterator.java | 31 +++++++++++++++++++---
 .../org/apache/uima/cas/impl/SelectFsTest.java     | 28 ++++++++++++++++++-
 2 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java
index 19cbb76..0969fd5 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/Subiterator.java
@@ -803,7 +803,9 @@ public class Subiterator<T extends AnnotationFS> implements LowLevelIterator<T>
 
   @Override
   public void moveToNoReinit(FeatureStructure fs) {
-    if (isEmpty) return;
+    if (isEmpty) {
+        return;
+    }
     
     // unambiguous must be in list form
     if (isUnambiguous && !isListForm) {
@@ -820,7 +822,7 @@ public class Subiterator<T extends AnnotationFS> implements LowLevelIterator<T>
     // Always bounded (if unbounded, that's only when subiterator is being used to 
     // implement "unambiguous", and that mode requires the "list" form above.)
     // can be one of 3 bounds: coveredBy, covering, and sameBeginEnd.
-    //moveTo_iterators(fs);
+    //moveTo_iterators(fs, false);
     moveTo_iterators_legacy(fs);
   }
   
@@ -871,6 +873,26 @@ public class Subiterator<T extends AnnotationFS> implements LowLevelIterator<T>
       return;
     }
     
+    // Check if the move went outside the bounds
+    switch (boundsUse) {
+      case covering:
+        if (is_beyond_bounds_chk_coveringNvc()) {
+          return;
+        }
+      case coveredBy:
+        if (is_beyond_bounds_chk_coveredByNvc()) {
+          return;
+        }
+      case sameBeginEnd:
+        if (is_beyond_bounds_chk_sameBeginEnd()) {
+          return;
+        }
+      case notBounded:
+      default:
+        // No check necessary
+        break;
+    }
+    
     // CASE: If the iterator is pointing on the bounds annotation, we must first skip this in
     // forward direction to ensure we find a potentially matching FSes occurring in the indexes
     // after the bounds annotation.
@@ -1068,7 +1090,10 @@ public class Subiterator<T extends AnnotationFS> implements LowLevelIterator<T>
         (isUseTypePriority && a._getTypeImpl() != boundType)) {
       makeInvalid();
       return true;
-    } else return false;
+    }
+    else {
+        return false;
+    }
    
   }
   
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java
index 83c1802..4ca5c81 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java
@@ -51,7 +51,6 @@ import org.apache.uima.util.CasCreationUtils;
 import org.apache.uima.util.XMLInputSource;
 import org.junit.Before;
 import org.junit.FixMethodOrder;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.MethodSorters;
@@ -1777,6 +1776,33 @@ public class SelectFsTest {
     assertThat(it.isValid()).isTrue();
   }  
   
+  @Test
+  public void thatSeekingIteratorToOutOfIndexPositionOnRightIsInvalid() throws Exception {
+    TypeSystemDescription tsd = getResourceSpecifierFactory().createTypeSystemDescription();
+    tsd.addType("test.Type1", "", CAS.TYPE_NAME_ANNOTATION);
+    tsd.addType("test.Type2", "", CAS.TYPE_NAME_ANNOTATION);
+    tsd.addType("test.Type3", "", CAS.TYPE_NAME_ANNOTATION);
+    
+    CAS cas = CasCreationUtils.createCas(tsd, null, null, null);
+    
+    Type type1 = cas.getTypeSystem().getType("test.Type1");
+    Type type2 = cas.getTypeSystem().getType("test.Type2");
+    Type type3 = cas.getTypeSystem().getType("test.Type3");
+    
+    AnnotationFS window, seekPoint;
+    addToIndexes(
+            window = cas.createAnnotation(type1, 0, 10),
+            cas.createAnnotation(type2, 5, 6),
+            seekPoint = cas.createAnnotation(type3, 8, 9),
+            cas.createAnnotation(type2, 15, 16));
+    
+    FSIterator<AnnotationFS> it = cas.getAnnotationIndex(type2).select().coveredBy(window).fsIterator();
+    
+    it.moveTo(seekPoint);
+    
+    assertThat(it.isValid()).isFalse();
+  }
+  
   @SuppressWarnings("unchecked")
   private static <T extends AnnotationFS, R extends AnnotationFS> List<R> toListBackwards(
       SelectFSs<T> select) {