1 /* 2 * Copyright (c) 2005, 2011, 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, 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 }