Richard Eckart de Castilho created UIMA-4793:
------------------------------------------------
Summary: 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)