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/14 14:35:48 UTC

svn commit: r1774249 - in /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas: FSArray.java FSArrayList.java FSList.java NonEmptyFSList.java NonEmptyStringList.java StringArray.java StringList.java

Author: schor
Date: Wed Dec 14 14:35:48 2016
New Revision: 1774249

URL: http://svn.apache.org/viewvc?rev=1774249&view=rev
Log:
[UIMA-5207] Add iterable to fs array/list, string array/list.  Do proper journaling for array updates

Modified:
    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/FSArrayList.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/java/org/apache/uima/jcas/cas/NonEmptyStringList.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringArray.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java

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=1774249&r1=1774248&r2=1774249&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 Dec 14 14:35:48 2016
@@ -19,6 +19,9 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.ArrayFS;
 import org.apache.uima.cas.CASRuntimeException;
 import org.apache.uima.cas.FeatureStructure;
@@ -28,7 +31,7 @@ import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** Java Class model for Cas FSArray type */
-public final class FSArray extends TOP implements CommonArray, ArrayFS, SelectViaCopyToArray {
+public final class FSArray extends TOP implements Iterable<TOP>, CommonArray, ArrayFS, SelectViaCopyToArray {
 
   /**
    * each cover class when loaded sets an index. used in the JCas typeArray to go from the cover
@@ -128,6 +131,9 @@ public final class FSArray extends TOP i
       throw new ArrayIndexOutOfBoundsException(
           String.format("FSArray.copyFromArray, srcPos: %,d destPos: %,d length: %,d",  srcPos, destPos, length));
     }
+    
+    // doing this element by element to get pear conversions done if needed, and 
+    // to get journaling done
     for (;srcPos < srcEnd && destPos < destEnd;) {
       set(destPos++, src[srcPos++]);
     }
@@ -215,6 +221,7 @@ public final class FSArray extends TOP i
   public void copyValuesFrom(CommonArray v) {
     FSArray bv = (FSArray) v;
     System.arraycopy(bv.theArray,  0,  theArray, 0, theArray.length);
+    _casView.maybeLogArrayUpdates(this, 0, size());
   }
   
   /**
@@ -228,4 +235,24 @@ public final class FSArray extends TOP i
     fsa.copyFromArray(a, 0, 0, a.length);
     return fsa;
   }
+
+  @Override
+  public Iterator<TOP> iterator() {
+    return new Iterator<TOP>() {
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public TOP next() {
+        if (!hasNext()) {
+          throw new NoSuchElementException();
+        }
+        return get(i++);  // does trampoline conversion
+      }
+    };
+  }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java?rev=1774249&r1=1774248&r2=1774249&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java Wed Dec 14 14:35:48 2016
@@ -19,9 +19,11 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -201,7 +203,26 @@ public final class FSArrayList <T extend
    */
   @Override
   public void _init_from_cas_data() {
-    fsArrayAsList = (List<T>) Arrays.asList(gta());
+    // special handling to have getter and setter honor pear trampolines
+//    fsArrayAsList = (List<T>) Arrays.asList(gta());
+    final FSArray fsa = getFsArray();
+    if (null == fsa) {
+      fsArrayAsList = Collections.emptyList();
+    } else {
+    
+      fsArrayAsList = new AbstractList<T>() {
+        int i = 0;
+        @Override
+        public T get(int index) {
+          return (T) fsa.get(i);
+        }
+  
+        @Override
+        public int size() {
+          return fsa.size();
+        }      
+      };
+    }
   }
   
   /* (non-Javadoc)
@@ -210,18 +231,28 @@ public final class FSArrayList <T extend
   @Override
   public void _save_to_cas_data() {
     // if fsArraysAsList is not null, then the cas data form is still valid, do nothing
-    if (null != fsArrayAsList) return;
+    if (null != fsArrayAsList) {
+      return;
+    }
     
     // reallocate fsArray if wrong size
-    int sz = size();
+    final int sz = size();
     FSArray fsa = getFsArray();
     if (fsa == null || fsa.size() != sz) {
       setFsArray(fsa = new FSArray(_casView.getExistingJCas(), sz));
     }
     
-    // use the toArray(arg) method with the arg the correct size to set the values into the array
-    // from the fsArrayList    
-    fsArrayList.toArray(fsa._getTheArray());
+    // using element by element instead of bulk operations to
+    //   pick up any pear trampoline conversion and 
+    //   in case fsa was preallocated and right size, may need journaling
+    int i = 0;
+    for (TOP fs : fsArrayList) {
+      TOP currentValue = fsa.get(i);
+      if (currentValue != fs) {
+        fsa.set(i, fs); // done this way to record for journaling for delta CAS
+      }
+      i++;
+    }
   }
   
   /**

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=1774249&r1=1774248&r2=1774249&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 Dec 14 14:35:48 2016
@@ -19,16 +19,18 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Collections;
+import java.util.Iterator;
+
 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 {
+public abstract class FSList extends TOP implements CommonList, Iterable<TOP> {
  
 	// Never called.
 	protected FSList() {// Disable default constructor
@@ -112,4 +114,14 @@ public abstract class FSList extends TOP
     last.setTail(jcas.getCasImpl().getEmptyFSList());
     return fslhead.getTail();
   }
+
+  /* (non-Javadoc)
+   * @see java.lang.Iterable#iterator()
+   */
+  @Override
+  public Iterator<TOP> iterator() {
+    return Collections.emptyIterator();  // overridden by NonEmptyFSList
+  }
+  
+  
 }

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=1774249&r1=1774248&r2=1774249&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 Dec 14 14:35:48 2016
@@ -19,6 +19,9 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.CASRuntimeException;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.impl.CASImpl;
@@ -27,7 +30,7 @@ import org.apache.uima.cas.impl.TypeSyst
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class NonEmptyFSList extends FSList implements NonEmptyList {
+public class NonEmptyFSList extends FSList implements Iterable<TOP>, NonEmptyList {
 
   public final static int typeIndexID = JCasRegistry.register(NonEmptyFSList.class);
 
@@ -140,4 +143,29 @@ public class NonEmptyFSList extends FSLi
     setTail(node);
     return node;
   }
+
+  @Override
+  public Iterator<TOP> iterator() {
+    return new Iterator<TOP>() {
+
+      FSList node = NonEmptyFSList.this;
+      
+      @Override
+      public boolean hasNext() {
+        return node instanceof NonEmptyFSList;
+      }
+
+      @Override
+      public TOP next() {
+        if (!hasNext()) {
+          throw new NoSuchElementException();
+        }
+        NonEmptyFSList nn = (NonEmptyFSList)node; 
+        TOP element = nn.getHead();
+        node = nn.getTail();
+        return element;
+      }
+      
+    };
+  }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java?rev=1774249&r1=1774248&r2=1774249&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/NonEmptyStringList.java Wed Dec 14 14:35:48 2016
@@ -19,6 +19,9 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.CASRuntimeException;
 import org.apache.uima.cas.impl.CASImpl;
 import org.apache.uima.cas.impl.TypeImpl;
@@ -26,7 +29,7 @@ import org.apache.uima.cas.impl.TypeSyst
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
-public class NonEmptyStringList extends StringList implements NonEmptyList {
+public class NonEmptyStringList extends StringList implements Iterable<String>, NonEmptyList {
 
   public final static int typeIndexID = JCasRegistry.register(NonEmptyStringList.class);
 
@@ -136,4 +139,29 @@ public class NonEmptyStringList extends
   public EmptyStringList getEmptyList() {
     return this._casView.getEmptyStringList();
   }
+
+  @Override
+  public Iterator<String> iterator() {
+    return new Iterator<String>() {
+
+      StringList node = NonEmptyStringList.this;
+      
+      @Override
+      public boolean hasNext() {
+        return node instanceof NonEmptyStringList;
+      }
+
+      @Override
+      public String next() {
+        if (!hasNext()) {
+          throw new NoSuchElementException();
+        }
+        NonEmptyStringList nn = (NonEmptyStringList)node; 
+        String element = nn.getHead();
+        node = nn.getTail();
+        return element;
+      }
+      
+    };
+  }
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringArray.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringArray.java?rev=1774249&r1=1774248&r2=1774249&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringArray.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringArray.java Wed Dec 14 14:35:48 2016
@@ -19,6 +19,9 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.uima.cas.StringArrayFS;
 import org.apache.uima.cas.impl.CASImpl;
 import org.apache.uima.cas.impl.TypeImpl;
@@ -26,7 +29,7 @@ import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.JCasRegistry;
 
 /** JCas class model for StringArray */
-public final class StringArray extends TOP implements CommonPrimitiveArray, StringArrayFS {
+public final class StringArray extends TOP implements Iterable<String>, CommonPrimitiveArray, StringArrayFS {
   /**
    * 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
@@ -106,6 +109,7 @@ public final class StringArray extends T
    */
   public void copyFromArray(String[] src, int srcPos, int destPos, int length) {
     System.arraycopy(src, srcPos, theArray, destPos, length);
+    _casView.maybeLogArrayUpdates(this, destPos, length);
   }
 
   /**
@@ -146,6 +150,7 @@ public final class StringArray extends T
   public void copyValuesFrom(CommonArray v) {
     StringArray bv = (StringArray) v;
     System.arraycopy(bv.theArray,  0,  theArray, 0, theArray.length);
+    _casView.maybeLogArrayUpdates(this, 0, size());
   }
 
   /* (non-Javadoc)
@@ -156,4 +161,25 @@ public final class StringArray extends T
     set(i, v);    
   }
 
+  @Override
+  public Iterator<String> iterator() {
+    return new Iterator<String>() {
+
+      int i = 0;
+      
+      @Override
+      public boolean hasNext() {
+        return i < size();
+      }
+
+      @Override
+      public String next() {
+        if (!hasNext()) {
+          throw new NoSuchElementException();
+        }
+        return get(i++);
+      }      
+    };
+  }
+
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java?rev=1774249&r1=1774248&r2=1774249&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/StringList.java Wed Dec 14 14:35:48 2016
@@ -19,13 +19,24 @@
 
 package org.apache.uima.jcas.cas;
 
+import java.util.Collections;
+import java.util.Iterator;
+
 import org.apache.uima.cas.impl.CASImpl;
 import org.apache.uima.cas.impl.TypeImpl;
 import org.apache.uima.jcas.JCas;
 
-public abstract class StringList extends TOP implements CommonList {
+public abstract class StringList extends TOP implements CommonList, Iterable<String> {
+
+	/* (non-Javadoc)
+   * @see java.lang.Iterable#iterator()
+   */
+  @Override
+  public Iterator<String> iterator() {
+    return Collections.emptyIterator(); // overridden by NonEmptyStringList
+  }
 
-	// Never called.
+  // Never called.
 	protected StringList() { // Disable default constructor
 	}