001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package java.util;
019:
020: /**
021: * ListResourceBundle is the abstract superclass of classes which provide
022: * resources by implementing the <code>getContents()</code> method to return
023: * the list of resources.
024: *
025: * @see ResourceBundle
026: * @since 1.1
027: */
028: public abstract class ListResourceBundle extends ResourceBundle {
029: HashMap<String, Object> table;
030:
031: /**
032: * Constructs a new instance of this class.
033: */
034: public ListResourceBundle() {
035: super ();
036: }
037:
038: /**
039: * Answers an Object array which contains the resources of this
040: * ListResourceBundle. Each element in the array is an array of two
041: * elements, the first is the resource key and the second is the resource.
042: *
043: * @return a Object array containing the resources
044: */
045: protected abstract Object[][] getContents();
046:
047: /**
048: * Answers the names of the resources contained in this ListResourceBundle.
049: *
050: * @return an Enumeration of the resource names
051: */
052: @Override
053: public Enumeration<String> getKeys() {
054: initializeTable();
055: if (parent != null) {
056: return new Enumeration<String>() {
057: Iterator<String> local = table.keySet().iterator();
058:
059: Enumeration<String> pEnum = parent.getKeys();
060:
061: String nextElement;
062:
063: private boolean findNext() {
064: if (nextElement != null) {
065: return true;
066: }
067: while (pEnum.hasMoreElements()) {
068: String next = pEnum.nextElement();
069: if (!table.containsKey(next)) {
070: nextElement = next;
071: return true;
072: }
073: }
074: return false;
075: }
076:
077: public boolean hasMoreElements() {
078: if (local.hasNext()) {
079: return true;
080: }
081: return findNext();
082: }
083:
084: public String nextElement() {
085: if (local.hasNext()) {
086: return local.next();
087: }
088: if (findNext()) {
089: String result = nextElement;
090: nextElement = null;
091: return result;
092: }
093: // Cause an exception
094: return pEnum.nextElement();
095: }
096: };
097: } else {
098: return new Enumeration<String>() {
099: Iterator<String> it = table.keySet().iterator();
100:
101: public boolean hasMoreElements() {
102: return it.hasNext();
103: }
104:
105: public String nextElement() {
106: return it.next();
107: }
108: };
109: }
110: }
111:
112: /**
113: * Answers the named resource from this ResourceBundle, or null if the
114: * resource is not found.
115: *
116: * @param key
117: * the name of the resource
118: * @return the resource object
119: */
120: @Override
121: public final Object handleGetObject(String key) {
122: initializeTable();
123: if (key == null) {
124: throw new NullPointerException();
125: }
126: return table.get(key);
127: }
128:
129: private synchronized void initializeTable() {
130: if (table == null) {
131: Object[][] contents = getContents();
132: table = new HashMap<String, Object>(
133: contents.length / 3 * 4 + 3);
134: for (Object[] content : contents) {
135: if (content[0] == null || content[1] == null) {
136: throw new NullPointerException();
137: }
138: table.put((String) content[0], content[1]);
139: }
140: }
141: }
142: }
|