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 2013/12/03 23:50:03 UTC

svn commit: r1547629 - in /uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/cas/ main/java/org/apache/uima/cas/impl/ main/resources/org/apache/uima/ test/java/org/apache/uima/cas/test/

Author: schor
Date: Tue Dec  3 22:50:03 2013
New Revision: 1547629

URL: http://svn.apache.org/r1547629
Log:
[UIMA-3429] Throw exception if setting ref to FS belonging to wrong CAS. Add test case

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
    uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java?rev=1547629&r1=1547628&r2=1547629&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java Tue Dec  3 22:50:03 2013
@@ -197,6 +197,12 @@ public class CASRuntimeException extends
   /** Deserializing compressed binary other than form 4 not supported by this method */
   public static final String DESERIALIZING_COMPRESSED_BINARY_UNSUPPORTED = "DESERIALIZING_COMPRESSED_BINARY_UNSUPPORTED";
 
+  /** Dereferencing a FeatureStructure of a CAS in a different CAS's context.
+   *  This can happen if you try to set a feature structure reference to a value of a feature structure belonging to 
+   *  an entirely different CAS.
+   */
+  public static final String DEREF_FS_OTHER_CAS = "DEREF_FS_OTHER_CAS";
+  
   
 	public CASRuntimeException() {
 		super();

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1547629&r1=1547628&r2=1547629&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Tue Dec  3 22:50:03 2013
@@ -2991,7 +2991,15 @@ public class CASImpl extends AbstractCas
     if (null == fsImpl) {
       return NULL;
     }
-    return ((FeatureStructureImpl) fsImpl).getAddress();
+    final FeatureStructureImpl fsi = (FeatureStructureImpl) fsImpl;
+    if (this != fsi.getCASImpl()) {
+      if (this.getBaseCAS() != fsi.getCASImpl().getBaseCAS()) {  
+        // https://issues.apache.org/jira/browse/UIMA-3429
+        throw new CASRuntimeException(CASRuntimeException.DEREF_FS_OTHER_CAS, 
+            new Object[] {fsi.toString(), this.toString() } );
+      }
+    }
+    return fsi.getAddress();
   }
 
   public FeatureStructure ll_getFSForRef(int fsRef) {

Modified: uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties?rev=1547629&r1=1547628&r2=1547629&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties Tue Dec  3 22:50:03 2013
@@ -562,4 +562,5 @@ DELTA_CAS_PREEXISTING_FS_DISALLOWED = "P
 INVALID_MARKER = Marker is invalid.
 MULTIPLE_CREATE_MARKER = CreateMarker called multiple times for one CAS.  This implementation only supports one call.
 DESERIALIZING_BINARY_INVALID_HEADER = While deserializing binary CAS, found invalid header.
-DESERIALIZING_COMPRESSED_BINARY_UNSUPPORTED = Using the reinit method to deserialize a binary CAS serialized with compressed serialization not supported for this case.
\ No newline at end of file
+DESERIALIZING_COMPRESSED_BINARY_UNSUPPORTED = Using the reinit method to deserialize a binary CAS serialized with compressed serialization not supported for this case.
+DEREF_FS_OTHER_CAS = Dereferencing a FeatureStructure of a CAS in a different CAS's context. This can happen if you try to set a feature structure reference to a value of a feature structure belonging to an entirely different CAS. FS = "{0}", CAS = "{1}".
\ No newline at end of file

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java?rev=1547629&r1=1547628&r2=1547629&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java Tue Dec  3 22:50:03 2013
@@ -176,6 +176,22 @@ public class FeatureStructureTest extend
 		this.descr = null;
 	}
 
+	public void testErrorDerefDifferentCAS() {
+	  CAS cas2 = CASInitializer.initCas(new CASTestSetup());
+	  Type tokenType1 = this.ts.getType(CASTestSetup.TOKEN_TYPE);
+	  Feature tokenTypeFeature = this.ts.getFeatureByFullName(CASTestSetup.TOKEN_TYPE + ":" + CASTestSetup.TOKEN_TYPE_FEAT);
+	  FeatureStructure fs1 = cas2.createFS(tokenType1);
+	  FeatureStructure fs = cas.createFS(tokenType1);
+	  boolean caught = false;
+	  try {
+   	  fs.setFeatureValue(tokenTypeFeature, fs1);
+	  } catch (Exception e) {
+	    assertTrue( e instanceof CASRuntimeException);
+	    caught = true;
+	  }
+	  assertTrue(caught);
+	}
+	
 	public void testGetType() {
 		Type tokenType1 = this.ts.getType(CASTestSetup.TOKEN_TYPE);
 		Type wordType1 = this.ts.getType(CASTestSetup.WORD_TYPE);