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/12/16 14:46:33 UTC

svn commit: r1774604 - in /uima/uimaj/trunk: uima-docbook-references/src/docbook/ uimaj-core/src/main/java/org/apache/uima/jcas/cas/ uimaj-core/src/test/java/org/apache/uima/jcas/test/

Author: schor
Date: Fri Dec 16 14:46:32 2016
New Revision: 1774604

URL: http://svn.apache.org/viewvc?rev=1774604&view=rev
Log:
[UIMA-5207] extend arrays and list impls for Java primitive types to include same new extensions (push, iterable). update docs and tests

Modified:
    uima/uimaj/trunk/uima-docbook-references/src/docbook/ref.cas.xml
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/BooleanArray.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ByteArray.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/DoubleArray.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FloatList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArray.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/LongArray.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFloatList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyIntegerList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ShortArray.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java

Modified: uima/uimaj/trunk/uima-docbook-references/src/docbook/ref.cas.xml
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uima-docbook-references/src/docbook/ref.cas.xml?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uima-docbook-references/src/docbook/ref.cas.xml (original)
+++ uima/uimaj/trunk/uima-docbook-references/src/docbook/ref.cas.xml Fri Dec 16 14:46:32 2016
@@ -281,6 +281,14 @@ under the License.
     
     <para>The <literal>uima.cas.FSArray</literal> type is an array whose elements are
       arbitrary other feature structures (instances of non-primitive types).</para>
+      
+    <para>The JCas cover classes for the array types support the Iterable API, so you may
+    write extended for loops over instances of these.  For example:
+    <programlisting>FSArray myArray = ...
+for (TOP fs : myArray) {
+  somemethod(fs);
+}</programlisting>
+    </para>
     
     <para>There are 3 built-in types associated with the artifact being analyzed:
       
@@ -364,12 +372,12 @@ under the License.
       particular value for that part of the list. The tail refers to the next list object
       (either a non-empty one or the empty version to indicate the end of the list).</para>
     
-    <para>For JCas users, the new operator for the NonEmptyXXX classes includes a 3 argument version
-    where you may specify the head and tail values as part of the constructor.  The JCas classes implement
+    <para>For JCas users, the new operator for the NonEmptyXyzList classes includes a 3 argument version
+    where you may specify the head and tail values as part of the constructor.  The JCas 
+    cover classes for these implement
     a <code>push(item)</code> method which creates a new non-empty node, sets the <code>head</code> value
     to <code>item</code>, and the tail to the node it is called on, and returns the new node.
-    Also, the
-    StringList and FSList implement Iterable, so you can use the enhanced Java <code>for</code> operator.
+    These classes also implement Iterable, so you can use the enhanced Java <code>for</code> operator.
     The iterator stops when it gets to the end of the list, determined by either the tail being null or 
     the element being one of the EmptyXXXList elements.
     Here's a StringList example:
