1 /* 2 * Copyright (c) 2005, 2007, 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.Enumeration; 44 import java.util.HashMap; 45 import java.util.Map; 46 import java.util.ResourceBundle; 47 import java.util.Set; 48 import sun.util.ResourceBundleEnumeration; 49 50 /** 51 * Subclass of <code>ResourceBundle</code> which mimics 52 * <code>ListResourceBundle</code>, but provides more hooks 53 * for specialized subclass behavior. For general description, 54 * see {@link java.util.ListResourceBundle}. 55 * <p> 56 * This class leaves handleGetObject non-final, and 57 * adds a method createMap which allows subclasses to 58 * use specialized Map implementations. 59 */ 60 public abstract class OpenListResourceBundle extends ResourceBundle { 61 /** 62 * Sole constructor. (For invocation by subclass constructors, typically 63 * implicit.) 64 */ OpenListResourceBundle()65 protected OpenListResourceBundle() { 66 } 67 68 // Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification. handleGetObject(String key)69 public Object handleGetObject(String key) { 70 if (key == null) { 71 throw new NullPointerException(); 72 } 73 74 loadLookupTablesIfNecessary(); 75 return lookup.get(key); // this class ignores locales 76 } 77 78 /** 79 * Implementation of ResourceBundle.getKeys. 80 */ getKeys()81 public Enumeration<String> getKeys() { 82 ResourceBundle parent = this.parent; 83 return new ResourceBundleEnumeration(handleGetKeys(), 84 (parent != null) ? parent.getKeys() : null); 85 } 86 87 /** 88 * Returns a set of keys provided in this resource bundle 89 */ handleGetKeys()90 public Set<String> handleGetKeys() { 91 loadLookupTablesIfNecessary(); 92 93 return lookup.keySet(); 94 } 95 96 /** 97 * Returns the parent bundle 98 */ getParent()99 public OpenListResourceBundle getParent() { 100 return (OpenListResourceBundle)parent; 101 } 102 103 /** 104 * See ListResourceBundle class description. 105 */ getContents()106 abstract protected Object[][] getContents(); 107 108 /** 109 * Load lookup tables if they haven't been loaded already. 110 */ loadLookupTablesIfNecessary()111 void loadLookupTablesIfNecessary() { 112 if (lookup == null) { 113 loadLookup(); 114 } 115 } 116 117 /** 118 * We lazily load the lookup hashtable. This function does the 119 * loading. 120 */ loadLookup()121 private synchronized void loadLookup() { 122 if (lookup != null) 123 return; 124 125 Object[][] contents = getContents(); 126 Map temp = createMap(contents.length); 127 for (int i = 0; i < contents.length; ++i) { 128 // key must be non-null String, value must be non-null 129 String key = (String) contents[i][0]; 130 Object value = contents[i][1]; 131 if (key == null || value == null) { 132 throw new NullPointerException(); 133 } 134 temp.put(key, value); 135 } 136 lookup = temp; 137 } 138 139 /** 140 * Lets subclasses provide specialized Map implementations. 141 * Default uses HashMap. 142 */ createMap(int size)143 protected Map createMap(int size) { 144 return new HashMap(size); 145 } 146 147 private Map lookup = null; 148 } 149