You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2023/01/11 15:02:37 UTC

[uima-uimaj] 01/01: Issue #275: Improved error message made it even more misleading

This is an automated email from the ASF dual-hosted git repository.

rec pushed a commit to branch bugfix/275-Improved-error-message-made-it-even-more-misleading
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit 0a595133f43fe85ce518481e6418e5b5cf01e452
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Wed Jan 11 16:02:29 2023 +0100

    Issue #275: Improved error message made it even more misleading
    
    - Added tests for the different error messages
    - Found out that the recently introduced error message makes no sense and removed it
    - Improved wording of a few additional error messages
---
 .../org/apache/uima/cas/CASRuntimeException.java   |  6 --
 .../org/apache/uima/cas/impl/TypeSystemImpl.java   | 34 ++++----
 .../apache/uima/UIMAException_Messages.properties  |  7 +-
 .../apache/uima/cas/impl/TypeSystemImplTest.java   | 99 ++++++++++++++++++++++
 .../java/org/apache/uima/jcas/test/JCasTest.java   | 28 ------
 5 files changed, 118 insertions(+), 56 deletions(-)

diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java b/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
index 47e4282f9..0668d61d3 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/CASRuntimeException.java
@@ -127,12 +127,6 @@ public class CASRuntimeException extends UIMARuntimeException {
    */
   public static final String JCAS_TYPE_NOT_IN_CAS = "JCAS_TYPE_NOT_IN_CAS";
 
-  /**
-   * JCas type "{0}" defined in CAS type system and used in Java code, but was not registered in
-   * JCasRegistry.
-   */
-  public static final String JCAS_TYPE_NOT_IN_CAS_REGISTRY = "JCAS_TYPE_NOT_IN_CAS_REGISTRY";
-
   /**
    * CAS type system type "{0}" defines field "{1}" with range "{2}", but JCas class has range
    * "{3}".
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java
index 2c31e9b5d..aa9fe7ebf 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeSystemImpl.java
@@ -2725,21 +2725,22 @@ public class TypeSystemImpl implements TypeSystem, TypeSystemMgr, LowLevelTypeSy
    * For a given JCasRegistry index, that doesn't have a corresponding UIMA type, throw an
    * appropriate exception
    * 
-   * @param i
-   *          - the index in the JCasRegistry
-   */
-  private void throwMissingUIMAtype(int typeindex) {
-    Class<? extends TOP> cls = JCasRegistry.getClassForIndex(typeindex);
-    if (cls != null) {
-      String className = cls.getName();
-      System.err.format(
-              "Missing UIMA type, JCas Class name: %s, index: %d, jcasRegisteredTypes size: %d%n",
-              className, typeindex, jcasRegisteredTypes.size());
-      dumpTypeSystem();
-      throw new CASRuntimeException(CASRuntimeException.JCAS_TYPE_NOT_IN_CAS_REGISTRY, className);
-    } else {
+   * @param typeIndex
+   *          the index in the JCasRegistry
+   */
+  private void throwMissingUIMAtype(int typeIndex) {
+    Class<? extends TOP> cls = JCasRegistry.getClassForIndex(typeIndex);
+    if (cls == null) {
       throw new CASRuntimeException(CASRuntimeException.JCAS_UNKNOWN_TYPE_NOT_IN_CAS);
     }
+
+    String className = cls.getName();
+    UIMAFramework.getLogger().error(
+            "Missing UIMA type, JCas Class name: {}, index: {}, jcasRegisteredTypes size: {}",
+            className, typeIndex, jcasRegisteredTypes.size());
+    dumpTypeSystem();
+
+    throw new CASRuntimeException(CASRuntimeException.JCAS_TYPE_NOT_IN_CAS, className);
   }
 
   // for debugging
@@ -2758,7 +2759,7 @@ public class TypeSystemImpl implements TypeSystem, TypeSystemMgr, LowLevelTypeSy
         }
       }
     }
-    System.err.println(sb);
+    UIMAFramework.getLogger().error(sb::toString);
 
     /** debug dump all types **/
     sb.setLength(0);
@@ -2775,7 +2776,7 @@ public class TypeSystemImpl implements TypeSystem, TypeSystemMgr, LowLevelTypeSy
         sb.append('\n');
       }
     }
-    System.err.println(sb);
+    UIMAFramework.getLogger().error(sb::toString);
   }
 
   // public FSClassRegistry getFSClassRegistry() {
