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 2017/10/02 17:32:27 UTC

svn commit: r1810560 - in /uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima: cas/impl/CASImpl.java cas/impl/XCASDeserializer.java cas/impl/XmiCasDeserializer.java jcas/cas/Sofa.java

Author: schor
Date: Mon Oct  2 17:32:26 2017
New Revision: 1810560

URL: http://svn.apache.org/viewvc?rev=1810560&view=rev
Log:
[UIMA-5600] fix deserialization of sofa array data values

Modified:
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiCasDeserializer.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/Sofa.java

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1810560&r1=1810559&r2=1810560&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Mon Oct  2 17:32:26 2017
@@ -1902,12 +1902,29 @@ public class CASImpl extends AbstractCas
   }
   
   /**
+   * internal use - special setter for setting feature values, including
+   *   special handling if the feature is for the sofaArray,
+   *   when deserializing
+   * @param fs - 
+   * @param feat -
+   * @param value -
+   */
+  public static void setFeatureValueMaybeSofa(TOP fs, FeatureImpl feat, TOP value) {
+    if (fs instanceof Sofa) {
+      assert feat.getCode() == sofaArrayFeatCode;
+      ((Sofa)fs).setLocalSofaData(value);
+    } else {
+      fs.setFeatureValue(feat, value);
+    }
+  }
+  
+  /**
    * Internal use, for cases where deserializing - special case setting sofString to skip updating the document annotation
    * @param fs -
    * @param feat -
    * @param s -
    */
