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

Marshall Schor commented on UIMA-4793:
--------------------------------------

I've committed the perhaps partial fix of capturing the original 
threadcontextclassloader when an InternationalizedException is created, and 
using it when looking up the message for a given locale.  Richard - can you run 
your test?

> Unable to localize exceptions when using alternative classloader
> ----------------------------------------------------------------
>
>                 Key: UIMA-4793
>                 URL: https://issues.apache.org/jira/browse/UIMA-4793
>             Project: UIMA
>          Issue Type: Bug
>          Components: Core Java Framework
>    Affects Versions: 2.8.1SDK
>            Reporter: Richard Eckart de Castilho
>
> If a component is initialized through a resource manager with a custom 
> classloader, then it may not have access to its localized exception message 
> bundles.
> The reason is, that within the classloader chain, the CL which knows about 
> the Core UIMA framework is at a higher level than the CL used by the resource 
> manager that created the component. The component CL would have access to the 
> message bundle, but InterationalizedException uses it's own classloader (the 
> higher level one that knows about Core UIMA) to load message bundles:
> {noformat}
> // locate the resource bundle for this exception's messages
>          // turn over the classloader of the current object explicitly, so 
> that the
>          // message resolving also works for derived exception classes
>          ResourceBundle bundle = ResourceBundle.getBundle(
>                getResourceBundleName(), aLocale, this.getClass()
>                      .getClassLoader());
> {noformat}
> {noformat}
> Thread [main] (Suspended (exception MissingResourceException))        
>       owns: PrintWriter  (id=92)      
>       owns: ThrowableInformation  (id=93)     
>       owns: ConsoleAppender  (id=94)  
>       owns: RootLogger  (id=95)       
>       ResourceBundle.throwMissingResourceException(String, Locale, Throwable) 
> line: 1564      
>       ResourceBundle.getBundleImpl(String, Locale, ClassLoader, 
> ResourceBundle$Control) line: 1387    
>       ResourceBundle.getBundle(String, Locale, ClassLoader) line: 1082        
>       
> AnalysisEngineProcessException(InternationalizedException).getLocalizedMessage(Locale)
>  line: 240        
>       
> AnalysisEngineProcessException(InternationalizedException).getLocalizedMessage()
>  line: 218      
>       AnalysisEngineProcessException(Throwable).toString() line: 480  
>       String.valueOf(Object) line: 2994       
>       PrintWriter.println(Object) line: 754   
>       Throwable$WrappedPrintWriter.println(Object) line: 764  
>       
> AnalysisEngineProcessException(Throwable).printStackTrace(Throwable$PrintStreamOrWriter)
>  line: 655      
>       AnalysisEngineProcessException(Throwable).printStackTrace(PrintWriter) 
> line: 721        
>       DefaultThrowableRenderer.render(Throwable) line: 60     
>       ThrowableInformation.getThrowableStrRep() line: 87      
>       LoggingEvent.getThrowableStrRep() line: 413     
>       ConsoleAppender(WriterAppender).subAppend(LoggingEvent) line: 313       
>       ConsoleAppender(WriterAppender).append(LoggingEvent) line: 162  
>       ConsoleAppender(AppenderSkeleton).doAppend(LoggingEvent) line: 251      
>       AppenderAttachableImpl.appendLoopOnAppenders(LoggingEvent) line: 66     
>       Logger(Category).callAppenders(LoggingEvent) line: 206  
>       Logger(Category).forcedLog(String, Priority, Object, Throwable) line: 
> 391       
>       Logger(Category).log(String, Priority, Object, Throwable) line: 856     
>       Log4jLogger_impl.log(Level, String, Throwable) line: 272        
>       PrimitiveAnalysisEngine_impl.callAnalysisComponentProcess(CAS) line: 
> 417        
>       PrimitiveAnalysisEngine_impl.processAndOutputNewCASes(CAS) line: 308    
>       PrimitiveAnalysisEngine_impl(AnalysisEngineImplBase).process(CAS) line: 
> 269     
>       PrimitiveAnalysisEngine_impl(AnalysisEngineImplBase).process(JCas) 
> line: 284    
>       AnalysisEngine$process.call(Object, Object) line: not available 
> ...
> {noformat}
> The IMHO best way would be if UIMA would at try here to use the thread's 
> context classloader - and maybe that UIMA actually sets the thread context 
> classloader to the resource manager CL while running components... in my 
> case, I already do that outside UIMA atm, so searching the thread CL would be 
> sufficient for me atm.
> See also: https://issues.apache.org/jira/browse/UIMA-3692



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to