View Javadoc
1   /*
2    * Copyright (c) 2005, 2012, 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  /*
27   * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
28   * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
29   *
30   * The original version of this source code and documentation
31   * is copyrighted and owned by Taligent, Inc., a wholly-owned
32   * subsidiary of IBM. These materials are provided under terms
33   * of a License Agreement between Taligent and Sun. This technology
34   * is protected by multiple US and International patents.
35   *
36   * This notice and attribution to Taligent may not be removed.
37   * Taligent is a registered trademark of Taligent, Inc.
38   *
39   */
40  
41  package sun.util.resources;
42  
43  import java.util.Map;
44  import java.util.LinkedHashMap;
45  import java.util.LinkedHashSet;
46  import java.util.MissingResourceException;
47  import java.util.Set;
48  
49  /**
50   * Subclass of <code>ResourceBundle</code> with special
51   * functionality for time zone names. The additional functionality:
52   * <ul>
53   * <li>Preserves the order of entries in the <code>getContents</code>
54   *     array for the enumeration returned by <code>getKeys</code>.
55   * <li>Inserts the time zone ID (the key of the bundle entries) into
56   *     the string arrays returned by <code>handleGetObject</code>.
57   * <ul>
58   * All <code>TimeZoneNames</code> resource bundles must extend this
59   * class and implement the <code>getContents</code> method.
60   */
61  public abstract class TimeZoneNamesBundle extends OpenListResourceBundle {
62  
63      /**
64       * Returns a String array containing time zone names. The String array has
65       * at most size elements.
66       *
67       * @param key  the time zone ID for which names are obtained
68       * @param size the requested size of array for names
69       * @return a String array containing names
70       */
71      public String[] getStringArray(String key, int size) {
72          String[] names = handleGetObject(key, size);
73          if ((names == null || names.length != size) && parent != null) {
74              names = ((TimeZoneNamesBundle)parent).getStringArray(key, size);
75          }
76          if (names == null) {
77              throw new MissingResourceException("no time zone names", getClass().getName(), key);
78          }
79          return names;
80  
81      }
82  
83      /**
84       * Maps time zone IDs to locale-specific names.
85       * The value returned is an array of five strings:
86       * <ul>
87       * <li>The time zone ID (same as the key, not localized).
88       * <li>The long name of the time zone in standard time (localized).
89       * <li>The short name of the time zone in standard time (localized).
90       * <li>The long name of the time zone in daylight savings time (localized).
91       * <li>The short name of the time zone in daylight savings time (localized).
92       * </ul>
93       * The localized names come from the subclasses's
94       * <code>getContents</code> implementations, while the time zone
95       * ID is inserted into the returned array by this method.
96       */
97      @Override
98      public Object handleGetObject(String key) {
99          return handleGetObject(key, 5);
100     }
101 
102     private String[] handleGetObject(String key, int n) {
103         String[] contents = (String[]) super.handleGetObject(key);
104         if (contents == null) {
105             return null;
106         }
107         int clen = Math.min(n - 1, contents.length);
108         String[] tmpobj = new String[clen+1];
109         tmpobj[0] = key;
110         System.arraycopy(contents, 0, tmpobj, 1, clen);
111         return tmpobj;
112     }
113 
114     /**
115      * Use LinkedHashMap to preserve the order of bundle entries.
116      */
117     @Override
118     protected <K, V> Map<K, V> createMap(int size) {
119         return new LinkedHashMap<>(size);
120     }
121 
122     /**
123      * Use LinkedHashSet to preserve the key order.
124      * @param <E> the type of elements
125      * @return a Set
126      */
127     @Override
128     protected <E> Set<E> createSet() {
129         return new LinkedHashSet<>();
130     }
131 
132     /**
133      * Provides key/value mappings for a specific
134      * resource bundle. Each entry of the array
135      * returned must be an array with two elements:
136      * <ul>
137      * <li>The key, which must be a string.
138      * <li>The value, which must be an array of
139      *     four strings:
140      *     <ul>
141      *     <li>The long name of the time zone in standard time.
142      *     <li>The short name of the time zone in standard time.
143      *     <li>The long name of the time zone in daylight savings time.
144      *     <li>The short name of the time zone in daylight savings time.
145      *     </ul>
146      * </ul>
147      */
148     protected abstract Object[][] getContents();
149 }