/* |
|
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package java.util.spi; |
|
import java.util.Locale; |
|
import java.util.ResourceBundle; |
|
/** |
|
* {@code ResourceBundleProvider} is a service provider interface for |
|
* resource bundles. It is used by |
|
* {@link ResourceBundle#getBundle(String) ResourceBundle.getBundle} |
|
* factory methods to locate and load the service providers that are deployed as |
|
* modules via {@link java.util.ServiceLoader ServiceLoader}. |
|
* |
|
* <h3>Developing resource bundle services</h3> |
|
* |
|
* A service for a resource bundle of a given <em>{@code baseName}</em> must have |
|
* a fully-qualified class name of the form: |
|
* <blockquote> |
|
* {@code <package of baseName> + ".spi." + <simple name of baseName> + "Provider"} |
|
* </blockquote> |
|
* |
|
* The service type is in a {@code spi} subpackage as it may be packaged in |
|
* a module separate from the resource bundle providers. |
|
* For example, the service for a resource bundle named |
|
* {@code com.example.app.MyResources} must be |
|
* {@code com.example.app.spi.MyResourcesProvider}: |
|
* |
|
* <blockquote><pre> |
|
* {@code package com.example.app.spi; |
|
* public interface MyResourcesProvider extends ResourceBundleProvider { |
|
* } |
|
* }</pre></blockquote> |
|
* |
|
* <h3>Deploying resource bundle service providers</h3> |
|
* |
|
* Resource bundles can be deployed in one or more service providers |
|
* in modules. For example, a provider for a service |
|
* named "{@code com.example.app.spi.MyResourcesProvider}" |
|
* has the following implementation class: |
|
* |
|
* <blockquote><pre> |
|
* {@code import com.example.app.spi.MyResourcesProvider; |
|
* class MyResourcesProviderImpl extends AbstractResourceBundleProvider |
|
* implements MyResourcesProvider |
|
* { |
|
* public MyResourcesProviderImpl() { |
|
* super("java.properties"); |
|
* } |
|
* // this provider maps the resource bundle to per-language package |
|
* protected String toBundleName(String baseName, Locale locale) { |
|
* return "p." + locale.getLanguage() + "." + baseName; |
|
* } |
|
* |
|
* public ResourceBundle getBundle(String baseName, Locale locale) { |
|
* // this module only provides bundles in French |
|
* if (locale.equals(Locale.FRENCH)) { |
|
* return super.getBundle(baseName, locale); |
|
* } |
|
* // otherwise return null |
|
* return null; |
|
* } |
|
* }}</pre></blockquote> |
|
* |
|
* This example provides "{@code com.example.app.MyResources}" |
|
* resource bundle of the French locale. Traditionally resource bundles of |
|
* all locales are packaged in the same package as the resource bundle base name. |
|
* When deploying resource bundles in more than one modules and two modules |
|
* containing a package of the same name, <em>split package</em>, |
|
* is not supported, resource bundles in each module can be packaged in |
|
* a different package as shown in this example where this provider packages |
|
* the resource bundles in per-language package, i.e. {@code com.example.app.fr} |
|
* for French locale. |
|
* |
|
* <p> A provider can provide more than one services, each of which is a service |
|
* for a resource bundle of a different base name. |
|
* |
|
* <p>{@link AbstractResourceBundleProvider} |
|
* provides the basic implementation for {@code ResourceBundleProvider} |
|
* and a subclass can override the {@link |
|
* AbstractResourceBundleProvider#toBundleName(String, Locale) toBundleName} |
|
* method to return a provider-specific location of the resource to be loaded, |
|
* for example, per-language package. |
|
* A provider can override {@link #getBundle ResourceBundleProvider.getBundle} |
|
* method for example to only search the known supported locales or |
|
* return resource bundles in other formats such as XML. |
|
* |
|
* <p>The module declaration of this provider module specifies the following |
|
* directive: |
|
* <pre> |
|
* provides com.example.app.spi.MyResourcesProvider with com.example.impl.MyResourcesProviderImpl; |
|
* </pre> |
|
* |
|
* <h3><a id="obtain-resource-bundle">Obtaining resource bundles from providers</a></h3> |
|
* |
|
* The module declaration of the <em>consumer module</em> that calls one of the |
|
* {@code ResourceBundle.getBundle} factory methods to obtain a resource |
|
* bundle from service providers must specify the following directive: |
|
* <pre> |
|
* uses com.example.app.spi.MyResourcesProvider; |
|
* </pre> |
|
* |
|
* {@link ResourceBundle#getBundle(String, Locale) |
|
* ResourceBundle.getBundle("com.example.app.MyResource", locale)} |
|
* locates and loads the providers for {@code com.example.app.spi.MyResourcesProvider} |
|
* service and then invokes {@link #getBundle(String, Locale) |
|
* ResourceBundleProvider.getBundle("com.example.app.MyResource", locale)} to |
|
* find the resource bundle of the given base name and locale. |
|
* If the consumer module is a resource bundle service provider for |
|
* {@code com.example.app.spi.MyResourcesProvider}, {@code ResourceBundle.getBundle} |
|
* will locate resource bundles only from service providers. |
|
* Otherwise, {@code ResourceBundle.getBundle} may continue the search of |
|
* the resource bundle in other modules and class path per the specification |
|
* of the {@code ResourceBundle.getBundle} method being called. |
|
* |
|
* @see AbstractResourceBundleProvider |
|
* @see <a href="../ResourceBundle.html#resource-bundle-modules"> |
|
* Resource Bundles and Named Modules</a> |
|
* @see java.util.ServiceLoader |
|
* @since 9 |
|
* @spec JPMS |
|
*/ |
|
public interface ResourceBundleProvider { |
|
/** |
|
* Returns a {@code ResourceBundle} for the given bundle name and locale. |
|
* This method returns {@code null} if there is no {@code ResourceBundle} |
|
* found for the given parameters. |
|
* |
|
* |
|
* @param baseName |
|
* the base bundle name of the resource bundle, a fully |
|
* qualified class name |
|
* @param locale |
|
* the locale for which the resource bundle should be loaded |
|
* @return the ResourceBundle created for the given parameters, or null if no |
|
* {@code ResourceBundle} for the given parameters is found |
|
*/ |
|
public ResourceBundle getBundle(String baseName, Locale locale); |
|
} |