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

rec pushed a commit to branch 
bugfix/285-NPE-while-deserializing-an-XMI-in-a-PEAR-context
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit c2db1db19d26de5cba7ce073fc2e497d31ae0354
Author: Richard Eckart de Castilho <[email protected]>
AuthorDate: Fri Jan 20 15:52:02 2023 +0100

    Issue #285: NPE while deserializing an XMI in a PEAR context
    
    - If the id2base and id2tramp maps exist, only clear them, do not set them 
to null
    - Added unit test
---
 .../java/org/apache/uima/cas/impl/CASImpl.java     |  9 +++++++--
 .../uima/cas/test/FSCreatedInPearContextTest.java  | 23 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java 
b/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
index e3f57f52e..c5bb00e99 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
@@ -729,8 +729,13 @@ public class CASImpl extends AbstractCas_ImplBase
       id2fs.clear();
 
       // pear caches
-      id2tramp = null;
-      id2base = null;
+      if (id2tramp != null) {
+        id2tramp.clear();
+      }
+      if (id2base != null) {
+        id2base.clear();
+      }
+
       for (Iterator<Entry<ClassLoader, JCasHashMap>> it = 
cl2id2tramp.entrySet().iterator(); it
               .hasNext();) {
         Entry<ClassLoader, JCasHashMap> e = it.next();
diff --git 
a/uimaj-core/src/test/java/org/apache/uima/cas/test/FSCreatedInPearContextTest.java
 
b/uimaj-core/src/test/java/org/apache/uima/cas/test/FSCreatedInPearContextTest.java
index 791559006..a130d6a0d 100644
--- 
a/uimaj-core/src/test/java/org/apache/uima/cas/test/FSCreatedInPearContextTest.java
+++ 
b/uimaj-core/src/test/java/org/apache/uima/cas/test/FSCreatedInPearContextTest.java
@@ -21,6 +21,7 @@ package org.apache.uima.cas.test;
 import static org.apache.uima.UIMAFramework.getXMLParser;
 import static org.apache.uima.util.CasCreationUtils.createCas;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatNoException;
 
 import java.io.File;
 import java.io.IOException;
@@ -69,6 +70,28 @@ public class FSCreatedInPearContextTest {
             .containsExactly(token).allMatch(t -> 
t.getClass().getClassLoader() == rootCl);
   }
 
+  @Test
+  public void thatResettingCasInPearContextWorks() throws Exception, 
IOException {
+    ClassLoader rootCl = getClass().getClassLoader();
+
+    IsolatingClassloader clForToken = new IsolatingClassloader("Token", rootCl)
+            .redefining("org\\.apache\\.uima\\.cas\\.test\\.Token(_Type)?.*");
+
+    CASImpl casImpl = (CASImpl) createCas(loadTokensAndSentencesTS(), null, 
null, null);
+    casImpl.switchClassLoaderLockCasCL(new UIMAClassLoader(new URL[0], 
clForToken));
+    casImpl.setDocumentText("Test");
+
+    // The normal "reset" is blocked in PEAR mode, but e.g. the 
XmiCasDeserializerHandler calls
+    // resetNoQuestions()
+    casImpl.resetNoQuestions();
+
+    assertThatNoException().isThrownBy(() -> {
+      Type tokenType = casImpl.getTypeSystem().getType(Token.class.getName());
+      Annotation token = casImpl.createAnnotation(tokenType, 0, 1);
+      token.addToIndexes();
+    });
+  }
+
   private TypeSystemDescription loadTokensAndSentencesTS() throws 
InvalidXMLException, IOException {
     return getXMLParser().parseTypeSystemDescription(new XMLInputSource(
             new 
File("src/test/resources/CASTests/desc/TokensAndSentencesTS.xml")));

Reply via email to