-  public void setFeatureValueFromStringNoDocAnnotUpdate(FeatureStructureImplC fs, FeatureImpl feat, String s) {
+  public static void setFeatureValueFromStringNoDocAnnotUpdate(FeatureStructureImplC fs, FeatureImpl feat, String s) {
     if (fs instanceof Sofa && 
         feat.getCode() == sofaStringFeatCode) {
       ((Sofa)fs).setLocalSofaDataNoDocAnnotUpdate(s);
@@ -1922,7 +1939,7 @@ public class CASImpl extends AbstractCas
    * @param feat the feature to update-
    * @param s the string representation of the value, could be null
    */
-  public void setFeatureValueFromString(FeatureStructureImplC fs, FeatureImpl feat, String s) {
+  public static void setFeatureValueFromString(FeatureStructureImplC fs, FeatureImpl feat, String s) {
     final TypeImpl range = feat.getRangeImpl();
     if (fs instanceof Sofa) {
       // sofa has special setters

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java?rev=1810560&r1=1810559&r2=1810560&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java Mon Oct  2 17:32:26 2017
@@ -895,7 +895,7 @@ public class XCASDeserializer {
           String featName = "_ref_" + featFullName.substring(separatorOffset + 1);
           ootsAttrs.add(new Pair(featName, Integer.toString(extId)));
         }
-        fs.setFeatureValue(fi, null);
+        CASImpl.setFeatureValueMaybeSofa(fs, fi, null);
       } else {
         // the sofa ref in annotationBase is set when the fs is created, not here
         if (fi.getCode() != TypeSystemConstants.annotBaseSofaFeatCode) { 
@@ -911,7 +911,7 @@ public class XCASDeserializer {
           
           // handle case where feature is xyz[] (an array ref, not primitive) but the value of fs is FSArray
           ts.fixupFSArrayTypes(fi.getRangeImpl(), fsInfo.fs);
-          fs.setFeatureValue(fi, fsInfo.fs);
+          CASImpl.setFeatureValueMaybeSofa(fs, fi, fsInfo.fs);
         }
       }
     }

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiCasDeserializer.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiCasDeserializer.java?rev=1810560&r1=1810559&r2=1810560&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiCasDeserializer.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/XmiCasDeserializer.java Mon Oct  2 17:32:26 2017
@@ -1081,7 +1081,7 @@ public class XmiCasDeserializer {
           
             ByteArray byteArray = createOrUpdateByteArray(featVal, -1, existingByteArray);
             if (byteArray != existingByteArray) {
-              fs.setFeatureValue(fi,  byteArray);
+              CASImpl.setFeatureValueMaybeSofa(fs, fi, byteArray);
             }
           } else {  // not ByteArray, but encoded locally
             String[] arrayVals = parseArray(featVal);
@@ -1112,14 +1112,14 @@ public class XmiCasDeserializer {
 
     private void deserializeFsRef(String featVal, FeatureImpl fi, TOP fs) {
       if (featVal == null || featVal.length() == 0) {
-        fs.setFeatureValue(fi, null);  
+        CASImpl.setFeatureValueMaybeSofa(fs, fi, null);  
       } else {
         int xmiId = Integer.parseInt(featVal); 
         TOP tgtFs = maybeGetFsForXmiId(xmiId);
         if (null == tgtFs) {
           fixupToDos.add( () -> finalizeRefValue(xmiId, fs, fi));
         } else {
-          fs.setFeatureValue(fi,  tgtFs);
+          CASImpl.setFeatureValueMaybeSofa(fs, fi, tgtFs);
           ts.fixupFSArrayTypes(fi.getRangeImpl(), tgtFs);
         }
       }
@@ -1192,7 +1192,7 @@ public class XmiCasDeserializer {
           CommonArrayFS existingArray = (CommonArrayFS) fs.getFeatureValue(fi);
           CommonArrayFS casArray = createOrUpdateArray(fi.getRangeImpl(), featVals, -1, existingArray);
           if (existingArray != casArray) {
-            fs.setFeatureValue(fi, casArray);
+            CASImpl.setFeatureValueMaybeSofa(fs, fi, (TOP)casArray);
           }
           //add to nonshared fs to encompassing FS map
           if (!fi.isMultipleReferencesAllowed()) {  // ! multiple refs => value is not shared
@@ -1829,10 +1829,10 @@ public class XmiCasDeserializer {
           // the element may be out of typesystem.  In that case set it
           // to null, but record the id so we can add it back on next serialization.
           this.sharedData.addOutOfTypeSystemAttribute(fs, fi.getShortName(), Integer.toString(xmiId));
-          fs.setFeatureValue(fi,  null);
+          CASImpl.setFeatureValueMaybeSofa(fs, fi, null);
         }
       } else {
-        fs.setFeatureValue(fi,  tgtFs);
+        CASImpl.setFeatureValueMaybeSofa(fs, fi, tgtFs);
         ts.fixupFSArrayTypes(fi.getRangeImpl(), tgtFs);
       }
     }

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/Sofa.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/Sofa.java?rev=1810560&r1=1810559&r2=1810560&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/Sofa.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/jcas/cas/Sofa.java Mon Oct  2 17:32:26 2017
@@ -37,12 +37,12 @@ public class Sofa extends TOP implements
   
   /* public static string for use where constants are needed, e.g. in some Java Annotations */
   public final static String _TypeName = CAS.TYPE_NAME_SOFA;
-  public final static String _FeatName_sofaNum    = "sofaNum";
-  public final static String _FeatName_sofaID     = "sofaID";
-  public final static String _FeatName_mimeType   = "mimeType";
-  public final static String _FeatName_sofaArray  = "sofaArray";
-  public final static String _FeatName_sofaString = "sofaString";
-  public final static String _FeatName_sofaURI    = "sofaURI";
+  public final static String _FeatName_sofaNum    = "sofaNum";  // int
+  public final static String _FeatName_sofaID     = "sofaID";   // string
+  public final static String _FeatName_mimeType   = "mimeType"; // string
+  public final static String _FeatName_sofaArray  = "sofaArray"; // TOP 
+  public final static String _FeatName_sofaString = "sofaString"; // string
+  public final static String _FeatName_sofaURI    = "sofaURI";    // string
 
 	public final static int typeIndexID = JCasRegistry.register(Sofa.class);