| PropertyMap.java |
1 /**
2 * Distribution License:
3 * JSword is free software; you can redistribute it and/or modify it under
4 * the terms of the GNU Lesser General Public License, version 2.1 or later
5 * as published by the Free Software Foundation. This program is distributed
6 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
7 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8 * See the GNU Lesser General Public License for more details.
9 *
10 * The License is available on the internet at:
11 * http://www.gnu.org/copyleft/lgpl.html
12 * or by writing to:
13 * Free Software Foundation, Inc.
14 * 59 Temple Place - Suite 330
15 * Boston, MA 02111-1307, USA
16 *
17 * © CrossWire Bible Society, 2008 - 2016
18 *
19 */
20 package org.crosswire.common.util;
21
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.io.OutputStream;
25 import java.util.Enumeration;
26 import java.util.LinkedHashMap;
27 import java.util.Properties;
28
29
30 /**
31 * A PropertyMap is a Map<String,String> sitting over top a Property file.
32 * As such it must be defined in the same way as a java.util.Properties expects.
33 *
34 * @see java.util.Properties
35 * @see gnu.lgpl.License The GNU Lesser General Public License for details.
36 * @author DM Smith
37 */
38 public class PropertyMap extends LinkedHashMap<String, String> {
39 /**
40 * Creates an empty property list with no default values.
41 */
42 public PropertyMap() {
43 this(null);
44 }
45
46 /**
47 * Creates an empty property map with the specified defaults.
48 *
49 * @param defaults the defaults.
50 */
51 public PropertyMap(PropertyMap defaults) {
52 this.defaults = defaults;
53 }
54
55 /**
56 * Searches for the property with the specified key in this property list.
57 * If the key is not found in this property list, the default property list,
58 * and its defaults, recursively, are then checked. The method returns
59 * <code>null</code> if the property is not found.
60 *
61 * @param key the lookup key.
62 * @return the value in this property list with the specified key value.
63 * @see java.util.Properties#setProperty
64 */
65 public String get(String key) {
66 String value = super.get(key);
67 return ((value == null) && (defaults != null)) ? defaults.get(key) : value;
68 }
69
70 /**
71 * Searches for the property with the specified key in this property list.
72 * If the key is not found in this property list, the default property list,
73 * and its defaults, recursively, are then checked. The method returns the
74 * default value argument if the property is not found.
75 *
76 * @param key the lookup key.
77 * @param defaultValue a default value.
78 *
79 * @return the value in this property list with the specified key value.
80 * @see java.util.Properties#setProperty
81 */
82 public String get(String key, String defaultValue) {
83 String value = get(key);
84 return value == null ? defaultValue : value;
85 }
86
87 /**
88 * Reads a property list (key and element pairs) from the input
89 * byte stream. The input stream is in a simple line-oriented
90 * format as specified in
91 * {@link java.util.Properties#load(java.io.InputStream) load(InputStream)} and is assumed to use
92 * the ISO 8859-1 character encoding; that is each byte is one Latin1
93 * character. Characters not in Latin1, and certain special characters,
94 * are represented in keys and elements using
95 * <a href="http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.3">Unicode escapes</a>.
96 * <p>
97 * The specified stream remains open after this method returns.
98 *
99 * @param inStream the input stream.
100 * @exception IOException if an error occurred when reading from the
101 * input stream.
102 * @throws IllegalArgumentException if the input stream contains a
103 * malformed Unicode escape sequence.
104 * @since 1.2
105 */
106 public void load(InputStream inStream) throws IOException {
107 Properties prop = new Properties();
108 prop.load(inStream);
109 for (Enumeration<Object> e = prop.keys(); e.hasMoreElements(); ) {
110 Object k = e.nextElement();
111 Object v = prop.get(k);
112 if (k instanceof String && v instanceof String) {
113 put((String) k, (String) v);
114 }
115 }
116 }
117
118 /**
119 * Writes this property list (key and element pairs) in this
120 * <code>PropertyMap</code> table to the output stream in a format suitable
121 * for loading into a <code>PropertyMap</code> table using the
122 * {@link #load(InputStream) load(InputStream)} method.
123 * <p>
124 * Properties from the defaults table of this <code>PropertyMap</code>
125 * table (if any) are <i>not</i> written out by this method.
126 * <p>
127 * This method outputs the comments, properties keys and values in
128 * the same format as specified in
129 * {@link java.util.Properties#store(java.io.OutputStream, java.lang.String) store(Writer)},
130 * <p>
131 * After the entries have been written, the output stream is flushed.
132 * The output stream remains open after this method returns.
133 * <p>
134 * @param out an output stream.
135 * @param comments a description of the property list.
136 * @exception IOException if writing this property list to the specified
137 * output stream throws an <tt>IOException</tt>.
138 * @exception NullPointerException if <code>out</code> is null.
139 * @since 1.2
140 */
141 public void store(OutputStream out, String comments) throws IOException {
142 Properties temp = new Properties();
143 temp.putAll(this);
144 temp.store(out, comments);
145 }
146
147 /**
148 * Default values for any keys not found in this property map.
149 */
150 private PropertyMap defaults;
151
152 /**
153 * Serialization ID
154 */
155 private static final long serialVersionUID = 2821277155924802795L;
156 }
157