src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java
Print this page
*** 23,37 ****
* questions.
*/
package sun.util.locale.provider;
import java.util.Locale;
! import java.util.ResourceBundle;
import java.util.Set;
import java.util.TimeZone;
import java.util.spi.TimeZoneNameProvider;
/**
* Concrete implementation of the
* {@link java.util.spi.TimeZoneNameProvider TimeZoneNameProvider} class
* for the JRE LocaleProviderAdapter.
--- 23,40 ----
* questions.
*/
package sun.util.locale.provider;
+ import java.util.LinkedHashSet;
import java.util.Locale;
! import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.spi.TimeZoneNameProvider;
+ import sun.util.calendar.ZoneInfo;
+ import sun.util.resources.TimeZoneNamesBundle;
/**
* Concrete implementation of the
* {@link java.util.spi.TimeZoneNameProvider TimeZoneNameProvider} class
* for the JRE LocaleProviderAdapter.
*** 94,116 ****
* is null
* @see java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale)
*/
@Override
public String getDisplayName(String id, boolean daylight, int style, Locale locale) {
! if (id == null || locale == null) {
! throw new NullPointerException();
! }
!
! LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
! ResourceBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
! if (rb.containsKey(id)) {
! String[] names = rb.getStringArray(id);
int index = daylight ? 3 : 1;
if (style == TimeZone.SHORT) {
index++;
}
return names[index];
}
return null;
}
}
--- 97,165 ----
* is null
* @see java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale)
*/
@Override
public String getDisplayName(String id, boolean daylight, int style, Locale locale) {
! String[] names = getDisplayNameArray(id, 5, locale);
! if (names != null) {
int index = daylight ? 3 : 1;
if (style == TimeZone.SHORT) {
index++;
}
return names[index];
}
+ return null;
+ }
+ @Override
+ public String getGenericDisplayName(String id, int style, Locale locale) {
+ String[] names = getDisplayNameArray(id, 7, locale);
+ if (names != null && names.length >= 7) {
+ return names[(style == TimeZone.LONG) ? 5 : 6];
+ }
return null;
}
+
+ private String[] getDisplayNameArray(String id, int n, Locale locale) {
+ if (id == null || locale == null) {
+ throw new NullPointerException();
+ }
+ LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
+ TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
+ return rb.containsKey(id) ? rb.getStringArray(id, n) : null;
+ }
+
+ /**
+ * Returns a String[][] as the DateFormatSymbols.getZoneStrings() value for
+ * the given locale. This method is package private.
+ *
+ * @param locale a Locale for time zone names
+ * @return an array of time zone names arrays
+ */
+ String[][] getZoneStrings(Locale locale) {
+ LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
+ TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
+ Set<String> keyset = rb.keySet();
+ // Use a LinkedHashSet to preseve the order
+ Set<String[]> value = new LinkedHashSet<>();
+ for (String key : keyset) {
+ value.add(rb.getStringArray(key));
+ }
+
+ // Add aliases data for CLDR
+ if (type == LocaleProviderAdapter.Type.CLDR) {
+ // Note: TimeZoneNamesBundle creates a String[] on each getStringArray call.
+ Map<String, String> aliases = ZoneInfo.getAliasTable();
+ for (String alias : aliases.keySet()) {
+ if (!keyset.contains(alias)) {
+ String tzid = aliases.get(alias);
+ if (keyset.contains(tzid)) {
+ String[] val = rb.getStringArray(tzid);
+ val[0] = alias;
+ value.add(val);
+ }
+ }
+ }
+ }
+ return value.toArray(new String[0][]);
+ }
}