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 26 package sun.util.locale.provider; 27 28 import static java.util.Calendar.*; 29 import java.util.Locale; 30 import java.util.Map; 31 import java.util.spi.CalendarDataProvider; 32 import 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 */ 41 public 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, true, 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, true, 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 }