CalendarDataUtility.java revision 12745:f068a4ffddd2
1/*
2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.util.locale.provider;
27
28import static java.util.Calendar.*;
29import java.util.Locale;
30import java.util.Map;
31import java.util.spi.CalendarDataProvider;
32import java.util.spi.CalendarNameProvider;
33
34/**
35 * {@code CalendarDataUtility} is a utility class for calling the
36 * {@link CalendarDataProvider} methods.
37 *
38 * @author Masayoshi Okutsu
39 * @author Naoto Sato
40 */
41public class CalendarDataUtility {
42    public static final String FIRST_DAY_OF_WEEK = "firstDayOfWeek";
43    public static final String MINIMAL_DAYS_IN_FIRST_WEEK = "minimalDaysInFirstWeek";
44
45    // No instantiation
46    private CalendarDataUtility() {
47    }
48
49    public static int retrieveFirstDayOfWeek(Locale locale) {
50        LocaleServiceProviderPool pool =
51                LocaleServiceProviderPool.getPool(CalendarDataProvider.class);
52        Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE,
53                                                locale, FIRST_DAY_OF_WEEK);
54        return (value != null && (value >= SUNDAY && value <= SATURDAY)) ? value : SUNDAY;
55    }
56
57    public static int retrieveMinimalDaysInFirstWeek(Locale locale) {
58        LocaleServiceProviderPool pool =
59                LocaleServiceProviderPool.getPool(CalendarDataProvider.class);
60        Integer value = pool.getLocalizedObject(CalendarWeekParameterGetter.INSTANCE,
61                                                locale, MINIMAL_DAYS_IN_FIRST_WEEK);
62        return (value != null && (value >= 1 && value <= 7)) ? value : 1;
63    }
64
65    public static String retrieveFieldValueName(String id, int field, int value, int style, Locale locale) {
66        LocaleServiceProviderPool pool =
67                LocaleServiceProviderPool.getPool(CalendarNameProvider.class);
68        return pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, normalizeCalendarType(id),
69                                       field, value, style, false);
70    }
71
72    public static String retrieveJavaTimeFieldValueName(String id, int field, int value, int style, Locale locale) {
73        LocaleServiceProviderPool pool =
74                LocaleServiceProviderPool.getPool(CalendarNameProvider.class);
75        String name;
76        name = pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, normalizeCalendarType(id),
77                                       field, value, style, true);
78        if (name == null) {
79            name = pool.getLocalizedObject(CalendarFieldValueNameGetter.INSTANCE, locale, normalizeCalendarType(id),
80                                           field, value, style, false);
81        }
82        return name;
83    }
84
85    public static Map<String, Integer> retrieveFieldValueNames(String id, int field, int style, Locale locale) {
86        LocaleServiceProviderPool pool =
87            LocaleServiceProviderPool.getPool(CalendarNameProvider.class);
88        return pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale,
89                                       normalizeCalendarType(id), field, style, false);
90    }
91
92    public static Map<String, Integer> retrieveJavaTimeFieldValueNames(String id, int field, int style, Locale locale) {
93        LocaleServiceProviderPool pool =
94            LocaleServiceProviderPool.getPool(CalendarNameProvider.class);
95        Map<String, Integer> map;
96        map = pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale,
97                                       normalizeCalendarType(id), field, style, true);
98        if (map == null) {
99            map = pool.getLocalizedObject(CalendarFieldValueNamesMapGetter.INSTANCE, locale,
100                                           normalizeCalendarType(id), field, style, false);
101        }
102        return map;
103    }
104
105    static String normalizeCalendarType(String requestID) {
106        String type;
107        if (requestID.equals("gregorian") || requestID.equals("iso8601")) {
108            type = "gregory";
109        } else if (requestID.startsWith("islamic")) {
110            type = "islamic";
111        } else {
112            type = requestID;
113        }
114        return type;
115    }
116
117    /**
118     * Obtains a localized field value string from a CalendarDataProvider
119     * implementation.
120     */
121    private static class CalendarFieldValueNameGetter
122        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarNameProvider,
123                                                                   String> {
124        private static final CalendarFieldValueNameGetter INSTANCE =
125            new CalendarFieldValueNameGetter();
126
127        @Override
128        public String getObject(CalendarNameProvider calendarNameProvider,
129                                Locale locale,
130                                String requestID, // calendarType
131                                Object... params) {
132            assert params.length == 4;
133            int field = (int) params[0];
134            int value = (int) params[1];
135            int style = (int) params[2];
136            boolean javatime = (boolean) params[3];
137
138            // If javatime is true, resources from CLDR have precedence over JRE
139            // native resources.
140            if (javatime && calendarNameProvider instanceof CalendarNameProviderImpl) {
141                String name;
142                name = ((CalendarNameProviderImpl)calendarNameProvider)
143                        .getJavaTimeDisplayName(requestID, field, value, style, locale);
144                return name;
145            }
146            return calendarNameProvider.getDisplayName(requestID, field, value, style, locale);
147        }
148    }
149
150    /**
151     * Obtains a localized field-value pairs from a CalendarDataProvider
152     * implementation.
153     */
154    private static class CalendarFieldValueNamesMapGetter
155        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarNameProvider,
156                                                                   Map<String, Integer>> {
157        private static final CalendarFieldValueNamesMapGetter INSTANCE =
158            new CalendarFieldValueNamesMapGetter();
159
160        @Override
161        public Map<String, Integer> getObject(CalendarNameProvider calendarNameProvider,
162                                              Locale locale,
163                                              String requestID, // calendarType
164                                              Object... params) {
165            assert params.length == 3;
166            int field = (int) params[0];
167            int style = (int) params[1];
168            boolean javatime = (boolean) params[2];
169
170            // If javatime is true, resources from CLDR have precedence over JRE
171            // native resources.
172            if (javatime && calendarNameProvider instanceof CalendarNameProviderImpl) {
173                Map<String, Integer> map;
174                map = ((CalendarNameProviderImpl)calendarNameProvider)
175                        .getJavaTimeDisplayNames(requestID, field, style, locale);
176                return map;
177            }
178            return calendarNameProvider.getDisplayNames(requestID, field, style, locale);
179        }
180    }
181
182     private static class CalendarWeekParameterGetter
183        implements LocaleServiceProviderPool.LocalizedObjectGetter<CalendarDataProvider,
184                                                                   Integer> {
185        private static final CalendarWeekParameterGetter INSTANCE =
186            new CalendarWeekParameterGetter();
187
188        @Override
189        public Integer getObject(CalendarDataProvider calendarDataProvider,
190                                 Locale locale,
191                                 String requestID,    // resource key
192                                 Object... params) {
193            assert params.length == 0;
194            int value;
195            switch (requestID) {
196            case FIRST_DAY_OF_WEEK:
197                value = calendarDataProvider.getFirstDayOfWeek(locale);
198                break;
199            case MINIMAL_DAYS_IN_FIRST_WEEK:
200                value = calendarDataProvider.getMinimalDaysInFirstWeek(locale);
201                break;
202            default:
203                throw new InternalError("invalid requestID: " + requestID);
204            }
205            return (value != 0) ? value : null;
206        }
207    }
208}
209