RFR: 8013839: Enhance Logger API for handling of resource bundles

Daniel Fuchs daniel.fuchs at oracle.com
Thu Oct 3 14:47:52 UTC 2013


Hi Mandy,

Thanks for your comments!

On 9/26/13 10:18 PM, Mandy Chung wrote:
> Hi Daniel,
>
> This is a good solution for Logger subclasses or existing apps that rely
> on the previous stack walk search to lookup a resource bundle.I have
> some comments on the specification:
>
> Logger.setResourceBundle(ResourceBundle rb)
>     Should this method simply throw NPE if rb == null since we can't
> reset a non-null rb/rbname to null?

Excellent suggestion.

>
> Some suggestion to the javadoc:
>
>
>    * Sets the resource bundle for this logger to use for localization.
>    *
>    * @param bundle  The resource bundle that this logger shall use.
>    * @throws  IllegalArgumentException if the given bundle doesn't have a
>    *         {@linkplain ResourceBundle#getBaseBundleName base name},
>    *         or if this logger already has a resource bundle set but
>    *         the given bundle has a different base name.
>

Done.

> The getLogger(String name, String rbname) spec and the class specification
> should be updated about different ways in setting a resource bundle for
> a logger.
>
> For example in the class spec, this paragraph and text following it talks
> about resource bundle and name and also logrb method:
>
>      Each Logger may have a ResourceBundle name associated with it.
>      The named bundle will be used for localizing logging messages.
>      If a Logger does not have its own ResourceBundle name, then
>      it will inherit the ResourceBundle name from its parent,
>      recursively up the tree.
>
> Adding @see #setResourceBundle in the getLogger method would be helpful.

I have reworked the part of the class specification that talks about
ResourceBundles and ResourceBundle names.

> It'd be good to clarify the spec of getResourceBundle and
> getResourceBundleName
> methods that they return the ResourceBundle and its base name if set via
> setResourceBundle method.  Perhaps it might be good for the class spec
> to capture different ways to set the resource bundle and and have the
> methods
> to refer that specification.

I have updated the documentation of these two methods - and it
should be more clear now.

>
> The current implementation of the getLogger(String name, String rbname)
> method
> uses the caller's class loader to look up the resource bundle.  Do you mind
> taking this opportunity to update the spec to match the current
> implementation?
> This fix is a follow-up on that change.

OK - I have updated the paragraph that explains how bundle names are
mapped to ResourceBundle objects in the class description.
Since the mapping - if required - happens at logging time - I think
it's better to leave it at the class level.

> Maybe we should just use varargs (JDK-5001993) to replace the two
> logrb methods one taking a single parameter and the other taking an
> array of parameters:
>      public void logrb(Level level, String sourceClass, String
> sourceMethod,
>                        ResourceBundle bundle, String msg, Object... params)
>

Done.

> I can live with the inconsistency.
>
> ResourceBundle.getBaseBundleName - this is more a question to Naoto.
>
> The implementation note about this method may return a pathname
> but the spec states that it returns a fully qualified class name
> is a bit strange.  Can you elaborate what problem we have here?
> I am missing the context to connect how this is related to the
> older versions of JRE

I have simplified this part with Naoto's help.

The new webrev is here:
http://cr.openjdk.java.net/~dfuchs/webrev_8013839/webrev.07/

Thanks a lot for all the good feedbacks!

-- daniel

>
> thanks
> Mandy
>
>
> On 9/20/2013 5:33 AM, Daniel Fuchs wrote:
>> Hi,
>>
>> Please find below a patch for:
>>
>> 8013839: Enhance Logger API for handling of resource bundles, and
>> 4814565: (rb) add method to get basename from a ResourceBundle
>>
>> <http://cr.openjdk.java.net/~dfuchs/webrev_8013839/webrev.06/>
>>
>>    1. It adds a ResourceBundle.getBaseBundleName() method,
>>    2. It adds a Logger.setResourceBundle(ResourceBundle) method,
>>    3. It adds a series of Logger.logrb(...) that take a ResourceBundle
>>         object instead of a ResourceBundle name.
>>         The previous versions of Logger.logrb(...) that took a
>>         resource bundle name are therefore no longer needed,
>>         they offer no added value above the new methods, and
>>         are thus now deprecated.
>>
>> Logger.getLogger(name, rbname) will continue to work as before,
>>      and will also throw an exception if a RB with a different name
>>      has been set before, either through setResourceBundle or
>>      Logger.getLogger(name, rbname).
>>
>> Logger.setResourceBundle works similarly to
>>      Logger.getLogger(name, rbname) in the sense that it will not
>>      allow to replace an existing bundle, unless both have the same
>>      name. Like for Logger.getLogger(name, rbname) - it doesn't matter
>>      by which method the previous bundle has been set.
>>
>>      This is mostly for consistency of the API - if thread A has
>>      requested a logger with resource bundle name 'foo.Bundle'
>>      and thread B attempts to set the resource bundle of that
>>      logger to 'bar.Bundle' then thread B will get an IAE.
>>
>>      The resource bundle passed to Logger.setResourceBundle *must*
>>      have a base name. Note that ResourceBundle objects will have
>>      a base name by default if they have been loaded through
>>      one of the ResourceBundle.getBundle(...) methods;
>>      If ResourceBundle.getBaseBundleName() returns null an IAE
>>      will be thrown.
>>
>>      Logger.setResourceBundle requires the "control" permission.
>>
>>      When a resource bundle is set with Logger.setResourceBundle,
>>      then it's that resource bundle locale that will be used
>>      when logging (and not the default locale).
>>
>> I have written a set of unit tests which should cover all the points
>> listed above.
>>
>> best regards,
>>
>> -- daniel
>




More information about the core-libs-dev mailing list