From d7e10a4cfacf84b1d4f3a4440cea2d435cb08b2f Mon Sep 17 00:00:00 2001 From: Richard Eckart de Castilho Date: Mon, 15 Aug 2022 21:29:08 +0200 Subject: [PATCH] Issue #234: Using builtin annotation classes before creating a CAS can break type system management - Try fixing the case if a JCCI was created with a bad type ID because the type ID had not been set yet --- .../org/apache/uima/cas/impl/FSClassRegistry.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java index ee98243136..7db860c28a 100644 --- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java +++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSClassRegistry.java @@ -620,6 +620,20 @@ public static JCasClassInfo getOrCreateJCasClassInfo(TypeImpl ti, ClassLoader cl jcci = maybeCreateJCasClassInfo(ti, cl, type2jcci, lookup); } + // Due to initialization order, it could be that we created the JCCI before the static fields in + // the JCas class have been initialized. In particular, the jcasType typeIndexID might still + // have been uninitialized (0) when we crated the JCCI. To work fix that case, check if the + // typeIndexID has changed and if so update the JCCI + if (jcci != null && jcci.jcasType == 0) { + if (!Modifier.isAbstract(jcci.jcasClass.getModifiers())) { // skip next for abstract classes + int jcasType = Misc.getStaticIntFieldNoInherit(jcci.jcasClass, "typeIndexID"); + if (jcasType != jcci.jcasType) { + jcci = new JCasClassInfo(jcci.jcasClass, jcci.generator, jcasType); + type2jcci.put(ti.getJCasClassName(), jcci); + } + } + } + // do this setup for new type systems using previously loaded jcci, as well as // for new jccis if (jcci != null && jcci.jcasType >= 0) {