Author: schor
Date: Thu Jul 19 19:34:04 2018
New Revision: 1836297

URL: http://svn.apache.org/viewvc?rev=1836297&view=rev
Log:
[UIMA-5840] fix / improve generics

Modified:
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CopyOnWriteIndexPart.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FilteredIterator.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_bag.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_singletype.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_backwards.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_limited.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_multiple_indexes.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted2.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteOrderedFsSet_array.java
    
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/OrderedFsSet_array.java

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
 Thu Jul 19 19:34:04 2018
@@ -434,13 +434,13 @@ public interface SelectFSs<T extends Fea
    * @param <N> the generic type argument of the elements of the list
    * @return a List object whose elements represent the selection.
    */
-  <N extends T> List<N> asList();
+  List<T> asList();
   /**
    * @param clazz the class of the type of the elements
    * @param <N> the generic type argument of the elements of the array
    * @return a Array object representation of the elements of the selection.
    */
-  <N extends T> N[] asArray(Class<N> clazz);
+   T[] asArray(Class<? super T> clazz);
 //  Spliterator<T> spliterator(); // inherited, not needed here 
   
   // returning one item

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CopyOnWriteIndexPart.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CopyOnWriteIndexPart.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CopyOnWriteIndexPart.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CopyOnWriteIndexPart.java
 Thu Jul 19 19:34:04 2018
@@ -21,12 +21,13 @@ package org.apache.uima.cas.impl;
 
 import java.util.Iterator;
 
-import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.cas.FeatureStructure;
 
 /**
  * common APIs supporting the copy on write aspect of index parts
  */
-public interface CopyOnWriteIndexPart<T> {
+// extend FeatureStructure because users have type specs like this
+public interface CopyOnWriteIndexPart<T extends FeatureStructure> {
   
   void makeReadOnlyCopy();
   
@@ -52,5 +53,5 @@ public interface CopyOnWriteIndexPart<T>
    * @param startingIndexInTarget the starting index in the target array
    * @return startingIndexInTarget + size
    */
-  int copyToArray(TOP[] target, int startingIndexInTarget);
+  int copyToArray(T[] target, int startingIndexInTarget);
 }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
 Thu Jul 19 19:34:04 2018
@@ -1617,7 +1617,7 @@ public class FSIndexRepositoryImpl imple
         
         int i = 0;
         for (CopyOnWriteIndexPart<T> idx : indexes) {
-          i = idx.copyToArray(r, i);
+          i = idx.copyToArray((T[]) r, i);
         }
         return r;
       }
@@ -1630,7 +1630,7 @@ public class FSIndexRepositoryImpl imple
         
         int i = 0;
         for (CopyOnWriteIndexPart<T> idx : indexes) {
-          i = idx.copyToArray((TOP[]) r, i);
+          i = idx.copyToArray( (T[]) r, i);
         }
         return r;
       }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FilteredIterator.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FilteredIterator.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FilteredIterator.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FilteredIterator.java
 Thu Jul 19 19:34:04 2018
@@ -19,6 +19,7 @@
 
 package org.apache.uima.cas.impl;
 
+import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Comparator;
 
@@ -164,13 +165,14 @@ class FilteredIterator<T extends Feature
   }
 
   @Override