@@ -379,9 +387,7 @@ sl = sl.push("1");
 
 for (String s : sl) {
   someMethod(s);  // some sample use
-}
-// also works with arrays
-</programlisting>
+}</programlisting>
     
     </para>
     

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/BooleanArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/BooleanArray.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/BooleanArray.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/BooleanArray.java Fri Dec 16 14:46:32 2016
@@ -19,12 +19,15 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.BooleanArrayFS;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** JCas class model for BooleanArray */
-public final class BooleanArray extends TOP implements BooleanArrayFS {
+public final class BooleanArray extends TOP implements BooleanArrayFS, Iterable<Boolean> {
   /**
    * Each cover class when loaded sets an index. Used in the JCas typeArray to go from the cover
    * class or class instance to the corresponding instance of the _Type class
@@ -140,4 +143,30 @@ public final class BooleanArray extends
     copyToArray(0, strArray, 0, size);
     return strArray;
   }
+
+  @Override
+  public Iterator<Boolean> iterator() {
+    return new Iterator<Boolean>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public Boolean next() {
+        if (!hasNext())
+          throw new NoSuchElementException();
+        return get(i++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+      
+    };
+  }  
+  
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ByteArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ByteArray.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ByteArray.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ByteArray.java Fri Dec 16 14:46:32 2016
@@ -19,12 +19,15 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.ByteArrayFS;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** JCas class model for ByteArray */
-public final class ByteArray extends TOP implements ByteArrayFS {
+public final class ByteArray extends TOP implements ByteArrayFS, Iterable<Byte> {
   /**
    * Each cover class when loaded sets an index. Used in the JCas typeArray to go from the cover
    * class or class instance to the corresponding instance of the _Type class
@@ -140,4 +143,29 @@ public final class ByteArray extends TOP
     copyToArray(0, strArray, 0, size);
     return strArray;
   }
+  
+  @Override
+  public Iterator<Byte> iterator() {
+    return new Iterator<Byte>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public Byte next() {
+        if (!hasNext())
+          throw new NoSuchElementException();
+        return get(i++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+      
+    };
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/DoubleArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/DoubleArray.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/DoubleArray.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/DoubleArray.java Fri Dec 16 14:46:32 2016
@@ -19,12 +19,15 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.DoubleArrayFS;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** JCas class model for DoubleArray */
-public final class DoubleArray extends TOP implements DoubleArrayFS {
+public final class DoubleArray extends TOP implements DoubleArrayFS, Iterable<Double> {
   /**
    * Each cover class when loaded sets an index. Used in the JCas typeArray to go from the cover
    * class or class instance to the corresponding instance of the _Type class
@@ -140,4 +143,29 @@ public final class DoubleArray extends T
     copyToArray(0, strArray, 0, size);
     return strArray;
   }
+  
+  @Override
+  public Iterator<Double> iterator() {
+    return new Iterator<Double>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public Double next() {
+        if (!hasNext())
+          throw new NoSuchElementException();
+        return get(i++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+      
+    };
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSList.java Fri Dec 16 14:46:32 2016
@@ -79,4 +79,13 @@ public class FSList extends org.apache.u
   public Iterator<TOP> iterator() {
     return Collections.emptyIterator(); // NonEmptyFSList overrides
   }
+  
+  /**
+   * pushes item onto front of this list
+   * @param item the item to push onto the list
+   * @return the new list, with this item as the head value of the first element
+   */
+  public NonEmptyFSList push(TOP item) {
+    return new NonEmptyFSList(this.jcasType.jcas, item, this);
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FloatList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FloatList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FloatList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FloatList.java Fri Dec 16 14:46:32 2016
@@ -19,11 +19,14 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Collections;
+import java.util.Iterator;
+
 import org.apache.uima.cas.CASRuntimeException;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class FloatList extends org.apache.uima.jcas.cas.TOP {
+public class FloatList extends org.apache.uima.jcas.cas.TOP implements Iterable<Float> {
 
 	public final static int typeIndexID = JCasRegistry.register(FloatList.class);
 
@@ -72,4 +75,19 @@ public class FloatList extends org.apach
 			cg = c.getTail();
 		}
 	}
+	
+	 /**
+   * pushes item onto front of this list
+   * @param item the item to push onto the list
+   * @return the new list, with this item as the head value of the first element
+   */
+  public NonEmptyFloatList push(float item) {
+    return new NonEmptyFloatList(this.jcasType.jcas, item, this);
+  }
+  
+  @Override
+  public Iterator<Float> iterator() {
+    return Collections.emptyIterator(); // NonEmptyList overrides
+  }
+
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArray.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArray.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArray.java Fri Dec 16 14:46:32 2016
@@ -19,12 +19,15 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.IntArrayFS;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** The Java Class model corresponding to the Cas IntegerArray_JCasImpl type. */
-public final class IntegerArray extends TOP implements IntArrayFS {
+public final class IntegerArray extends TOP implements IntArrayFS, Iterable<Integer> {
   /**
    * Each cover class when loaded sets an index. Used in the JCas typeArray to go from the cover
    * class or class instance to the corresponding instance of the _Type class
@@ -160,4 +163,29 @@ public final class IntegerArray extends
     copyToArray(0, strArray, 0, size);
     return strArray;
   }
+  
+  @Override
+  public Iterator<Integer> iterator() {
+    return new Iterator<Integer>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public Integer next() {
+        if (!hasNext())
+          throw new NoSuchElementException();
+        return get(i++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+      
+    };
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerList.java Fri Dec 16 14:46:32 2016
@@ -19,11 +19,14 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Collections;
+import java.util.Iterator;
+
 import org.apache.uima.cas.CASRuntimeException;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class IntegerList extends org.apache.uima.jcas.cas.TOP {
+public class IntegerList extends org.apache.uima.jcas.cas.TOP implements Iterable<Integer> {
 
 	public final static int typeIndexID = JCasRegistry.register(IntegerList.class);
 
@@ -71,4 +74,18 @@ public class IntegerList extends org.apa
 			cg = c.getTail();
 		}
 	}
+	
+	/**
+   * pushes item onto front of this list
+   * @param item the item to push onto the list
+   * @return the new list, with this item as the head value of the first element
+	 */
+	public NonEmptyIntegerList push(int item) {
+	  return new NonEmptyIntegerList(this.jcasType.jcas, item, this);
+	}
+	
+  @Override
+  public Iterator<Integer> iterator() {
+    return Collections.emptyIterator(); // NonEmptyList overrides
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/LongArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/LongArray.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/LongArray.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/LongArray.java Fri Dec 16 14:46:32 2016
@@ -19,12 +19,15 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.LongArrayFS;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** JCas class model for LongArray */
-public final class LongArray extends TOP implements LongArrayFS {
+public final class LongArray extends TOP implements LongArrayFS, Iterable<Long> {
   /**
    * Each cover class when loaded sets an index. Used in the JCas typeArray to go from the cover
    * class or class instance to the corresponding instance of the _Type class
@@ -140,4 +143,30 @@ public final class LongArray extends TOP
     copyToArray(0, strArray, 0, size);
     return strArray;
   }
+  
+  @Override
+  public Iterator<Long> iterator() {
+    return new Iterator<Long>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public Long next() {
+        if (!hasNext())
+          throw new NoSuchElementException();
+        return get(i++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+      
+    };
+  }
+
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFSList.java Fri Dec 16 14:46:32 2016
@@ -25,7 +25,7 @@ import java.util.NoSuchElementException;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class NonEmptyFSList extends FSList implements Iterable<TOP> {
+public class NonEmptyFSList extends FSList {
 
   public final static int typeIndexID = JCasRegistry.register(NonEmptyFSList.class);
 
@@ -47,6 +47,17 @@ public class NonEmptyFSList extends FSLi
   public NonEmptyFSList(JCas jcas) {
     super(jcas);
   }
+  
+  /**
+   * @param jcas the JCas create the new Feature Structure in
+   * @param item the head item
+   * @param tail the tail item
+   */
+  public NonEmptyFSList(JCas jcas, TOP item, FSList tail) {
+    this(jcas);
+    setHead(item);
+    setTail(tail); 
+  }
 
   // *------------------*
   // * Feature: head

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFloatList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFloatList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFloatList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyFloatList.java Fri Dec 16 14:46:32 2016
@@ -19,6 +19,9 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
@@ -45,6 +48,17 @@ public class NonEmptyFloatList extends F
     super(jcas);
   }
 
+  /**
+   * @param jcas the JCas create the new Feature Structure in
+   * @param item the head item
+   * @param tail the tail item
+   */
+  public NonEmptyFloatList(JCas jcas, float item, FloatList tail) {
+    this(jcas);
+    setHead(item);
+    setTail(tail); 
+  }
+
   // *------------------*
   // * Feature: head
   /* getter for head * */
@@ -83,4 +97,35 @@ public class NonEmptyFloatList extends F
     jcasType.ll_cas.ll_setRefValue(addr, ((NonEmptyFloatList_Type) jcasType).casFeatCode_tail,
             jcasType.ll_cas.ll_getFSRef(v));
   }
+
+  @Override
+  public Iterator<Float> iterator() {
+    return new Iterator<Float>() {
+
+      FloatList node = NonEmptyFloatList.this;
+      
+      @Override
+      public boolean hasNext() {
+        return node instanceof NonEmptyFloatList;
+      }
+
+      @Override
+      public Float next() {
+        if (!hasNext()) {
+          throw new NoSuchElementException();
+        }
+        NonEmptyFloatList nn = (NonEmptyFloatList) node;
+        Float r = nn.getHead();
+        node = nn.getTail();
+        return r;
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
+      
+  }
+  
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyIntegerList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyIntegerList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyIntegerList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyIntegerList.java Fri Dec 16 14:46:32 2016
@@ -19,10 +19,13 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class NonEmptyIntegerList extends IntegerList {
+public class NonEmptyIntegerList extends IntegerList implements Iterable<Integer> {
 
   public final static int typeIndexID = JCasRegistry.register(NonEmptyIntegerList.class);
 
@@ -44,6 +47,17 @@ public class NonEmptyIntegerList extends
   public NonEmptyIntegerList(JCas jcas) {
     super(jcas);
   }
+  
+  /**
+   * @param jcas the jcas to create this Feature Structure in
+   * @param i the head value
+   * @param tail the tail
+   */
+  public NonEmptyIntegerList(JCas jcas, int i, IntegerList tail) {
+    this(jcas);
+    setHead(i);
+    setTail(tail);
+  }
 
   // *------------------*
   // * Feature: head
@@ -83,4 +97,35 @@ public class NonEmptyIntegerList extends
     jcasType.ll_cas.ll_setRefValue(addr, ((NonEmptyIntegerList_Type) jcasType).casFeatCode_tail,
             jcasType.ll_cas.ll_getFSRef(v));
   }
+  
+  @Override
+  public Iterator<Integer> iterator() {
+    return new Iterator<Integer>() {
+
+      IntegerList node = NonEmptyIntegerList.this;
+      
+      @Override
+      public boolean hasNext() {
+        return node instanceof NonEmptyIntegerList;
+      }
+
+      @Override
+      public Integer next() {
+        if (!hasNext()) {
+          throw new NoSuchElementException();
+        }
+        NonEmptyIntegerList nn = (NonEmptyIntegerList) node;
+        Integer r = nn.getHead();
+        node = nn.getTail();
+        return r;
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
+      
+  }
+
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java Fri Dec 16 14:46:32 2016
@@ -25,7 +25,7 @@ import java.util.NoSuchElementException;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class NonEmptyStringList extends StringList implements Iterable<String> {
+public class NonEmptyStringList extends StringList {
 
   public final static int typeIndexID = JCasRegistry.register(NonEmptyStringList.class);
 
@@ -47,6 +47,17 @@ public class NonEmptyStringList extends
   public NonEmptyStringList(JCas jcas) {
     super(jcas);
   }
+  
+  /**
+   * @param jcas the JCas create the new Feature Structure in
+   * @param s the head item
+   * @param tail the tail item
+   */
+  public NonEmptyStringList(JCas jcas, String s, StringList tail) {
+    this(jcas);
+    setHead(s);
+    setTail(tail);
+  }
 
   // *------------------*
   // * Feature: head
@@ -116,5 +127,5 @@ public class NonEmptyStringList extends
       }
       
     };
-  }
+  }  
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ShortArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ShortArray.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ShortArray.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/ShortArray.java Fri Dec 16 14:46:32 2016
@@ -19,12 +19,15 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.ShortArrayFS;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** JCas class model for ShortArray */
-public final class ShortArray extends TOP implements ShortArrayFS {
+public final class ShortArray extends TOP implements ShortArrayFS, Iterable<Short> {
   /**
    * Each cover class when loaded sets an index. Used in the JCas typeArray to go from the cover
    * class or class instance to the corresponding instance of the _Type class
@@ -140,4 +143,29 @@ public final class ShortArray extends TO
     copyToArray(0, strArray, 0, size);
     return strArray;
   }
+  
+  @Override
+  public Iterator<Short> iterator() {
+    return new Iterator<Short>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public Short next() {
+        if (!hasNext())
+          throw new NoSuchElementException();
+        return get(i++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+      
+    };
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java Fri Dec 16 14:46:32 2016
@@ -81,4 +81,13 @@ public class StringList extends org.apac
   public Iterator<String> iterator() {
     return Collections.emptyIterator();  // NonEmptyStringList overrides
   }
+ 
+  /**
+   * pushes a String onto front of this list
+   * @param s the String to push
+   * @return the new list, with this String as the first element's head value
+   */
+  public NonEmptyStringList push(String s) {
+    return new NonEmptyStringList(this.jcasType.jcas, s, this);
+  }
 }

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java?rev=1774604&r1=1774603&r2=1774604&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java Fri Dec 16 14:46:32 2016
@@ -19,6 +19,7 @@
 
 package org.apache.uima.jcas.test;
 
+import java.util.Arrays;
 import java.util.Iterator;
 
 import junit.framework.TestCase;
@@ -38,19 +39,28 @@ import org.apache.uima.cas.impl.LowLevel
 import org.apache.uima.cas.impl.LowLevelIndexRepository;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JFSIndexRepository;
+import org.apache.uima.jcas.cas.BooleanArray;
+import org.apache.uima.jcas.cas.ByteArray;
 import org.apache.uima.jcas.cas.DoubleArray;
 import org.apache.uima.jcas.cas.EmptyFSList;
 import org.apache.uima.jcas.cas.EmptyFloatList;
 import org.apache.uima.jcas.cas.EmptyIntegerList;
 import org.apache.uima.jcas.cas.EmptyStringList;
 import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.cas.FSList;
 import org.apache.uima.jcas.cas.FloatArray;
+import org.apache.uima.jcas.cas.FloatList;
 import org.apache.uima.jcas.cas.IntegerArray;
+import org.apache.uima.jcas.cas.IntegerList;
+import org.apache.uima.jcas.cas.LongArray;
 import org.apache.uima.jcas.cas.NonEmptyFSList;
 import org.apache.uima.jcas.cas.NonEmptyFloatList;
 import org.apache.uima.jcas.cas.NonEmptyIntegerList;
 import org.apache.uima.jcas.cas.NonEmptyStringList;
+import org.apache.uima.jcas.cas.ShortArray;
 import org.apache.uima.jcas.cas.StringArray;
+import org.apache.uima.jcas.cas.StringList;
+import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.cas.TOP_Type;
 import org.apache.uima.jcas.tcas.Annotation;
 import org.apache.uima.jcas.tcas.Annotation_Type;
@@ -759,7 +769,146 @@ public class JCasTest extends TestCase {
 			JUnitExtension.handleException(e);
 		}
 	}
+	
+	public void testStringListAPI() {
+	  StringList sl = new EmptyStringList(jcas);
+	  sl = sl.push("2");
+	  sl = sl.push("1");
+	  
+	  String[] sa = new String[2];
+	  int i = 0;
+	  for (String s : sl) {
+	    sa[i++] = s;
+	  }
+	  
+	  String[] expected = {"1",  "2"};
+	  assert(Arrays.equals(expected, sa));
+	}
+	
+	public void testStringArrayAPI() {
+	  StringArray sa = new StringArray(jcas, 3);
+	  String[] values = {"1", "2", "3"}; 
+	  sa.copyFromArray(values, 0, 0, 3);
+	  
+    int i = 0;
+    for (String s : sa) {
+      assert(s.equals(values[i++]));
+    }
+	}
+
+  public void testFSListAPI() {
+    FSList sl = new EmptyFSList(jcas);
+    TOP fs1 = new TOP(jcas);
+    TOP fs2 = new TOP(jcas);
+    sl = sl.push(fs2);
+    sl = sl.push(fs1);
+   
+    TOP[] fss = new TOP[2];
+    int i = 0;
+    for (TOP s : sl) {
+      fss[i++] = s;
+    }
+    
+    TOP[] expected = {fs1, fs2};
+    assert(Arrays.equals(expected, fss));
+  }
+	  
+  public void testFSArrayAPI() {
+    FSArray sa = new FSArray(jcas, 2);
+    TOP fs1 = new TOP(jcas);
+    TOP fs2 = new TOP(jcas);
+    TOP[] values = {fs1, fs2}; 
+    sa.copyFromArray(values, 0, 0, 2);
+    
+    int i = 0;
+    for (FeatureStructure s : sa) {
+      assert(s.equals(values[i++]));
+    }
+  }
   
+  public void testOtherListAPI() {
+    // float and integer
+    IntegerList sl = new EmptyIntegerList(jcas);
+    sl = sl.push(2);
+    sl = sl.push(1);
+   
+    int[] fss = new int[2];
+    int i = 0;
+    for (int s : sl) {
+      fss[i++] = s;
+    }
+    
+    int[] expected = {1, 2};
+    assert(Arrays.equals(expected, fss));
+
+    FloatList fl = new EmptyFloatList(jcas);
+    fl = fl.push(2.0F);
+    fl = fl.push(1.0F);
+    float[] fls = new float[2];
+    i = 0;
+    for (float f : fl) {
+      fls[i++] = f;
+    }
+    
+    float[] expectedFloats = {1.0f, 2.0f};
+    assert(Arrays.equals(expectedFloats, fls));
+    
+    BooleanArray boa = new BooleanArray(jcas, 2);
+    boa.set(0, true);
+    boa.set(1, false);
+    boolean[] expectedBa = {true, false};
+    i = 0;
+    for (boolean bov : boa) {
+      assertEquals(expectedBa[i++], bov);
+    }
+
+    ByteArray bya = new ByteArray(jcas, 2);
+    bya.set(0, (byte)15);
+    bya.set(1, (byte)22);
+    byte[] expectedBya = {15, 22};
+    i = 0;
+    for (byte v : bya) {
+      assertEquals(expectedBya[i++], v);
+    }
+
+    ShortArray sha = new ShortArray(jcas, 2);
+    sha.set(0, (short)15);
+    sha.set(1, (short)22);
+    short[] expectedSha = {15, 22};
+    i = 0;
+    for (short v : sha) {
+      assertEquals(expectedSha[i++], v);
+    }
+
+    IntegerArray ina = new IntegerArray(jcas, 2);
+    ina.set(0, (int)15);
+    ina.set(1, (int)22);
+    int[] expectedIna = {15, 22};
+    i = 0;
+    for (int v : ina) {
+      assertEquals(expectedIna[i++], v);
+    }
+    
+    LongArray loa = new LongArray(jcas, 2);
+    loa.set(0, (long)15);
+    loa.set(1, (long)22);
+    long[] expectedLoa = {15, 22};
+    i = 0;
+    for (long v : loa) {
+      assertEquals(expectedLoa[i++], v);
+    }
+
+    DoubleArray doa = new DoubleArray(jcas, 2);
+    doa.set(0, (double)15);
+    doa.set(1, (double)22);
+    Double[] expectedDoa = {15d, 22d};
+    i = 0;
+    for (double v : doa) {
+      assertEquals(expectedDoa[i++], v);
+    }
+    
+  }
+
   public void testUndefinedType() throws Exception {
     //create jcas with no type system
     JCas jcas = CasCreationUtils.createCas(new TypeSystemDescription_impl(), null, null).getJCas();