You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@uima.apache.org by "Richard Eckart de Castilho (JIRA)" <de...@uima.apache.org> on 2016/02/11 18:20:18 UTC
[jira] [Created] (UIMA-4793) Unable to localize exceptions when
using alternative classloader
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)