-  public FeatureStructure[] getArray() {
+  public T[] getArray(Class<? super T> clazz) {
     FilteredIterator<T> it2 = new FilteredIterator<T>(it, cons);
     ArrayList<FeatureStructure> items = new ArrayList<>();
     while (it2.hasNext()) {
       items.add(it2.nextNvc());
     }
-    return items.toArray(new FeatureStructure[items.size()]);
+    T[] r = (T[]) Array.newInstance(clazz, items.size());
+    return items.toArray(r);
   }
 
 //  /* (non-Javadoc)

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_bag.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_bag.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_bag.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_bag.java
 Thu Jul 19 19:34:04 2018
@@ -205,18 +205,18 @@ public class FsIndex_bag<T extends Featu
    */
   @Override
   public LowLevelIterator<T> iterator(boolean orderNotNeeded, boolean 
ignoreType) {
-    CopyOnWriteIndexPart cow_index_wrapper = getNonNullCow();
+    CopyOnWriteIndexPart<T> cow_index_wrapper = getNonNullCow();
     return casImpl.inPearContext()
              ? new FsIterator_bag_pear<>(this, type, cow_index_wrapper)
              : new FsIterator_bag     <>(this, type, cow_index_wrapper);
   }
 
   @Override
-  protected CopyOnWriteIndexPart createCopyOnWriteIndexPart() {
+  protected CopyOnWriteIndexPart<T> createCopyOnWriteIndexPart() {
     if (CASImpl.traceCow) {
       this.casImpl.traceCowCopy(this);
     }
-    return new CopyOnWriteObjHashSet<TOP>(index);
+    return new CopyOnWriteObjHashSet(index);
   }
   
   @Override

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_singletype.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_singletype.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_singletype.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIndex_singletype.java
 Thu Jul 19 19:34:04 2018
@@ -67,6 +67,9 @@ public abstract class FsIndex_singletype
 
   // A reference to the low-level CAS.
   final protected CASImpl casImpl;
+  
+  // comparators are over TOP since it's allowed to compare
+  //   items with types in the superchain of T (up to TOP)
   /**
    * comparator for an index, passed in as an argument to the constructor
    */
@@ -522,8 +525,8 @@ public abstract class FsIndex_singletype
     flush();
   }
 
-  protected CopyOnWriteIndexPart getNonNullCow() {
-    CopyOnWriteIndexPart n = getCopyOnWriteIndexPart();
+  protected CopyOnWriteIndexPart<T> getNonNullCow() {
+    CopyOnWriteIndexPart<T> n = getCopyOnWriteIndexPart();
     if (n != null) {
       if (CASImpl.traceCow) {
         this.casImpl.traceCowReinit("reuse", this);
@@ -550,7 +553,7 @@ public abstract class FsIndex_singletype
     return (wr_cow == null) ? null : wr_cow.get();
   }
 
-  protected abstract CopyOnWriteIndexPart createCopyOnWriteIndexPart();
+  protected abstract CopyOnWriteIndexPart<T> createCopyOnWriteIndexPart();
 
   /**
    * Called just before modifying an index if wr_cow has a value, tell that

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_backwards.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_backwards.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_backwards.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_backwards.java
 Thu Jul 19 19:34:04 2018
@@ -146,13 +146,13 @@ class FsIterator_backwards<T extends Fea
   }
 
   @Override
-  public FeatureStructure[] getArray() {
-    FeatureStructure[] a = it.getArray();
+  public T[] getArray(Class<? super T> clazz) {
+    T[] a = it.getArray(clazz);
     int len = a.length;
     int len2 = len >> 1;
     int len1 = len - 1;
     for (int i = 0, i2 = len1; i < len2; i++, i2--) {
-      FeatureStructure t = a[i];
+      T t = a[i];
       a[i] = a[i2];
       a[i2] = t;
     }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_bag.java
 Thu Jul 19 19:34:04 2018
@@ -19,8 +19,8 @@
 
 package org.apache.uima.cas.impl;
 
+import java.lang.reflect.Array;
 import java.util.Comparator;
-import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.uima.UIMAFramework;
@@ -33,7 +33,7 @@ class FsIterator_bag<T extends FeatureSt
 
   private static final AtomicInteger moveToCount = new AtomicInteger(0);
   
-  protected CopyOnWriteObjHashSet<TOP> bag;
+  protected CopyOnWriteObjHashSet<T> bag;
   final protected FsIndex_bag<T> fsBagIndex; // just an optimization, is == to 
fsLeafIndexImpl from super class, allows dispatch w/o casting
   
   private int position = -1;  
@@ -42,16 +42,16 @@ class FsIterator_bag<T extends FeatureSt
   
 
 
-  FsIterator_bag(FsIndex_bag<T> fsBagIndex, TypeImpl ti, CopyOnWriteIndexPart 
cow_wrapper) {
+  FsIterator_bag(FsIndex_bag<T> fsBagIndex, TypeImpl ti, 
CopyOnWriteIndexPart<T> cow_wrapper) {
     super(ti);
     this.fsBagIndex = fsBagIndex;  // need for copy()
-    bag = (CopyOnWriteObjHashSet<TOP>) cow_wrapper;
+    bag = (CopyOnWriteObjHashSet<T>) cow_wrapper;
     moveToFirst();
   }
   
   public boolean maybeReinitIterator() {
     if (!bag.isOriginal()) {
-      bag = (CopyOnWriteObjHashSet<TOP>) fsBagIndex.getNonNullCow();
+      bag = (CopyOnWriteObjHashSet<T>) fsBagIndex.getNonNullCow();
       return true;
     }
     return false;
@@ -186,8 +186,8 @@ class FsIterator_bag<T extends FeatureSt
   }
 
   @Override
-  public FeatureStructure[] getArray() {
-    TOP[] a = new TOP[size()];
+  public T[] getArray(Class<? super T> clazz) {
+    T[] a = (T[]) Array.newInstance(clazz, size());
     bag.copyToArray(a, 0);
     return a;
   }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_limited.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_limited.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_limited.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_limited.java
 Thu Jul 19 19:34:04 2018
@@ -19,7 +19,9 @@
 
 package org.apache.uima.cas.impl;
 
+import java.util.Arrays;
 import java.util.Comparator;
+
 import org.apache.uima.cas.FSIterator;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.jcas.cas.TOP;
@@ -141,12 +143,10 @@ class FsIterator_limited<T extends Featu
   }
 
   @Override
-  public FeatureStructure[] getArray() {
-    FeatureStructure[] a = iterator.getArray();
+  public T[] getArray(Class<? super T> clazz) {
+    T[] a = iterator.getArray(clazz);
     if (a.length > limit) {
-      FeatureStructure[] a2 = new FeatureStructure[limit];
-      System.arraycopy(a, 0, a2, 0, limit);
-      return a2;
+      return Arrays.copyOf(a,  limit);
     }
     return a;
   }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_multiple_indexes.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_multiple_indexes.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_multiple_indexes.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_multiple_indexes.java
 Thu Jul 19 19:34:04 2018
@@ -19,6 +19,7 @@
 
 package org.apache.uima.cas.impl;
 
+import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Comparator;
 
@@ -193,11 +194,11 @@ public abstract class FsIterator_multipl
   }  
   
   @Override
-  public FeatureStructure[] getArray() {
-    FeatureStructure[] a = new FeatureStructure[size()];
+  public T[] getArray(Class<? super T> clazz) {
+    T[] a = (T[]) Array.newInstance(clazz, size());
     int destPos = 0;
     for (LowLevelIterator<T> it : nonEmptyIterators) {
-      FeatureStructure[] p = it.getArray();
+      T[] p = it.getArray(clazz);
       System.arraycopy(p, 0, a, destPos, p.length);
       destPos += p.length;
     }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted2.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted2.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted2.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_set_sorted2.java
 Thu Jul 19 19:34:04 2018
@@ -19,6 +19,7 @@
 
 package org.apache.uima.cas.impl;
 
+import java.lang.reflect.Array;
 import java.util.Comparator;
 
 import org.apache.uima.cas.FeatureStructure;
@@ -300,8 +301,8 @@ class FsIterator_set_sorted2<T extends F
   }
 
   @Override
-  public FeatureStructure[] getArray() {
-    TOP[] a = new TOP[size()];
+  public T[] getArray(Class<? super T> clazz) {
+    T[] a = (T[]) Array.newInstance(clazz, size());
     this.ofsa.copyToArray(a, 0);
     return a;
   }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_subtypes_snapshot.java
 Thu Jul 19 19:34:04 2018
@@ -263,7 +263,7 @@ public class FsIterator_subtypes_snapsho
 
 
   @Override
-  public FeatureStructure[] getArray() {
+  public T[] getArray(Class<? super T> clazz) {
     return snapshot;
   }  
  

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java
 Thu Jul 19 19:34:04 2018
@@ -22,7 +22,6 @@ package org.apache.uima.cas.impl;
 import java.util.Comparator;
 
 import org.apache.uima.cas.FSIndex;
-import org.apache.uima.cas.FSIterator;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.SelectFSs;
 import org.apache.uima.cas.Type;

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIterator.java
 Thu Jul 19 19:34:04 2018
@@ -175,7 +175,7 @@ public interface LowLevelIterator<T exte
   /**
    * @return an array representing the collection of items the iterator would 
return
    */
-  default FeatureStructure[] getArray() { 
+  default  T[] getArray(Class<? super T> clazz) { 
     throw new UnsupportedOperationException();
   }
   

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
 Thu Jul 19 19:34:04 2018
@@ -652,7 +652,7 @@ public class SelectFSs_impl <T extends F
   
   private FSIterator<T> make_or_copy_snapshot(LowLevelIterator<T> 
baseIterator, boolean bkwd) {
     FSIterator<T> it;
-    T[] a = (T[]) asArray(baseIterator);  // array is in forward order because 
+    T[] a = (T[]) asArray(baseIterator, FeatureStructure.class);  // array is 
in forward order because 
                                           // it's produced by a backwards 
iterator, but then the array is reversed
     it = new FsIterator_subtypes_snapshot<T>(
                            a, 
@@ -877,54 +877,40 @@ public class SelectFSs_impl <T extends F
    * 
    */
   @Override
-  public <N extends T> List<N> asList() {
+  public List<T> asList() {
  
-    return new AbstractList<N>() {
- 
-      /**
-       * iterator used for two purposes:
-       *   - as underlying impl for listIterator 
-       *   - to compute the size
-       */
-      private final LowLevelIterator<T> it = (LowLevelIterator<T>) 
fsIterator();
+    return new AbstractList<T>() {
+      
+      private final T[] a = asArray((LowLevelIterator<T>) fsIterator());
       
-      N[] a = asArrayFs(it);
-
       @Override
-      public N get(int i) {
+      public T get(int i) {
         return a[i];
       }
 
       @Override
       public int size() {
-        return it.size();
+        return a.length;
       }
     };
-      
-      
      
-    
   }
   
   /* (non-Javadoc)
    * @see org.apache.uima.cas.SelectFSs#asArray()
    */
   @Override
-  public <N extends T> N[] asArray(Class<N> clazz) {
-    return asArray((LowLevelIterator<T>)fsIterator());
-  }
-
-  private <N extends T> N[] asArrayFs(LowLevelIterator<T> it) {
-    return (N[]) ((LowLevelIterator<T>)it).getArray();
+  public T[] asArray(Class<? super T> clazz) {
+    return asArray((LowLevelIterator<T>)fsIterator(), clazz);
   }
   
-  private <N extends T> N[] asArray(LowLevelIterator<T> it) {
-    return (N[]) ((LowLevelIterator<T>)it).getArray();
+  private T[] asArray(LowLevelIterator<T> it, Class<? super T> clazz) {
+    return ((LowLevelIterator<T>)it).getArray(clazz);
   }
     
-//  private FeatureStructure[] asArray(FSIterator<T> it) {
-//    return asArray(it, FeatureStructure.class);
-//  }
+  private T[] asArray(LowLevelIterator<T> it) {
+    return asArray(it, (Class<? super T>) ((TypeImpl)it.getType()).javaClass);
+  }
   
 
   private Annotation makePosAnnot(int begin, int end) {

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
 Thu Jul 19 19:34:04 2018
@@ -23,14 +23,12 @@ import java.util.NoSuchElementException;
 
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.impl.CopyOnWriteIndexPart;
-import org.apache.uima.internal.util.ObjHashSet;
-import org.apache.uima.jcas.cas.TOP;
 
 /**
  * implements ObjHashSet partially, for iterator use
  */
 
-public class CopyOnWriteObjHashSet<T> implements CopyOnWriteIndexPart {
+public class CopyOnWriteObjHashSet<T extends FeatureStructure> implements 
CopyOnWriteIndexPart<T>{
   
   private ObjHashSet<T> ohs;
   
@@ -186,11 +184,11 @@ public class CopyOnWriteObjHashSet<T> im
    * @see 
org.apache.uima.cas.impl.CopyOnWriteIndexPart#copyToArray(org.apache.uima.jcas.cas.TOP[],
 int)
    */
   @Override
-  public int copyToArray(TOP[] target, int startingIndexInTarget) {
+  public int copyToArray(T[] target, int startingIndexInTarget) {
     Iterator<T> it = iterator();
     int i = startingIndexInTarget;
     while (it.hasNext()) {
-      target[i++] = (TOP) it.next();
+      target[i++] = it.next();
     }
     return i;
   }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteOrderedFsSet_array.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteOrderedFsSet_array.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteOrderedFsSet_array.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteOrderedFsSet_array.java
 Thu Jul 19 19:34:04 2018
@@ -21,32 +21,32 @@ package org.apache.uima.internal.util;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.impl.CopyOnWriteIndexPart;
-import org.apache.uima.jcas.cas.TOP;
 
 /**
  * implements OrderedFsSet_array partially, for iterator use
  */
 
-public class CopyOnWriteOrderedFsSet_array implements CopyOnWriteIndexPart {
+public class CopyOnWriteOrderedFsSet_array<T extends FeatureStructure> 
implements CopyOnWriteIndexPart<T> {
   
-  private OrderedFsSet_array<TOP> set;
+  private OrderedFsSet_array<T> set;
     
   final public int a_firstUsedslot;
   final public int a_nextFreeslot;
-  final public OrderedFsSet_array<TOP> original;
+  final public OrderedFsSet_array<T> original;
   final private int original_size;
   
-  public TOP[] a;  // derived from "set" above
+  public T[] a;  // derived from "set" above
    
-  public CopyOnWriteOrderedFsSet_array(OrderedFsSet_array original) {
+  public CopyOnWriteOrderedFsSet_array(OrderedFsSet_array<T> original) {
     this.set = original;    
     this.original = original;
 //    this.comparatorNoTypeWithoutID = original.comparatorNoTypeWithoutID;
 //    this.comparatorNoTypeWithID = original.comparatorNoTypeWithID;
     this.a_firstUsedslot = original.a_firstUsedslot;
     this.a_nextFreeslot = original.a_nextFreeslot;
-    this.a = original.a;
+    this.a = (T[]) original.a;
     this.original_size = original.size();
   }
   
@@ -56,8 +56,8 @@ public class CopyOnWriteOrderedFsSet_arr
    */
   @Override
   public void makeReadOnlyCopy() {
-    this.set = new OrderedFsSet_array<TOP>(set, true); // true = make read 
only copy
-    this.a = set.a;
+    this.set = new OrderedFsSet_array<T>(set, true); // true = make read only 
copy
+    this.a = (T[]) set.a;
   }
 
   /* (non-Javadoc)
@@ -110,7 +110,7 @@ public class CopyOnWriteOrderedFsSet_arr
     return set.toString();
   }
     
-  public OrderedFsSet_array<TOP> getOfsa() {
+  public OrderedFsSet_array<T> getOfsa() {
     return set;
   }
   
@@ -118,8 +118,8 @@ public class CopyOnWriteOrderedFsSet_arr
    * @see java.lang.Iterable#iterator()
    */
   @Override
-  public Iterator<TOP> iterator() {
-    return new Iterator<TOP>() {
+  public Iterator<T> iterator() {
+    return new Iterator<T>() {
 
       int pos = a_firstUsedslot;
       
@@ -129,11 +129,11 @@ public class CopyOnWriteOrderedFsSet_arr
       }
 
       @Override
-      public TOP next() {
+      public T next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        return a[pos++];
+        return (T) a[pos++];
       }      
     };
   }
@@ -142,7 +142,7 @@ public class CopyOnWriteOrderedFsSet_arr
    * @see 
org.apache.uima.cas.impl.CopyOnWriteIndexPart#copyToArray(org.apache.uima.jcas.cas.TOP[],
 int)
    */
   @Override
-  public int copyToArray(TOP[] target, int startingIndexInTarget) {
+  public int copyToArray(T[] target, int startingIndexInTarget) {
     System.arraycopy(a, a_firstUsedslot, target, startingIndexInTarget, 
size());
     return startingIndexInTarget + size();
   }

Modified: 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/OrderedFsSet_array.java
URL: 
http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/OrderedFsSet_array.java?rev=1836297&r1=1836296&r2=1836297&view=diff
==============================================================================
--- 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/OrderedFsSet_array.java
 (original)
+++ 
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/OrderedFsSet_array.java
 Thu Jul 19 19:34:04 2018
@@ -67,8 +67,10 @@ public class OrderedFsSet_array<T extend
    */
   int a_nextFreeslot = 0;
   int a_firstUsedslot = 0;
-    
-  final private Comparator<TOP> comparatorNoTypeWithID;
+    // comparators are over TOP, not "T", because it's allowed to compare
+    //   items which are supertypes of the index's items
+    //   e.g. compare something of type Annotation with "Token"
+  final private Comparator<TOP> comparatorNoTypeWithID;  
   final private Comparator<TOP> comparatorNoTypeWithoutID;
   private int maxSize = 0; // managing shrinking
   
@@ -189,9 +191,7 @@ public class OrderedFsSet_array<T extend
                     ? a.length + multiplication_limit
                     : (a.length << 1);
        
-    TOP[] aa = new TOP[newSize];
-    System.arraycopy(a, 0, aa, 0, a.length);
-    a = aa;
+    a = Arrays.copyOf(a, newSize);
   }
       
   /**
@@ -336,7 +336,7 @@ public class OrderedFsSet_array<T extend
    * @return - the index of the found item, or if not found, the (-index) -1 
of the 
    *           position one more than where the item would go
    */
-  public static int binarySearch(
+  public int binarySearch(
       TOP[] _a, 
       int start, 
       int end,
@@ -549,7 +549,7 @@ public class OrderedFsSet_array<T extend
           b.append(",\n");
         }
         if (i != null) {
-          b.append(i.toShortString());
+          b.append(((TOP)i).toShortString());
         } else {
           b.append("null");
         }


Reply via email to