[ 
https://issues.apache.org/jira/browse/UIMA-6243?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17204174#comment-17204174
 ] 

Richard Eckart de Castilho edited comment on UIMA-6243 at 9/29/20, 5:55 PM:
----------------------------------------------------------------------------

I am again looking into this issue in the context of UIMAv3 + OSGI.

The PEAR-specific code to hand classloader switches / generators of JCas 
classes is only marginally PEAR-specific. In general, it triggers if a change 
in classloaders is detected. That also happens in an OSGI context. In fact, the 
analysis engine / JCas code thinks that it lives in a PEAR, but instead it 
lives in an OSGI bundle A while the UIMA framework lives in a bundle B.

So far so good.

A problem that seems to crop up is that (diagnosis is ongoing):
* the baseGenerators of the JCas are set within the context of bundle B - that 
bundle doesn't have access to the JCas classes located in Bundle A, so it 
creates generators which produce {{Annotation}} instances for most classes
* when an analysis engine originating from Bundle A is called and the JCas is 
switched to the new classloader, it does not install new generators because 
{{jcci.isPearOverride(cl) == false}}:
*org.apache.uima.cas.impl.FSClassRegistry.getGeneratorsForTypeAndSubtypes(TypeImpl,
 Map<String, JCasClassInfo>, boolean, ClassLoader, FsGenerator3[]):*
{noformat}
    // skip entering a generator in the result if
    //    in a pear setup, and this cl is not the cl that loaded the JCas class.
    //    See method comment getGeneratorsForClassLoader(...) in for why.
    if (!isPear || jcci.isPearOverride(cl)) {
      r[ti.getCode()] = (FsGenerator3) jcci.generator;
    }      

------

    boolean isPearOverride(ClassLoader cl) {
      return jcasClass.getClassLoader().equals(cl);
    }
{noformat}



was (Author: rec):
I am again looking into this issue in the context of UIMAv3 + OSGI.

The PEAR-specific code to hand classloader switches / generators of JCas 
classes is only marginally PEAR-specific. In general, it triggers if a change 
in classloaders is detected. That also happens in an OSGI context. In fact, the 
analysis engine / JCas code thinks that it lives in a PEAR, but instead it 
lives in an OSGI bundle A while the UIMA framework lives in a bundle B.

So far so good.

A problem that seems to crop up is that (diagnosis is ongoing):
* the baseGenerators of the JCas are set within the context of bundle B - that 
bundle doesn't have access to the JCas classes located in Bundle A, so it 
creates generators which produce {{Annotation}} instances for most classes
* when an analysis engine originating from Bundle A is called and the JCas is 
switched to the new classloader, it does not install new generators:
*org.apache.uima.cas.impl.FSClassRegistry.getGeneratorsForTypeAndSubtypes(TypeImpl,
 Map<String, JCasClassInfo>, boolean, ClassLoader, FsGenerator3[]):*
{noformat}
    // skip entering a generator in the result if
    //    in a pear setup, and this cl is not the cl that loaded the JCas class.
    //    See method comment getGeneratorsForClassLoader(...) in for why.
    if (!isPear || jcci.isPearOverride(cl)) {
      r[ti.getCode()] = (FsGenerator3) jcci.generator;
    }      

------

    boolean isPearOverride(ClassLoader cl) {
      return jcasClass.getClassLoader().equals(cl);
    }
{noformat}


> JCas returns Annotation when asked for a specific subtype
> ---------------------------------------------------------
>
>                 Key: UIMA-6243
>                 URL: https://issues.apache.org/jira/browse/UIMA-6243
>             Project: UIMA
>          Issue Type: Bug
>          Components: UIMA
>    Affects Versions: 2.10.4SDK
>            Reporter: Richard Eckart de Castilho
>            Priority: Major
>
> In a specific classloader topology, a fully initialized JCas with theoretic 
> access to the JCas wrappers of a given type will not return that type but 
> instead returns an instance of {{Annotation}}. This leads to an exception 
> like this:
> {code}
> org.apache.uima.analysis_engine.AnalysisEngineProcessException: Annotator 
> processing failed.    
>       at 
> org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentProcess(PrimitiveAnalysisEngine_impl.java:427)
>       at 
> org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.innerCall(PrimitiveAnalysisEngine_impl.java:329)
>       at 
> org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.processAndOutputNewCASes(PrimitiveAnalysisEngine_impl.java:321)
>       at 
> org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:269)
>       at 
> org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:284)
>       at 
> org.apache.uima.cas.test.JCasClassLoaderTest.thatTypeSystemCanComeFromItsOwnClassLoader(JCasClassLoaderTest.java:126)
>       ... snip ...
> Caused by: java.lang.ClassCastException: org.apache.uima.jcas.tcas.Annotation 
> cannot be cast to org.apache.uima.cas.test.Token
>       at java.util.Iterator.forEachRemaining(Iterator.java:116)
>       at 
> org.apache.uima.cas.test.JCasClassLoaderTest$FetchTheTokenAnnotator.process(JCasClassLoaderTest.java:166)
>       at 
> org.apache.uima.analysis_component.JCasAnnotator_ImplBase.process(JCasAnnotator_ImplBase.java:48)
>       at 
> org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentProcess(PrimitiveAnalysisEngine_impl.java:411)
>       ... 28 more
> {code}
> Looks like this is a UIMAv2 issue only. When running the test against the 
> UIMAv3 master (commit 0211057ad), I do not get any ClassCastException.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to