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/10/05 20:25:11 UTC

svn commit: r1763488 - in /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src: main/java/org/apache/uima/cas/ main/java/org/apache/uima/cas/impl/ main/java/org/apache/uima/jcas/cas/ main/resources/org/apache/uima/ test/java/org/apache/uima/cas/test/

Author: schor
Date: Wed Oct  5 20:25:10 2016
New Revision: 1763488

URL: http://svn.apache.org/viewvc?rev=1763488&view=rev
Log:
[UIMA-5115] add support for alternate sources: FSArray and FSList

Modified:
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CAS.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArray.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CAS.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CAS.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CAS.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CAS.java Wed Oct  5 20:25:10 2016
@@ -1106,15 +1106,19 @@ public interface CAS extends AbstractCas
   default <T extends FeatureStructure> SelectFSs<T> select() {
     return new SelectFSs_impl<>(this);
   }
+
   default <T extends FeatureStructure> SelectFSs<T> select(Type type) {
     return new SelectFSs_impl<>(this).type(type);
   }
+
   default <T extends FeatureStructure> SelectFSs<T> select(Class<T> clazz) {
     return new SelectFSs_impl<>(this).type(clazz);
   }
+
   default <T extends FeatureStructure> SelectFSs<T> select(int jcasType) {
     return new SelectFSs_impl<>(this).type(jcasType);
   }
+
   default <T extends FeatureStructure> SelectFSs<T> select(String fullyQualifiedTypeName) {
     return new SelectFSs_impl<>(this).type(fullyQualifiedTypeName);
   }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java Wed Oct  5 20:25:10 2016
@@ -298,7 +298,10 @@ public class CASRuntimeException extends
  
   /** CAS has more than 1 instance of ''{0}''{1}.*/
   public static final String SELECT_GET_TOO_MANY_INSTANCES = "SELECT_GET_TOO_MANY_INSTANCES";
-
+  
+  /** Select with FSList or FSArray may not specify bounds, starting position, following, or preceding. */
+  public static final String SELECT_ALT_SRC_INVALID = "SELECT_ALT_SRC_INVALID";
+  
   /** Index "{0}" must be an AnnotationIndex. */ 
   public static final String ANNOTATION_INDEX_REQUIRED = "ANNOTATION_INDEX_REQUIRED";
   /**

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java Wed Oct  5 20:25:10 2016
@@ -200,4 +200,5 @@ public interface SelectFSs<T extends Fea
   static <N extends FeatureStructure> SelectFSs<N> sselect(FSIndex<N> index) {
     return index.select();    
   } 
+
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java Wed Oct  5 20:25:10 2016
@@ -127,7 +127,7 @@ public class FsIterator_subtypes_snapsho
   public void moveTo(FeatureStructure fs) {
     if (is_unordered) {
       int i = 0;
-      while ((i < snapshot.length) && indexForComparator.compare(snapshot[i],  fs) < 0) {
+      while ((i < snapshot.length) && compare(snapshot[i],  fs) < 0) {
         i++;
       }
       pos = i;
@@ -144,7 +144,7 @@ public class FsIterator_subtypes_snapsho
       } else {
         // found an equal.  need to move to leftmost
         c--;
-        while ((c >= 0) && indexForComparator.compare(snapshot[c],  fs) == 0) {
+        while ((c >= 0) && compare(snapshot[c],  fs) == 0) {
           c--;
         }
         pos = c + 1;
@@ -180,6 +180,8 @@ public class FsIterator_subtypes_snapsho
   }
   
   public int compare(FeatureStructure fs1, FeatureStructure fs2) {
-    return this.indexForComparator.compare(fs1, fs2);
+    return (null == this.indexForComparator) 
+        ? (fs1.equals(fs2) ? 0 : -1)
+        : this.indexForComparator.compare(fs1, fs2);
   }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java Wed Oct  5 20:25:10 2016
@@ -55,6 +55,10 @@ import org.apache.uima.cas.Type;
 import org.apache.uima.cas.impl.Subiterator.BoundsUse;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.jcas.cas.EmptyFSList;
+import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.cas.FSList;
+import org.apache.uima.jcas.cas.NonEmptyFSList;
 import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.impl.JCasImpl;
 import org.apache.uima.jcas.tcas.Annotation;
@@ -74,6 +78,9 @@ public class SelectFSs_impl <T extends F
   private int shift; 
   private int limit = -1;
   
+  private FSArray sourceFSArray = null;  // alternate source
+  private FSList  sourceFSList  = null;  // alternate source
+  
   private boolean isTypePriority = false;
   private boolean isPositionUsesType = false;
   private boolean isSkipEquals = false; // for boundsUse only
@@ -87,6 +94,7 @@ public class SelectFSs_impl <T extends F
   private boolean isPreceding = false;
   
   private boolean isNullOkSpecified = false; // for complex defaulting of get(), get(n)
+  private boolean isAltSource = false;
   
   private BoundsUse boundsUse = null; 
   
@@ -106,12 +114,19 @@ public class SelectFSs_impl <T extends F
     this.view = (CASImpl) cas.getLowLevelCAS();
     this.jcas = (JCasImpl) view.getJCas();
   }
+  
+  public SelectFSs_impl(FSArray source) {
+    this(source._casView);
+    isAltSource = true;
+    sourceFSArray = source;
+  }
     
-  public SelectFSs_impl(CAS cas, Type type) {
-    this(cas);
-    this.ti = (TypeImpl) type;
+  public SelectFSs_impl(FSList source) {
+    this(source._casView);
+    isAltSource = true;
+    sourceFSList = source;
   }
-  
+
   /************************************************
    * Builders
    ************************************************/
