src/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java

Print this page
rev 5696 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o packaging changes. by Naoto Sato and Masayoshi Okutsu)

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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

@@ -21,64 +21,64 @@
  * 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 sun.util;
+package sun.util.locale.provider;
 
 import java.lang.ref.SoftReference;
 import java.util.Enumeration;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.MissingResourceException;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.spi.TimeZoneNameProvider;
 import sun.util.calendar.ZoneInfo;
-import sun.util.resources.LocaleData;
 import sun.util.resources.OpenListResourceBundle;
 
 /**
  * Utility class that deals with the localized time zone names
+ *
+ * @author Naoto Sato
  */
 public final class TimeZoneNameUtility {
 
     /**
      * cache to hold time zone resource bundles. Keyed by Locale
      */
     private static ConcurrentHashMap<Locale, SoftReference<OpenListResourceBundle>> cachedBundles =
-        new ConcurrentHashMap<Locale, SoftReference<OpenListResourceBundle>>();
+        new ConcurrentHashMap<>();
 
     /**
      * cache to hold time zone localized strings. Keyed by Locale
      */
     private static ConcurrentHashMap<Locale, SoftReference<String[][]>> cachedZoneData =
-        new ConcurrentHashMap<Locale, SoftReference<String[][]>>();
+        new ConcurrentHashMap<>();
 
     /**
      * get time zone localized strings. Enumerate all keys.
      */
-    public static final String[][] getZoneStrings(Locale locale) {
+    public static String[][] getZoneStrings(Locale locale) {
         String[][] zones;
         SoftReference<String[][]> data = cachedZoneData.get(locale);
 
         if (data == null || ((zones = data.get()) == null)) {
             zones = loadZoneStrings(locale);
-            data = new SoftReference<String[][]>(zones);
+            data = new SoftReference<>(zones);
             cachedZoneData.put(locale, data);
         }
 
         return zones;
     }
 
-    private static final String[][] loadZoneStrings(Locale locale) {
-        List<String[]> zones = new LinkedList<String[]>();
+    private static String[][] loadZoneStrings(Locale locale) {
+        List<String[]> zones = new LinkedList<>();
         OpenListResourceBundle rb = getBundle(locale);
         Enumeration<String> keys = rb.getKeys();
-        String[] names = null;
+        String[] names;
 
         while(keys.hasMoreElements()) {
             String key = keys.nextElement();
 
             names = retrieveDisplayNames(rb, key, locale);

@@ -92,47 +92,33 @@
     }
 
     /**
      * Retrieve display names for a time zone ID.
      */
-    public static final String[] retrieveDisplayNames(String id, Locale locale) {
+    public static String[] retrieveDisplayNames(String id, Locale locale) {
         OpenListResourceBundle rb = getBundle(locale);
         return retrieveDisplayNames(rb, id, locale);
     }
 
-    private static final String[] retrieveDisplayNames(OpenListResourceBundle rb,
+    private static String[] retrieveDisplayNames(OpenListResourceBundle rb,
                                                 String id, Locale locale) {
+        if (id == null || locale == null) {
+            throw new NullPointerException();
+        }
+
         LocaleServiceProviderPool pool =
             LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
-        String[] names = null;
-
-        // Check whether a provider can provide an implementation that's closer
-        // to the requested locale than what the Java runtime itself can provide.
-        if (pool.hasProviders()) {
-            names = pool.getLocalizedObject(
-                            TimeZoneNameGetter.INSTANCE,
-                            locale, rb, id);
+        return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, id);
         }
 
-        if (names == null) {
-            try {
-                names = rb.getStringArray(id);
-            } catch (MissingResourceException mre) {
-                // fall through
-            }
-        }
-
-        return names;
-    }
-
-    private static final OpenListResourceBundle getBundle(Locale locale) {
+    private static OpenListResourceBundle getBundle(Locale locale) {
         OpenListResourceBundle rb;
         SoftReference<OpenListResourceBundle> data = cachedBundles.get(locale);
 
         if (data == null || ((rb = data.get()) == null)) {
-            rb = LocaleData.getTimeZoneNames(locale);
-            data = new SoftReference<OpenListResourceBundle>(rb);
+            rb = LocaleProviderAdapter.forJRE().getLocaleData().getTimeZoneNames(locale);
+            data = new SoftReference<>(rb);
             cachedBundles.put(locale, data);
         }
 
         return rb;
     }

@@ -145,21 +131,22 @@
         implements LocaleServiceProviderPool.LocalizedObjectGetter<TimeZoneNameProvider,
                                                                    String[]>{
         private static final TimeZoneNameGetter INSTANCE =
             new TimeZoneNameGetter();
 
+        @Override
         public String[] getObject(TimeZoneNameProvider timeZoneNameProvider,
                                 Locale locale,
                                 String requestID,
                                 Object... params) {
             assert params.length == 0;
-            String[] names = null;
             String queryID = requestID;
 
-            if (queryID.equals("GMT")) {
-                names = buildZoneStrings(timeZoneNameProvider, locale, queryID);
-            } else {
+            // First, try to get names with the request ID
+            String[] names = buildZoneStrings(timeZoneNameProvider, locale, requestID);
+
+            if (names == null) {
                 Map<String, String> aliases = ZoneInfo.getAliasTable();
 
                 if (aliases != null) {
                     // Check whether this id is an alias, if so,
                     // look for the standard id.

@@ -230,6 +217,10 @@
             }
 
             return names;
         }
     }
+
+    // No instantiation
+    private TimeZoneNameUtility() {
+    }
 }