1 /* 2 * Copyright (c) 1996, 2006, 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 package java.util; 41 42 import java.io.InputStream; 43 import java.io.Reader; 44 import java.io.IOException; 45 import sun.util.ResourceBundleEnumeration; 46 47 /** 48 * <code>PropertyResourceBundle</code> is a concrete subclass of 49 * <code>ResourceBundle</code> that manages resources for a locale 50 * using a set of static strings from a property file. See 51 * {@link ResourceBundle ResourceBundle} for more information about resource 52 * bundles. 53 * 54 * <p> 55 * Unlike other types of resource bundle, you don't subclass 56 * <code>PropertyResourceBundle</code>. Instead, you supply properties 57 * files containing the resource data. <code>ResourceBundle.getBundle</code> 58 * will automatically look for the appropriate properties file and create a 59 * <code>PropertyResourceBundle</code> that refers to it. See 60 * {@link ResourceBundle#getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader) ResourceBundle.getBundle} 61 * for a complete description of the search and instantiation strategy. 62 * 63 * <p> 64 * The following <a name="sample">example</a> shows a member of a resource 65 * bundle family with the base name "MyResources". 66 * The text defines the bundle "MyResources_de", 67 * the German member of the bundle family. 68 * This member is based on <code>PropertyResourceBundle</code>, and the text 69 * therefore is the content of the file "MyResources_de.properties" 70 * (a related <a href="ListResourceBundle.html#sample">example</a> shows 71 * how you can add bundles to this family that are implemented as subclasses 72 * of <code>ListResourceBundle</code>). 73 * The keys in this example are of the form "s1" etc. The actual 74 * keys are entirely up to your choice, so long as they are the same as 75 * the keys you use in your program to retrieve the objects from the bundle. 76 * Keys are case-sensitive. 77 * <blockquote> 78 * <pre> 79 * # MessageFormat pattern 80 * s1=Die Platte \"{1}\" enthält {0}. 81 * 82 * # location of {0} in pattern 83 * s2=1 84 * 85 * # sample disk name 86 * s3=Meine Platte 87 * 88 * # first ChoiceFormat choice 89 * s4=keine Dateien 90 * 91 * # second ChoiceFormat choice 92 * s5=eine Datei 93 * 94 * # third ChoiceFormat choice 95 * s6={0,number} Dateien 96 * 97 * # sample date 98 * s7=3. März 1996 99 * </pre> 100 * </blockquote> 101 * 102 * <p> 103 * <strong>Note:</strong> PropertyResourceBundle can be constructed either 104 * from an InputStream or a Reader, which represents a property file. 105 * Constructing a PropertyResourceBundle instance from an InputStream requires 106 * that the input stream be encoded in ISO-8859-1. In that case, characters 107 * that cannot be represented in ISO-8859-1 encoding must be represented by Unicode Escapes 108 * as defined in section 3.3 of 109 * <cite>The Java™ Language Specification</cite> 110 * whereas the other constructor which takes a Reader does not have that limitation. 111 * 112 * @see ResourceBundle 113 * @see ListResourceBundle 114 * @see Properties 115 * @since JDK1.1 116 */ 117 public class PropertyResourceBundle extends ResourceBundle { 118 /** 119 * Creates a property resource bundle from an {@link java.io.InputStream 120 * InputStream}. The property file read with this constructor 121 * must be encoded in ISO-8859-1. 122 * 123 * @param stream an InputStream that represents a property file 124 * to read from. 125 * @throws IOException if an I/O error occurs 126 * @throws NullPointerException if <code>stream</code> is null 127 */ 128 public PropertyResourceBundle (InputStream stream) throws IOException { 129 Properties properties = new Properties(); 130 properties.load(stream); 131 lookup = new HashMap(properties); 132 } 133 134 /** 135 * Creates a property resource bundle from a {@link java.io.Reader 136 * Reader}. Unlike the constructor 137 * {@link #PropertyResourceBundle(java.io.InputStream) PropertyResourceBundle(InputStream)}, 138 * there is no limitation as to the encoding of the input property file. 139 * 140 * @param reader a Reader that represents a property file to 141 * read from. 142 * @throws IOException if an I/O error occurs 143 * @throws NullPointerException if <code>reader</code> is null 144 * @since 1.6 145 */ 146 public PropertyResourceBundle (Reader reader) throws IOException { 147 Properties properties = new Properties(); 148 properties.load(reader); 149 lookup = new HashMap(properties); 150 } 151 152 // Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification. 153 public Object handleGetObject(String key) { 154 if (key == null) { 155 throw new NullPointerException(); 156 } 157 return lookup.get(key); 158 } 159 160 /** 161 * Returns an <code>Enumeration</code> of the keys contained in 162 * this <code>ResourceBundle</code> and its parent bundles. 163 * 164 * @return an <code>Enumeration</code> of the keys contained in 165 * this <code>ResourceBundle</code> and its parent bundles. 166 * @see #keySet() 167 */ 168 public Enumeration<String> getKeys() { 169 ResourceBundle parent = this.parent; 170 return new ResourceBundleEnumeration(lookup.keySet(), 171 (parent != null) ? parent.getKeys() : null); 172 } 173 174 /** 175 * Returns a <code>Set</code> of the keys contained 176 * <em>only</em> in this <code>ResourceBundle</code>. 177 * 178 * @return a <code>Set</code> of the keys contained only in this 179 * <code>ResourceBundle</code> 180 * @since 1.6 181 * @see #keySet() 182 */ 183 protected Set<String> handleKeySet() { 184 return lookup.keySet(); 185 } 186 187 // ==================privates==================== 188 189 private Map<String,Object> lookup; 190 }