1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 22565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughesimport java.io.Reader; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PropertyResourceBundle} loads resources from an {@code InputStream}. All resources are 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Strings. The resources must be of the form {@code key=value}, one 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * resource per line (see Properties). 28f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ResourceBundle 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Properties 31f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.1 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class PropertyResourceBundle extends ResourceBundle { 34f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Properties resources; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code PropertyResourceBundle} and loads the 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * properties file from the specified {@code InputStream}. 40f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param stream 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code InputStream}. 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs during a read operation on the 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code InputStream}. 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PropertyResourceBundle(InputStream stream) throws IOException { 48565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes if (stream == null) { 4986acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("stream == null"); 50565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes } 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resources = new Properties(); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resources.load(stream); 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 55565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes /** 56565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes * Constructs a new resource bundle with properties read from {@code reader}. 57f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 58565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes * @param reader the {@code Reader} 59565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes * @throws IOException 60565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes * @since 1.6 61565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes */ 62565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes public PropertyResourceBundle(Reader reader) throws IOException { 63565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes resources = new Properties(); 64565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes resources.load(reader); 65565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes } 66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes protected Set<String> handleKeySet(){ 68565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes return resources.stringPropertyNames(); 69565a85d06ab8bc321d39f12012468cdfb65f5cfeElliott Hughes } 70f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Enumeration<String> getLocalKeys() { 73f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return (Enumeration<String>) resources.propertyNames(); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Enumeration<String> getKeys() { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (parent == null) { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getLocalKeys(); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Enumeration<String>() { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<String> local = getLocalKeys(); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration<String> pEnum = parent.getKeys(); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String nextElement; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean findNext() { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nextElement != null) { 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (pEnum.hasMoreElements()) { 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String next = pEnum.nextElement(); 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!resources.containsKey(next)) { 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextElement = next; 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasMoreElements() { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (local.hasMoreElements()) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return findNext(); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String nextElement() { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (local.hasMoreElements()) { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return local.nextElement(); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (findNext()) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String result = nextElement; 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextElement = null; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Cause an exception 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return pEnum.nextElement(); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object handleGetObject(String key) { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return resources.get(key); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 129