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 2018/01/03 14:00:57 UTC

svn commit: r1819975 - in /uima/uv3/uimaj-v3/trunk/uimaj-core/src: main/java/org/apache/uima/cas/impl/CASImpl.java main/java/org/apache/uima/cas/impl/XCASDeserializer.java test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java

Author: schor
Date: Wed Jan  3 14:00:57 2018
New Revision: 1819975

URL: http://svn.apache.org/viewvc?rev=1819975&view=rev
Log:
[UIMA-5662] support for v2 low level cas access mode for XCAS. Add check for invalid fsId in this mode (i.e., duplicate). Add test cases.

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/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.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=1819975&r1=1819974&r2=1819975&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 Wed Jan  3 14:00:57 2018
@@ -5597,7 +5597,7 @@ public class CASImpl extends AbstractCas
   
   void maybeHoldOntoFS(FeatureStructureImplC fs) {
     if (svd.isId2Fs) {
-      svd.id2fs.putUnconditionally((TOP)fs);
+      svd.id2fs.put((TOP)fs);  // does an assert - prev id should not be there
     }
   }
   

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=1819975&r1=1819974&r2=1819975&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 Wed Jan  3 14:00:57 2018
@@ -24,6 +24,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Supplier;
 
 import org.apache.uima.UIMARuntimeException;
 import org.apache.uima.UimaContext;
@@ -43,6 +44,7 @@ import org.apache.uima.jcas.cas.CommonPr
 import org.apache.uima.jcas.cas.FSArray;
 import org.apache.uima.jcas.cas.Sofa;
 import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.util.AutoCloseableNoException;
 import org.apache.uima.util.impl.Constants;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
