Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.8.1SDK
-
None
Description
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:
// 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());
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 ...
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.
Attachments
Issue Links
- relates to
-
UIMA-5085 add use of context class loader for msg localization for RuntimeExceptions
- Resolved