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/08/18 17:25:47 UTC

svn commit: r1756836 - in /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima: cas/impl/FeatureStructureImplC.java jcas/cas/FSArray.java

Author: schor
Date: Thu Aug 18 17:25:47 2016
New Revision: 1756836

URL: http://svn.apache.org/viewvc?rev=1756836&view=rev
Log:
[UIMA-5030] FSArray support for Pears

Modified:
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArray.java

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java?rev=1756836&r1=1756835&r2=1756836&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java Thu Aug 18 17:25:47 2016
@@ -556,7 +556,7 @@ public class FeatureStructureImplC imple
    * @param v the FS to check
    * @return the FS or if it was a trampoline, the base FS
    */
-  private TOP _maybeGetBaseForPearFs(TOP v) {
+  protected TOP _maybeGetBaseForPearFs(TOP v) {
     return (v == null) 
              ? null
              : v._isPearTrampoline() 
@@ -564,6 +564,17 @@ public class FeatureStructureImplC imple
                  : v;
   }
   
+  /**
+   * Called when getting a FS value which might need to return a Pear context's trampoline
+   * @param v the FS to check
+   * @return the FS or if we're in a Pear context, perhaps the trampoline (only some classes might have trampolines)
+   */
+  protected TOP _maybeGetPearFs(TOP v) {
+    return (_casView.inPearContext()) 
+      ? _casView.pearConvert(v)
+      : v;
+  }
+  
   public void _setFeatureValueNcWj(int adjOffset, FeatureStructure v) {
     _setRefValueCommonWj(_getFeatFromAdjOffset(adjOffset, false), _maybeGetBaseForPearFs((TOP)v));
   }
@@ -760,10 +771,7 @@ public class FeatureStructureImplC imple
   public TOP _getFeatureValueNc(FeatureImpl feat) { return _getFeatureValueNc(feat.getAdjustedOffset()); }
 
   public TOP _getFeatureValueNc(int adjOffset) { 
-    TOP r = (TOP) _refData[adjOffset /*+ _getRefDataArrayOffset()*/];
-    return (_casView.inPearContext()) 
-             ? _casView.pearConvert(r)
-             : r;      
+    return _maybeGetPearFs((TOP) _refData[adjOffset /*+ _getRefDataArrayOffset()*/]);
   }
  
   @Override

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=1756836&r1=1756835&r2=1756836&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 Thu Aug 18 17:25:47 2016
@@ -91,17 +91,17 @@ public final class FSArray extends TOP i
 
   /** return the indexed value from the corresponding Cas FSArray as a Java Model object. */
   public TOP get(int i) {
-    return theArray[i];
+    return _maybeGetPearFs(theArray[i]);
   }
 
   /** updates the Cas, setting the indexed value with the corresponding Cas FeatureStructure. */
   public void set(int i, FeatureStructure v) {
     TOP vt = (TOP) v;
-    if (v != null && _casView.getBaseCAS() != vt._casView.getBaseCAS()) {
+    if (vt != null && _casView.getBaseCAS() != vt._casView.getBaseCAS()) {
       /** Feature Structure {0} belongs to CAS {1}, may not be set as the value of an array or list element in a different CAS {2}.*/
       throw new CASRuntimeException(CASRuntimeException.FS_NOT_MEMBER_OF_CAS, vt, vt._casView, _casView);
     }
-    theArray[i] = vt;
+    theArray[i] = _maybeGetBaseForPearFs(vt);
     _casView.maybeLogArrayUpdate(this, null, i);
   }
 
@@ -114,21 +114,43 @@ public final class FSArray extends TOP i
    * @see org.apache.uima.cas.ArrayFS#copyFromArray(FeatureStructure[], int, int, int)
    */
   public void copyFromArray(FeatureStructure[] src, int srcPos, int destPos, int length) {
-    System.arraycopy(src, srcPos, theArray, destPos, length);
+    int srcEnd = srcPos + length;
+    int destEnd = destPos + length;
+    if (srcPos < 0 ||
+        srcEnd > src.length ||
+        destEnd > size()) {
+      throw new ArrayIndexOutOfBoundsException(
+          String.format("FSArray.copyFromArray, srcPos: %,d destPos: %,d length: %,d",  srcPos, destPos, length));
+    }
+    for (;srcPos < srcEnd && destPos < destEnd;) {
+      set(destPos++, src[srcPos++]);
+    }
   }
 
   /**
    * @see org.apache.uima.cas.ArrayFS#copyToArray(int, FeatureStructure[], int, int)
    */
   public void copyToArray(int srcPos, FeatureStructure[] dest, int destPos, int length) {
-    System.arraycopy(theArray, srcPos, dest, destPos, length);
+    int srcEnd = srcPos + length;
+    int destEnd = destPos + length;
+    if (srcPos < 0 ||
+        srcEnd > size() ||
+        destEnd > dest.length) {
+      throw new ArrayIndexOutOfBoundsException(
+          String.format("FSArray.copyToArray, srcPos: %,d destPos: %,d length: %,d",  srcPos, destPos, length));
+    }
+    for (;srcPos < srcEnd && destPos < destEnd;) {
+      dest[destPos++] = _maybeGetPearFs(get(srcPos++));
+    }
   }
 
   /**
    * @see org.apache.uima.cas.ArrayFS#toArray()
    */
   public FeatureStructure[] toArray() {
-    return theArray.clone();
+    FeatureStructure[] r = new FeatureStructure[size()];
+    copyToArray(0, r, 0, size());
+    return r;
   }
 
   /**
@@ -158,7 +180,7 @@ public final class FSArray extends TOP i
   public void copyToArray(int srcPos, String[] dest, int destPos, int length) {
     _casView.checkArrayBounds(theArray.length, srcPos, length);
     for (int i = 0; i < length; i++) {
-      FeatureStructure fs = theArray[i + srcPos];
+      FeatureStructure fs = _maybeGetPearFs(theArray[i + srcPos]);
       dest[i + destPos] = (fs == null) ? null : fs.toString();
     }
   }
@@ -171,12 +193,15 @@ public final class FSArray extends TOP i
   }
 
   // internal use
+  // used by serializers
+  // no conversion to Pear trampolines done
   public TOP[] _getTheArray() {
     return theArray;
   }
   
   /* (non-Javadoc)
    * @see org.apache.uima.jcas.cas.CommonArray#copyValuesFrom(org.apache.uima.jcas.cas.CommonArray)
+   * no conversion to Pear trampolines done
    */
   @Override
   public void copyValuesFrom(CommonArray v) {