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