Author: schor Date: Mon Dec 4 17:08:28 2017 New Revision: 1817106 URL: http://svn.apache.org/viewvc?rev=1817106&view=rev Log: [UIMA-5660] Allow extra JCas classes in chain
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java?rev=1817106&r1=1817105&r2=1817106&view=diff ============================================================================== --- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java (original) +++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java Mon Dec 4 17:08:28 2017 @@ -713,20 +713,38 @@ public abstract class FSClassRegistry { // type: X -> XS -> Annotation -> AnnotationBase -> TOP boolean isOk = false; List<Class<?>> superClasses = new ArrayList<>(); + boolean isCheckImmediateSuper = true; + Class<?> superClass = clazz.getSuperclass(); + outer: - for (TypeImpl superType : ti.getAllSuperTypes()) { - JCasClassInfo jci = type2jcci.get(superType.getName()); - if (jci == null) continue; - Class<?> superClass = clazz.getSuperclass(); - superClasses.add(superClass); - while (superClass != FeatureStructureImplC.class && superClass != Object.class) { - if (jci.jcasClass == superClass) { - isOk = true; - break outer; + for (TypeImpl uimaSuperType : ti.getAllSuperTypes()) { // iterate uimaSuperTypes + JCasClassInfo jci = type2jcci.get(uimaSuperType.getName()); + if (jci != null) { + if (isCheckImmediateSuper) { + if (jci.jcasClass != superClass) { + /** The JCas class: "{0}" has supertype: "{1}" which doesn''t match the UIMA type "{2}"''s supertype "{3}". */ + add2errors(errorSet, + new CASRuntimeException(CASRuntimeException.JCAS_MISMATCH_SUPERTYPE, + clazz.getCanonicalName(), + clazz.getSuperclass().getCanonicalName(), + ti.getName(), + ti.getSuperType().getName()), + false); // not a throwable error, just a warning + } } - superClass = superClass.getSuperclass(); + superClasses.add(superClass); - } + while (superClass != FeatureStructureImplC.class && superClass != Object.class) { + if (jci.jcasClass == superClass) { + isOk = true; + break outer; + } + superClass = superClass.getSuperclass(); + superClasses.add(superClass); + } + } + + isCheckImmediateSuper = false; } // This error only happens if the JCas type chain doesn't go thru "TOP" - so it isn't really a JCas class!