Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java
38918 views
/*1* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package sun.util.locale.provider;2627import static java.util.Calendar.*;28import java.util.Locale;29import java.util.Map;30import java.util.spi.CalendarDataProvider;31import java.util.spi.CalendarNameProvider;3233/**34* {@code CalendarDataUtility} is a utility class for calling the35* {@link CalendarDataProvider} methods.36*37* @author Masayoshi Okutsu38* @author Naoto Sato39*/40public class CalendarDataUtility {41public final static String FIRST_DAY_OF_WEEK = "firstDayOfWeek";42public final static String MINIMAL_DAYS_IN_FIRST_WEEK = "minimalDaysInFirstWeek";4344// No instantiation45private CalendarDataUtility() {46}4748public static int retrieveFirstDayOfWeek(Locale locale) {49LocaleServiceProviderPool pool =50LocaleServiceProviderPool.getPool(CalendarDataProvider.class);51Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE,52locale, FIRST_DAY_OF_WEEK);53return (value != null && (value >= SUNDAY && value <= SATURDAY)) ? value : SUNDAY;54}5556public static int retrieveMinimalDaysInFirstWeek(Locale locale) {57LocaleServiceProviderPool pool =58LocaleServiceProviderPool.getPool(CalendarDataProvider.class);59Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE,60locale, MINIMAL_DAYS_IN_FIRST_WEEK);61return (value != null && (value >= 1 && value <= 7)) ? value : 1;62}6364public static String retrieveFieldValueName(String id, int field, int value, int style, Locale locale) {65LocaleServiceProviderPool pool =66LocaleServiceProviderPool.getPool(CalendarNameProvider.class);67return pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, normalizeCalendarType(id),68field, value, style, false);69}7071public static String retrieveJavaTimeFieldValueName(String id, int field, int value, int style, Locale locale) {72LocaleServiceProviderPool pool =73LocaleServiceProviderPool.getPool(CalendarNameProvider.class);74String name;75name = pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, normalizeCalendarType(id),76field, value, style, true);77if (name == null) {78name = pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, normalizeCalendarType(id),79field, value, style, false);80}81return name;82}8384public static Map<String, Integer> retrieveFieldValueNames(String id, int field, int style, Locale locale) {85LocaleServiceProviderPool pool =86LocaleServiceProviderPool.getPool(CalendarNameProvider.class);87return pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale,88normalizeCalendarType(id), field, style, false);89}9091public static Map<String, Integer> retrieveJavaTimeFieldValueNames(String id, int field, int style, Locale locale) {92LocaleServiceProviderPool pool =93LocaleServiceProviderPool.getPool(CalendarNameProvider.class);94Map<String, Integer> map;95map = pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale,96normalizeCalendarType(id), field, style, true);97if (map == null) {98map = pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale,99normalizeCalendarType(id), field, style, false);100}101return map;102}103104static String normalizeCalendarType(String requestID) {105String type;106if (requestID.equals("gregorian") || requestID.equals("iso8601")) {107type = "gregory";108} else if (requestID.startsWith("islamic")) {109type = "islamic";110} else {111type = requestID;112}113return type;114}115116/**117* Obtains a localized field value string from a CalendarDataProvider118* implementation.119*/120private static class CalendarFieldValueNameGetter121implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarNameProvider,122String> {123private static final CalendarFieldValueNameGetter INSTANCE =124new CalendarFieldValueNameGetter();125126@Override127public String getObject(CalendarNameProvider calendarNameProvider,128Locale locale,129String requestID, // calendarType130Object... params) {131assert params.length == 4;132int field = (int) params[0];133int value = (int) params[1];134int style = (int) params[2];135boolean javatime = (boolean) params[3];136137// If javatime is true, resources from CLDR have precedence over JRE138// native resources.139if (javatime && calendarNameProvider instanceof CalendarNameProviderImpl) {140String name;141name = ((CalendarNameProviderImpl)calendarNameProvider)142.getJavaTimeDisplayName(requestID, field, value, style, locale);143return name;144}145return calendarNameProvider.getDisplayName(requestID, field, value, style, locale);146}147}148149/**150* Obtains a localized field-value pairs from a CalendarDataProvider151* implementation.152*/153private static class CalendarFieldValueNamesMapGetter154implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarNameProvider,155Map<String, Integer>> {156private static final CalendarFieldValueNamesMapGetter INSTANCE =157new CalendarFieldValueNamesMapGetter();158159@Override160public Map<String, Integer> getObject(CalendarNameProvider calendarNameProvider,161Locale locale,162String requestID, // calendarType163Object... params) {164assert params.length == 3;165int field = (int) params[0];166int style = (int) params[1];167boolean javatime = (boolean) params[2];168169// If javatime is true, resources from CLDR have precedence over JRE170// native resources.171if (javatime && calendarNameProvider instanceof CalendarNameProviderImpl) {172Map<String, Integer> map;173map = ((CalendarNameProviderImpl)calendarNameProvider)174.getJavaTimeDisplayNames(requestID, field, style, locale);175return map;176}177return calendarNameProvider.getDisplayNames(requestID, field, style, locale);178}179}180181private static class CalendarWeekParameterGetter182implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarDataProvider,183Integer> {184private static final CalendarWeekParameterGetter INSTANCE =185new CalendarWeekParameterGetter();186187@Override188public Integer getObject(CalendarDataProvider calendarDataProvider,189Locale locale,190String requestID, // resource key191Object... params) {192assert params.length == 0;193int value;194switch (requestID) {195case FIRST_DAY_OF_WEEK:196value = calendarDataProvider.getFirstDayOfWeek(locale);197break;198case MINIMAL_DAYS_IN_FIRST_WEEK:199value = calendarDataProvider.getMinimalDaysInFirstWeek(locale);200break;201default:202throw new InternalError("invalid requestID: " + requestID);203}204return (value != 0) ? value : null;205}206}207}208209210