@@ -2792,9 +2793,6 @@ public class TypeSystemImpl implements TypeSystem, TypeSystemMgr, LowLevelTypeSy
    *          the UIMA type
    */
   void setJCasRegisteredType(int typeIndexID, TypeImpl ti) {
-    // if (typeIndexID == 23) {
-    // System.out.format("debug typeIndexId = 23, typeImpl = %s%n", ti.getName());
-    // }
     synchronized (jcasRegisteredTypes) {
       TypeImpl existing = Misc.getWithExpand(jcasRegisteredTypes, typeIndexID);
       if (existing != null) {
diff --git a/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties b/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
index 71df49ed0..c079e6643 100644
--- a/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
+++ b/uimaj-core/src/main/resources/org/apache/uima/UIMAException_Messages.properties
@@ -555,13 +555,12 @@ CHILD_INDEX_OOB = Error accessing child node in tree, index out of range.
 JCAS_ARRAY_NOT_SUPPORTED = User-defined JCas classes for built-in Arrays not supported, class: {0}
 JCAS_CAS_NOT_V3 = JCas Class "{0}", loaded from "{1}", is missing required constructor; likely cause is wrong version (UIMA version 3 or later JCas required).
 JCAS_MISSING_FIELD_ACCESSOR = JCas Class "{0}" is missing required field accessor, or access not permitted, for field "{1}" during {2} operation.
-JCAS_CAS_MISMATCH = CAS type system doesn''t match JCas Type definition for type "{0}".
+JCAS_CAS_MISMATCH = CAS type system does not match JCas Type definition for type "{0}".
 JCAS_TYPE_NOT_IN_CAS = JCas type "{0}" used in Java code,  but was not declared in the XML type descriptor.
-JCAS_TYPE_NOT_IN_CAS_REGISTRY = JCas type "{0}" defined in CAS type system and used in Java code, but was not registered in JCasRegistry.
 JCAS_UNKNOWN_TYPE_NOT_IN_CAS = Unknown JCas type used in Java code but was not declared or imported in the XML descriptor for this component.
-JCAS_FIELD_MISSING_IN_TYPE_SYSTEM = JCAS class "{0}" defines a UIMA field "{1}" but the UIMA type doesn''t define that field.
+JCAS_FIELD_MISSING_IN_TYPE_SYSTEM = JCAS class "{0}" defines a UIMA field "{1}" but the UIMA type does not define that field.
 JCAS_FIELD_ADJ_OFFSET_CHANGED = In JCAS class "{0}", UIMA field "{1}" was set up when this class was previously loaded and initialized, to have an adjusted offset of "{2}" but now the feature has a different adjusted offset of "{3}"; this may be due to something else other than type system commit actions loading and initializing the JCas class, or to having a different non-compatible type system for this class, trying to use a common JCas cover class, which is not supported. 
-JCAS_CAS_MISMATCH_SUPERTYPE = JCas Class's supertypes for "{0}", "{1}" and the corresponding UIMA Supertypes for "{2}", "{3}" don't have an intersection.
+JCAS_CAS_MISMATCH_SUPERTYPE = JCas class supertypes for "{0}", "{1}" and the corresponding UIMA supertypes for "{2}", "{3}" do not have an intersection.
 JCAS_MISMATCH_SUPERTYPE = The JCas class: "{0}" has supertypes: "{1}" which do not match the UIMA type "{2}"''s supertypes "{3}".
 JCAS_TYPE_RANGE_MISMATCH = CAS type system type "{0}" defines field "{1}" with range "{2}", but JCas getter method is returning "{3}" which is not a subtype of the declared range.
 JCAS_GET_NTH_ON_EMPTY_LIST = JCas getNthElement method called via invalid object - an empty list: {0}.
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/TypeSystemImplTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/TypeSystemImplTest.java
new file mode 100644
index 000000000..471379fd7
--- /dev/null
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/TypeSystemImplTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.cas.impl;
+
+import static org.apache.uima.UIMAFramework.getResourceSpecifierFactory;
+import static org.apache.uima.util.CasCreationUtils.createCas;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.assertj.core.api.Assertions.assertThatNoException;
+import static org.assertj.core.api.InstanceOfAssertFactories.throwable;
+
+import java.util.Iterator;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.CASRuntimeException;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.JCasRegistry;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import x.y.z.Sentence;
+
+public class TypeSystemImplTest {
+  private TypeSystemDescription tsd;
+
+  @BeforeEach
+  public void setup() {
+    tsd = getResourceSpecifierFactory().createTypeSystemDescription();
+  }
+
+  @Test
+  public void thatTypeUsedInJavaAndDeclaredInTypeSytemDoesNotThrowException() throws Exception {
+    tsd.addType(Sentence._TypeName, "", CAS.TYPE_NAME_ANNOTATION);
+
+    JCas localJcas = createCas(tsd, null, null).getJCas();
+    localJcas.setDocumentText("This is a test.");
+
+    assertThatNoException() //
+            .isThrownBy(() -> localJcas.getCasType(Sentence.type));
+  }
+
+  @Test
+  public void thatTypeUsedInJavaButNotDeclaredInTypeSytemThrowsException() throws Exception {
+    JCas localJcas = createCas(tsd, null, null).getJCas();
+    localJcas.setDocumentText("This is a test.");
+
+    assertThat(JCasRegistry.getClassForIndex(Sentence.type)).isSameAs(Sentence.class);
+
+    assertThatExceptionOfType(CASRuntimeException.class) //
+            .isThrownBy(() -> localJcas.getCasType(Sentence.type)) //
+            .asInstanceOf(throwable(CASRuntimeException.class)) //
+            .extracting(CASRuntimeException::getMessageKey) //
+            .isEqualTo(CASRuntimeException.JCAS_TYPE_NOT_IN_CAS);
+
+    sanityCheckForCasConsistencyUIMA_738(localJcas);
+  }
+
+  @Test
+  public void thatTypeNotInTypeSystemAndWithoutJCasClassThrowsException() throws Exception {
+    JCas localJcas = createCas(tsd, null, null).getJCas();
+    localJcas.setDocumentText("This is a test.");
+
+    assertThatExceptionOfType(CASRuntimeException.class) //
+            .isThrownBy(() -> localJcas.getCasType(Integer.MAX_VALUE)) //
+            .asInstanceOf(throwable(CASRuntimeException.class)) //
+            .extracting(CASRuntimeException::getMessageKey) //
+            .isEqualTo(CASRuntimeException.JCAS_UNKNOWN_TYPE_NOT_IN_CAS);
+
+    sanityCheckForCasConsistencyUIMA_738(localJcas);
+  }
+
+  private void sanityCheckForCasConsistencyUIMA_738(JCas localJcas) {
+    // check that this does not leave JCAS in an inconsistent state
+    // (a check for bug UIMA-738)
+    Iterator<Annotation> iter = localJcas.getAnnotationIndex().iterator();
+    assertThat(iter).hasNext();
+    assertThat(iter.next()) //
+            .extracting(Annotation::getCoveredText) //
+            .isEqualTo("This is a test.");
+  }
+}
diff --git a/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java b/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java
index 359c51c58..78bec197e 100644
--- a/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/jcas/test/JCasTest.java
@@ -19,10 +19,6 @@
 
 package org.apache.uima.jcas.test;
 
-import static org.apache.uima.util.CasCreationUtils.createCas;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.InstanceOfAssertFactories.throwable;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -71,7 +67,6 @@ import org.apache.uima.jcas.cas.StringArray;
 import org.apache.uima.jcas.cas.StringList;
 import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.tcas.Annotation;
-import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
 import org.apache.uima.test.junit_extension.JUnitExtension;
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.AfterEach;
@@ -81,7 +76,6 @@ import org.junit.jupiter.api.Test;
 import aa.ConcreteType;
 import aa.Root;
 import x.y.z.EndOfSentence;
-import x.y.z.Sentence;
 import x.y.z.Token;
 
 /**
@@ -996,28 +990,6 @@ public class JCasTest {
     for (double v : doa) {
       Assertions.assertThat(expectedDoa[i++]).isEqualTo(v);
     }
-
-  }
-
-  @Test
-  public void testUndefinedType() throws Exception {
-    // create jcas with no type system
-    JCas localJcas = createCas(new TypeSystemDescription_impl(), null, null).getJCas();
-    localJcas.setDocumentText("This is a test.");
-
-    assertThatExceptionOfType(CASRuntimeException.class) //
-            .isThrownBy(() -> localJcas.getCasType(Sentence.type)) //
-            .asInstanceOf(throwable(CASRuntimeException.class)) //
-            .extracting(CASRuntimeException::getMessageKey) //
-            .isEqualTo(CASRuntimeException.JCAS_TYPE_NOT_IN_CAS_REGISTRY);
-
-    // check that this does not leave JCAS in an inconsistent state
-    // (a check for bug UIMA-738)
-    Iterator<Annotation> iter = localJcas.getAnnotationIndex().iterator();
-    assertThat(iter).hasNext();
-    assertThat(iter.next()) //
-            .extracting(Annotation::getCoveredText) //
-            .isEqualTo("This is a test.");
   }
 
   /*