@@ -439,6 +454,8 @@ public class SelectFSs_impl <T extends F
     if (boundsUse == null) {
       boundsUse = BoundsUse.notBounded;
     }
+
+    maybeValidateAltSource();
     
     final boolean isUseAnnotationIndex = 
         ((index != null) && (index instanceof AnnotationIndex)) ||
@@ -471,6 +488,20 @@ public class SelectFSs_impl <T extends F
     
   }
   
+  private void maybeValidateAltSource() {
+    if (!isAltSource) return;
+    
+    if (index != null ||
+        boundsUse != BoundsUse.notBounded ||
+        isAllViews || 
+        isFollowing ||
+        isPreceding ||
+        startingFs != null) {
+      /** Select with FSList or FSArray may not specify bounds, starting position, following, or preceding. */
+      throw new CASRuntimeException(CASRuntimeException.SELECT_ALT_SRC_INVALID);
+    }
+  }
+  
   private void incr(FSIterator<T> it) {
     if (isBackwards) {
       it.moveToPrevious();
@@ -583,7 +614,13 @@ public class SelectFSs_impl <T extends F
     if (null == idx) { 
       // no bounds, not ordered
       // type could be null
-      return v.indexRepository.getAllIndexedFS(ti);  
+      // could be alternate source
+      
+      if (isAltSource) {
+        return altSourceIterator();
+      } else {
+        return v.indexRepository.getAllIndexedFS(ti);
+      }
     }
     
     final boolean isIndexOrdered = idx.getIndexingStrategy() == FSIndex.SORTED_INDEX;
@@ -622,6 +659,36 @@ public class SelectFSs_impl <T extends F
     return it;
   }
     
+  private FSIterator<T> altSourceIterator() {
+    T[] filtered;
+    if (sourceFSList != null) {
+      List<T> filteredItems = new ArrayList<T>();
+      FSList fsl = sourceFSList;
+      while (!(fsl instanceof EmptyFSList)) {
+        NonEmptyFSList nefsl = (NonEmptyFSList) fsl;
+        T item = (T) nefsl.getHead();
+        if ((isNullOK || null != item) &&
+            ti.subsumes((TypeImpl)item.getType())) {
+          filteredItems.add(item);
+        }
+        fsl = nefsl.getTail();
+      }
+      filtered = filteredItems.toArray((T[]) Array.newInstance(FeatureStructure.class, filteredItems.size()));          
+    } else {
+      List<T> filteredItems = new ArrayList<T>();
+      for (TOP item : sourceFSArray._getTheArray()) {
+        if (!isNullOK && null == item) {
+          continue;  // null items may be skipped
+        }
+        if (ti.subsumes((TypeImpl)item.getType())) {
+          filteredItems.add((T)item);
+        }
+      }
+      filtered = filteredItems.toArray((T[]) Array.newInstance(FeatureStructure.class, filteredItems.size()));                    
+    }        
+    return new FsIterator_subtypes_snapshot<T>(filtered, null, true);  // items not sorted 
+  }
+  
   @Override
   public Iterator<T> iterator() {
     return fsIterator();

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArray.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArray.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArray.java Wed Oct  5 20:25:10 2016
@@ -22,7 +22,10 @@ package org.apache.uima.jcas.cas;
 import org.apache.uima.cas.ArrayFS;
 import org.apache.uima.cas.CASRuntimeException;
 import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.SelectFSs;
+import org.apache.uima.cas.Type;
 import org.apache.uima.cas.impl.CASImpl;
+import org.apache.uima.cas.impl.SelectFSs_impl;
 import org.apache.uima.cas.impl.TypeImpl;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
@@ -208,5 +211,54 @@ public final class FSArray extends TOP i
     FSArray bv = (FSArray) v;
     System.arraycopy(bv.theArray,  0,  theArray, 0, theArray.length);
   }
+  
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select() {
+    return new SelectFSs_impl<>(this);
+  }
+
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @param filterByType only includes elements of this type
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(Type filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+
+  /**
+   * Treat an FSArray as a source for SelectFSs.  
+   * @param filterByType only includes elements of this JCas class
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(Class<T> filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+  
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @param filterByType only includes elements of this JCas class's type
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(int filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+  
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @param filterByType only includes elements of this type (fully qualifined type name)
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(String filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
 
+  public static FSArray create(JCas jcas, FeatureStructure[] a) {
+    FSArray fsa = new FSArray(jcas, a.length);
+    fsa.copyFromArray(a, 0, 0, a.length);
+    return fsa;
+  }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java Wed Oct  5 20:25:10 2016
@@ -19,8 +19,13 @@
 
 package org.apache.uima.jcas.cas;
 
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.SelectFSs;
+import org.apache.uima.cas.Type;
 import org.apache.uima.cas.impl.CASImpl;
+import org.apache.uima.cas.impl.SelectFSs_impl;
 import org.apache.uima.cas.impl.TypeImpl;
+import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.jcas.JCas;
 
 public abstract class FSList extends TOP implements CommonList {
@@ -48,5 +53,58 @@ public abstract class FSList extends TOP
     NonEmptyFSList node = new NonEmptyFSList(this._casView.getTypeSystemImpl().fsNeListType, this._casView);
     return node;
   }
-         
+    
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select() {
+    return new SelectFSs_impl<>(this);
+  }
+
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @param filterByType only includes elements of this type
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(Type filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+
+  /**
+   * Treat an FSArray as a source for SelectFSs.  
+   * @param filterByType only includes elements of this JCas class
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(Class<T> filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+  
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @param filterByType only includes elements of this JCas class's type
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(int filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+  
+  /**
+   * Treat an FSArray as a source for SelectFSs. 
+   * @param filterByType only includes elements of this type (fully qualifined type name)
+   * @return a new instance of SelectFSs
+   */
+  public <T extends FeatureStructure> SelectFSs<T> select(String filterByType) {
+    return new SelectFSs_impl<>(this).type(filterByType);
+  }
+  
+  public static FSList create(JCas jcas, FeatureStructure[] a) {
+    NonEmptyFSList fslhead = new NonEmptyFSList(jcas);
+    NonEmptyFSList last = fslhead;
+    for (FeatureStructure item : a) {
+      last = last.add(item);
+    }
+    last.setTail(jcas.getCasImpl().getEmptyFSList());
+    return fslhead.getTail();
+  }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java Wed Oct  5 20:25:10 2016
@@ -20,6 +20,7 @@
 package org.apache.uima.jcas.cas;
 
 import org.apache.uima.cas.CASRuntimeException;
+import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.impl.CASImpl;
 import org.apache.uima.cas.impl.TypeImpl;
 import org.apache.uima.cas.impl.TypeSystemImpl;
@@ -89,10 +90,11 @@ public class NonEmptyFSList extends FSLi
   public TOP getHead() { return _getFeatureValueNc(_FI_head); }
 
   /* setter for head * */
-  public void setHead(TOP v) {
-    if (v != null && _casView.getBaseCAS() != v._casView.getBaseCAS()) {
+  public void setHead(FeatureStructure v) {
+    TOP vt = (TOP) v;
+    if (vt != null && _casView.getBaseCAS() != vt._casView.getBaseCAS()) {
       /** Feature Structure {0} belongs to CAS {1}, may not be set as the value of an array or list element in a different CAS {2}.*/
-      throw new CASRuntimeException(CASRuntimeException.FS_NOT_MEMBER_OF_CAS, v, v._casView, _casView);
+      throw new CASRuntimeException(CASRuntimeException.FS_NOT_MEMBER_OF_CAS, vt, vt._casView, _casView);
     }
     _setFeatureValueNcWj(_FI_head, v); }
 
@@ -124,4 +126,18 @@ public class NonEmptyFSList extends FSLi
   public EmptyFSList getEmptyList() {
     return this._casView.getEmptyFSList();
   }
+  
+  /**
+   * inserts the new item as a new NonEmpty FSList node following this item
+   * @param item to be inserted
+   * @return the NonEmptyFSList node created  
+   */
+  public NonEmptyFSList add(FeatureStructure item) {
+    FSList tail = getTail();
+    NonEmptyFSList node = createNonEmptyNode();
+    node.setHead(item);
+    node.setTail(tail);
+    setTail(node);
+    return node;
+  }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties Wed Oct  5 20:25:10 2016
@@ -604,6 +604,7 @@ FS_NOT_MEMBER_OF_CAS = Feature Structure
 ILLEGAL_ADD_TO_INDEX_IN_BASE_CAS = Illegal operation - cannot add Feature Structure {0} to base CAS {1}.
 SELECT_GET_NO_INSTANCES = CAS does not contain any ''{0}'' instances {1}.
 SELECT_GET_TOO_MANY_INSTANCES = CAS has more than 1 instance of ''{0}''{1}.
+SELECT_ALT_SRC_INVALID = Select with FSList or FSArray may not specify bounds, starting position, following, or preceding.
 ANNOTATION_INDEX_REQUIRED = Index "{0}" must be an AnnotationIndex.
 
 #------------------------------------------------------------------------

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java?rev=1763488&r1=1763487&r2=1763488&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java Wed Oct  5 20:25:10 2016
@@ -33,8 +33,15 @@ import org.apache.uima.cas.Feature;
 import org.apache.uima.cas.SelectFSs;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.TypeSystem;
+import org.apache.uima.cas.impl.CASImpl;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.cas.EmptyFSList;
+import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.cas.FSList;
+import org.apache.uima.jcas.cas.NonEmptyFSList;
+import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.tcas.Annotation;
 
 import junit.framework.TestCase;
@@ -283,6 +290,18 @@ public class AnnotationIteratorTest exte
     assertCount("Normal ambiguous select annot iterator", annotCount, select_it);
     assertEquals(annotCount, sselect(annotIndex).toArray().length);  // stream op
     assertEquals(annotCount, sselect(annotIndex).asArray(AnnotationFS.class).length);  // select op
+    
+    AnnotationFS[] tokensAndSentences = sselect(annotIndex).asArray(AnnotationFS.class);
+    JCas jcas = cas.getJCas();
+    FSArray fsa = FSArray.create(jcas, tokensAndSentences);
+    NonEmptyFSList fslhead = (NonEmptyFSList) FSList.create(jcas,  tokensAndSentences);
+    
+    select_it = fsa.<AnnotationFS>select().fsIterator();
+    assertCount("fsa ambiguous select annot iterator", annotCount, select_it);
+
+    select_it = fslhead.<AnnotationFS>select().fsIterator();
+    assertCount("fslhead ambiguous select annot iterator", annotCount, select_it);
+    
     // backwards
     select_it = sselect(annotIndex).backwards().fsIterator();
     assertCount("Normal select backwards ambiguous annot iterator", annotCount, select_it);
@@ -426,6 +445,14 @@ public class AnnotationIteratorTest exte
     assertCountLimit("Following", 2, select_it);
     select_it = sselect(annotIndex).following(2, 39).backwards().limit(2).fsIterator();
     assertCountLimit("Following", 2, select_it);
+    
+    select_it = fsa.<AnnotationFS>select(sentenceType).fsIterator();
+    assertCount("select source array", 11, select_it);
+    select_it = fslhead.<AnnotationFS>select(sentenceType).fsIterator();
+    assertCount("select source array", 11, select_it);
+    
+
+    
   }
   
   private String flatStateMsg(String s) {