/
githubmirror
/
jdk17u-dev
Обзор
Документация
Войти
/
githubmirror
/
jdk17u-dev
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/java.base/share/classes/java/util/spi/ResourceBundleProvider.java
161 строка
7 KB
Jonathan Gibbons
8255262: Remove use of legacy custom @spec tag
22 окт 2020, 22:42
22 окт 2020, 22:42
0aa3c92
Код
Авторство
О чём код?
/* * Copyright (c) 2015, 2019, 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}. * * <h2>Developing resource bundle services</h2> * * 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> * * <h2>Deploying resource bundle service providers</h2> * * 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> * * <h2><a id="obtain-resource-bundle">Obtaining resource bundles from providers</a></h2> * * 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 */ 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); }