<i18n dev> ResourceBundleProvider(s) design

Mandy Chung mandy.chung at oracle.com
Mon Aug 8 19:55:53 UTC 2016


Hi Peter,

Sorry for the delay in reply.  Still catching up on mails from vacation.

> On Aug 4, 2016, at 3:26 AM, Peter Levart <peter.levart at gmail.com> wrote:
> 
> 
> On 08/04/2016 11:21 AM, Peter Levart wrote:
>> If the providing module declares the service type, then the consuming module will have an explicit dependency on the providing module, which also defeats the purpose of service provider's implicit coupling.
> 
> I take this back. The service type is resolved at runtime by the ResourceBundle code using the consumer module's class loader and then ResourceBundleProvider interface is used to invoke its method.

Exactly.

> But I still think that the "baseName" parameter to this method is superfluous.
> 

A resource bundle provider may provide different bundles, i.e. different base names and so it can implement multiple service interfaces.

> I also see now that using resource bundle service providers is necessary if one wants to provide different modules for different languages covering a set of bundles - each language in its own module. Normally, for "java.class" format bundles, this would require per-language classes to be split among multiple modules and this is not possible as split packages are prohibited. With ResourceBundleProvider approach one can defined a ResourceBundleProvider service type in say "main language" module together with a default implementation and then various language implementations each in its own module with own package(s). For example:
> 
> module consumer {
>    uses my.BundleProvider;
> }
> // containing:
> package consumer;
> public class Main {
>    public static void main(String ... args) {
>        ResourceBundle.getBundle("my.Bundle", Locale.getDefault());
>    }
> }
> 
> 
> module my.bundle {
>    exports my;
>    provides my.BundleProvider with my.bundle.Bundle.Provider;
> }
> // containing:
> package my;
> public interface BundleProvider extends java.util.spi.ResourceBundleProvider {}
> 
> 
> module my.bundle.en {
>    requires my.bundle;
>    provides my.BundleProvider with my.bundle.en.Bundle.Provider;
> }
> 
> 
> module my.bundle.de {
>    requires my.bundle;
>    provides my.BundleProvider with my.bundle.de.Bundle.Provider;
> }
> 
> 
> etc…

jdk/test/java/util/ResourceBundles/modules have a few examples.

Perhaps we should improve the javadoc of ResourceBundleProvider and code example to make this clearer?

Mandy



More information about the i18n-dev mailing list