@@ -192,6 +194,11 @@ public class XCASDeserializer {
 
     // working with initial view
     private int nextIndex;
+    
+    private TOP highestIdFs = null;
+
+    /** the fsId read from the _id attribute */
+    private int fsId;
 
     private XCASDeserializerHandler(CASImpl aCAS, OutOfTypeSystemData ootsData) {
       super();
@@ -297,6 +304,9 @@ public class XCASDeserializer {
 
     // Create a new FS.
     private void readFS(String qualifiedName, Attributes attrs) throws SAXParseException {
+      // get the FeatureStructure id
+      fsId = Integer.parseInt(attrs.getValue(XCASSerializer.ID_ATTR_NAME));
+      
       if (qualifiedName.equals("uima.cas.SofA")) {
         qualifiedName = "uima.cas.Sofa";  // fix for XCAS written with pre-public version of Sofas
       }
@@ -348,7 +358,7 @@ public class XCASDeserializer {
         final int extSofaNum = Integer.parseInt(sofaNum);
         
         // get the sofa's FeatureStructure id
-        final int sofaExtId = Integer.parseInt(attrs.getValue(XCASSerializer.ID_ATTR_NAME));
+//        final int sofaExtId = Integer.parseInt(attrs.getValue(XCASSerializer.ID_ATTR_NAME));
         
 
         // create some maps to handle v1 format XCAS ...
@@ -405,20 +415,20 @@ public class XCASDeserializer {
         // Now update the mapping from annotation int to ref values
         if (this.sofaRefMap.size() == extSofaNum) {
           // Sofa received in sofaNum order, add new one
-          this.sofaRefMap.add(sofaExtId);
+          this.sofaRefMap.add(fsId);
         } else if (this.sofaRefMap.size() > extSofaNum) {
           // new Sofa has lower sofaNum than last one
-          this.sofaRefMap.set(extSofaNum, sofaExtId);
+          this.sofaRefMap.set(extSofaNum, fsId);
         } else {
           // new Sofa has skipped ahead more than 1
           this.sofaRefMap.setSize(extSofaNum + 1);
-          this.sofaRefMap.set(extSofaNum, sofaExtId);
+          this.sofaRefMap.set(extSofaNum, fsId);
         }
 
         // get the sofa's mimeType
         String sofaMimeType = attrs.getValue(CAS.FEATURE_BASE_NAME_SOFAMIME);
-
-        fs = cas.createSofa(this.indexMap.get(extSofaNum), sofaID, sofaMimeType);
+        String finalSofaId = sofaID;
+        fs = maybeCreateWithV2Id(fsId, () -> cas.createSofa(this.indexMap.get(extSofaNum), finalSofaId, sofaMimeType));        
       } else {  // not a Sofa
         if (type.isAnnotationBaseType()) {
           
@@ -441,17 +451,18 @@ public class XCASDeserializer {
             casView = cas.getView((Sofa) (fsTree.get(Integer.parseInt(extSofaRefString)).fs));
           }
           if (type.getCode() == TypeSystemConstants.docTypeCode) {
-            fs = casView.getDocumentAnnotation();
+            fs = maybeCreateWithV2Id(fsId, () -> casView.getDocumentAnnotation());
+//            fs = casView.getDocumentAnnotation();
             cas.removeFromCorruptableIndexAnyView(fs, cas.getAddbackSingle());
           } else {
-            fs = casView.createFS(type);
+            fs = maybeCreateWithV2Id(fsId, () -> casView.createFS(type));
             if (currentFs instanceof UimaSerializable) {
               UimaSerializable ufs = (UimaSerializable) currentFs;
               uimaSerializableFixups.add(() -> ufs._init_from_cas_data());
             }
           }
         } else {  // not an annotation base
-          fs = cas.createFS(type);
+          fs = maybeCreateWithV2Id(fsId, () -> cas.createFS(type));
           if (currentFs instanceof UimaSerializable) {
             UimaSerializable ufs = (UimaSerializable) currentFs;
             uimaSerializableFixups.add(() -> ufs._init_from_cas_data());
@@ -579,7 +590,9 @@ public class XCASDeserializer {
           throw createException(XCASParsingException.ILLEGAL_ARRAY_ATTR, attrName);
         }
       }
-      TOP fs = cas.createArray(type, size);
+      final int finalSize = size;
+      TOP fs = maybeCreateWithV2Id(fsId, () -> cas.createArray(type, finalSize));
+//      TOP fs = cas.createArray(type, size);
       
       FSInfo fsInfo = new FSInfo(fs, indexRep);
       if (id >= 0) {
@@ -749,7 +762,8 @@ public class XCASDeserializer {
         }
         case DOC_TEXT_STATE: {
           // Assume old style CAS with one text Sofa
-          Sofa newSofa = cas.createInitialSofa("text");
+          Sofa newSofa = (Sofa) maybeCreateWithV2Id(1, () -> cas.createInitialSofa("text"));
+//          Sofa newSofa = cas.createInitialSofa("text");
           CASImpl initialView = cas.getInitialView();
           initialView.registerView(newSofa);
           // Set the document text without creating a documentAnnotation
@@ -1170,6 +1184,25 @@ public class XCASDeserializer {
                 "_dash_");
       }
     }
+    
+    TOP maybeCreateWithV2Id(int id, Supplier<TOP> create) {
+      if (cas.is_ll_enableV2IdRefs()) {
+        cas.set_reuseId(id);
+        try {
+          TOP fs = create.get();
+          if (highestIdFs == null) {
+            highestIdFs = fs;
+          } else if (highestIdFs._id < fs._id) {
+            highestIdFs = fs;  // for setting up getNextId at end
+          } 
+          return fs;
+        } finally {           
+          cas.set_reuseId(0); // in case of error throw
+        }
+      } else {
+        return create.get();          
+      }
+    }
   }
 
   final private TypeSystemImpl ts;
@@ -1303,6 +1336,14 @@ public class XCASDeserializer {
     }
     xmlReader.setContentHandler(handler);
     xmlReader.parse(new InputSource(aStream));
+    
+    CASImpl casImpl = ((CASImpl)aCAS.getLowLevelCAS());
+    if (casImpl.is_ll_enableV2IdRefs()) {
+      TOP highest_fs = ((XCASDeserializerHandler)handler).highestIdFs;
+      
+      casImpl.setLastUsedFsId(highest_fs._id);
+      casImpl.setLastFsV2Size(highest_fs._getTypeImpl().getFsSpaceReq(highest_fs));
+    }
   }
 
 }

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java?rev=1819975&r1=1819974&r2=1819975&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java Wed Jan  3 14:00:57 2018
@@ -45,6 +45,7 @@ import org.apache.uima.resource.metadata
 import org.apache.uima.resource.metadata.impl.TypePriorities_impl;
 import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
 import org.apache.uima.test.junit_extension.JUnitExtension;
+import org.apache.uima.util.AutoCloseableNoException;
 import org.apache.uima.util.CasCreationUtils;
 import org.apache.uima.util.XMLInputSource;
 import org.apache.uima.util.XMLSerializer;
@@ -126,6 +127,13 @@ public class XCASDeserializerTest extend
     doTestDeserializeAndReserialize(false);
     doTestDeserializeAndReserialize(true);
   }
+  
+  public void testDeserializeAndReserializeV2Ids() throws Exception {
+    try (AutoCloseableNoException a = LowLevelCAS.ll_defaultV2IdRefs()) {
+      doTestDeserializeAndReserialize(false);
+      doTestDeserializeAndReserialize(true);      
+    }
+  }
 
   private void doTestDeserializeAndReserialize(boolean useJCas) throws Exception {
     // deserialize a complex CAS
@@ -224,6 +232,9 @@ public class XCASDeserializerTest extend
 //      System.out.println("debug");
 //    }
     assertEquals(cas.getAnnotationIndex().size(), cas2.getAnnotationIndex().size());
+    CasCompare cc = new CasCompare((CASImpl)cas, (CASImpl)cas2);
+    cc.compareIds(((CASImpl)cas).is_ll_enableV2IdRefs());
+    cc.compareCASes();
     // CasComparer.assertEquals(cas,cas2);
   }