uima-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Marshall Schor (JIRA)" <...@uima.apache.org>
Subject [jira] [Commented] (UIMA-5961) InternationalizedException getLocalizedMessage fails in pear
Date Fri, 28 Jun 2019 15:13:00 GMT

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

Marshall Schor commented on UIMA-5961:
--------------------------------------

Hi, thanks very much for the test case.  I was able to reproduce it, and found out what is
happening.  Here's the story:
 # The throw happens in the Pear. 
 # At the time of the throw, an exception object is prepared with all of the things needed
to generate the message, but the message isn't generated then.
 # The throw causes the stack to be unwound up to a catch point, which in this case, happens
to be outside the pear.
 ## During the unwinding, the class loaders, thread local contexts, uima-contexts, are unwound
back to their states before entering the pear.
 # Finally a logging call calls "toString" on the exception, which, in turn, finally causes
the message to attempt to be localized.  However, at that point the pear context isn't available,
so you get that can't-localize failure.

A temporary workaround is to localize the message in the exception before leaving the pear
context.  This only works due to an implementation detail in Java's built-in localization. 
It turns out that the bundle lookups are cached, so once found, they are not looked up again
in the classloaders, the cached value is used.

The workaround in the test is to replace:
{code:java}
    public void process(JCas jcas) throws AnalysisEngineProcessException {

        Object[] objects = new Object[] { "ARGUMENT" };
        throw new AnalysisEngineProcessException(MESSAGE_BUNDLE, "TEST_KEY", objects);
    }
{code}
 with 
{code:java}
    public void process(JCas jcas) throws AnalysisEngineProcessException {

        Object[] objects = new Object[] { "ARGUMENT" };
        try {
          throw new AnalysisEngineProcessException(MESSAGE_BUNDLE, "TEST_KEY", objects);
        } catch (AnalysisEngineProcessException e) {
          System.out.println("exception: " + e.toString());  // anything that calls
e.toString() will 
             // cause the message internationalization to occur in the pear context
          throw e;  // will now leave the pear context
        }
    }
{code}
I'm thinking about how to fix this in the framework;  I'm thinking that some early bundle
lookup triggering might be good to do, but I'm not sure if I should depend on Java's caching
of this - will need to read javadocs, etc.

> InternationalizedException getLocalizedMessage fails in pear
> ------------------------------------------------------------
>
>                 Key: UIMA-5961
>                 URL: https://issues.apache.org/jira/browse/UIMA-5961
>             Project: UIMA
>          Issue Type: Bug
>    Affects Versions: 2.10.3SDK
>            Reporter: Matthias Koch
>            Assignee: Marshall Schor
>            Priority: Major
>             Fix For: 2.10.4SDK
>
>         Attachments: UIMA-5961.diff, peartest.zip
>
>
> localized message does not work in the case of pears. The classloader stored in the internationalizedException
is wrong. The bundle cant be found in this classloader.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message