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);