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
}