001 package net.sf.cpsolver.ifs.util;
002
003 import java.util.*;
004
005 /** Data properties.
006 *
007 * @version
008 * IFS 1.1 (Iterative Forward Search)<br>
009 * Copyright (C) 2006 Tomáš Müller<br>
010 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
011 * Lazenska 391, 76314 Zlin, Czech Republic<br>
012 * <br>
013 * This library is free software; you can redistribute it and/or
014 * modify it under the terms of the GNU Lesser General Public
015 * License as published by the Free Software Foundation; either
016 * version 2.1 of the License, or (at your option) any later version.
017 * <br><br>
018 * This library is distributed in the hope that it will be useful,
019 * but WITHOUT ANY WARRANTY; without even the implied warranty of
020 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
021 * Lesser General Public License for more details.
022 * <br><br>
023 * You should have received a copy of the GNU Lesser General Public
024 * License along with this library; if not, write to the Free Software
025 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
026 */
027 public class DataProperties extends Properties {
028 private boolean iSaveDefaults = false;
029 private static final long serialVersionUID = 1L;
030
031 /** Constructor */
032 public DataProperties() {
033 super();
034 }
035
036 /** Constructor
037 * @param defaults default properties
038 */
039 public DataProperties(Properties defaults) {
040 super(defaults);
041 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
042 }
043
044 /** Constructor
045 * @param properties default properties
046 */
047 public DataProperties(Dictionary properties) {
048 super();
049 for (Enumeration e=properties.keys();e.hasMoreElements();) {
050 Object key = e.nextElement();
051 Object value = properties.get(key);
052 setProperty(key.toString(), value.toString());
053 }
054 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
055 }
056
057 /** Returns string property
058 * @param key key
059 * @param defaultValue default value to be returned when such property is not present
060 */
061 public String getProperty(String key, String defaultValue) {
062 if (!iSaveDefaults || containsPropery(key)) return super.getProperty(key, defaultValue);
063 if (defaultValue!=null) setProperty(key, defaultValue);
064 return defaultValue;
065 }
066
067 /** Sets string property
068 * @param key key
069 * @param value value
070 */
071 public Object setProperty(String key, String value) {
072 if (value==null) {
073 Object ret = getProperty(key);
074 remove(key);
075 return ret;
076 }
077 Object ret = super.setProperty(key, value);
078 if ("General.SaveDefaultProperties".equals(key))
079 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
080 return ret;
081 }
082
083 /** Returns int property
084 * @param key key
085 * @param defaultValue default value to be returned when such property is not present
086 */
087 public int getPropertyInt(String key, int defaultValue) {
088 try {
089 if (containsPropery(key)) return Integer.parseInt(getProperty(key));
090 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
091 return defaultValue;
092 } catch (NumberFormatException nfe) {
093 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
094 return defaultValue;
095 }
096 }
097
098 /** Returns long property
099 * @param key key
100 * @param defaultValue default value to be returned when such property is not present
101 */
102 public long getPropertyLong(String key, long defaultValue) {
103 try {
104 if (containsPropery(key)) return Long.parseLong(getProperty(key));
105 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
106 return defaultValue;
107 } catch (NumberFormatException nfe) {
108 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
109 return defaultValue;
110 }
111 }
112
113 /** Returns int property
114 * @param key key
115 * @param defaultValue default value to be returned when such property is not present
116 */
117 public Integer getPropertyInteger(String key, Integer defaultValue) {
118 try {
119 if (containsPropery(key)) return Integer.valueOf(getProperty(key));
120 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
121 return defaultValue;
122 } catch (NumberFormatException nfe) {
123 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
124 return defaultValue;
125 }
126 }
127
128 /** Returns long property
129 * @param key key
130 * @param defaultValue default value to be returned when such property is not present
131 */
132 public Long getPropertyLong(String key, Long defaultValue) {
133 try {
134 if (containsPropery(key)) return Long.valueOf(getProperty(key));
135 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
136 return defaultValue;
137 } catch (NumberFormatException nfe) {
138 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
139 return defaultValue;
140 }
141 }
142
143 /** Returns true if there is such property
144 * @param key key
145 */
146 public boolean containsPropery(String key) {
147 return getProperty(key)!=null;
148 }
149
150 /** Returns boolean property
151 * @param key key
152 * @param defaultValue default value to be returned when such property is not present
153 */
154 public boolean getPropertyBoolean(String key, boolean defaultValue) {
155 try {
156 if (containsPropery(key)) return (getProperty(key).equalsIgnoreCase("on") || getProperty(key).equalsIgnoreCase("true"));
157 if (iSaveDefaults) setProperty(key, (defaultValue?"true":"false"));
158 return defaultValue;
159 } catch (Exception nfe) {
160 if (iSaveDefaults) setProperty(key, (defaultValue?"true":"false"));
161 return defaultValue;
162 }
163 }
164
165 /** Returns double property
166 * @param key key
167 * @param defaultValue default value to be returned when such property is not present
168 */
169 public double getPropertyDouble(String key, double defaultValue) {
170 try {
171 if (containsPropery(key)) return Double.parseDouble(getProperty(key));
172 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
173 return defaultValue;
174 } catch (NumberFormatException nfe) {
175 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
176 return defaultValue;
177 }
178 }
179
180 /** Returns float property
181 * @param key key
182 * @param defaultValue default value to be returned when such property is not present
183 */
184 public float getPropertyFloat(String key, float defaultValue) {
185 try {
186 if (containsPropery(key)) return Float.parseFloat(getProperty(key));
187 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
188 return defaultValue;
189 } catch (NumberFormatException nfe) {
190 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
191 return defaultValue;
192 }
193 }
194
195 /** Returns boolean property
196 * @param key key
197 * @param defaultValue default value to be returned when such property is not present
198 */
199 public Boolean getPropertyBoolean(String key, Boolean defaultValue) {
200 try {
201 if (containsPropery(key)) return new Boolean(getProperty(key).equalsIgnoreCase("on") || getProperty(key).equalsIgnoreCase("true"));
202 if (iSaveDefaults && defaultValue!=null) setProperty(key, (defaultValue.booleanValue()?"true":"false"));
203 return defaultValue;
204 } catch (Exception nfe) {
205 if (iSaveDefaults && defaultValue!=null) setProperty(key, (defaultValue.booleanValue()?"true":"false"));
206 return defaultValue;
207 }
208 }
209
210 /** Returns double property
211 * @param key key
212 * @param defaultValue default value to be returned when such property is not present
213 */
214 public Double getPropertyDouble(String key, Double defaultValue) {
215 try {
216 if (containsPropery(key)) return Double.valueOf(getProperty(key));
217 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
218 return defaultValue;
219 } catch (NumberFormatException nfe) {
220 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
221 return defaultValue;
222 }
223 }
224
225 /** Returns float property
226 * @param key key
227 * @param defaultValue default value to be returned when such property is not present
228 */
229 public Float getPropertyFloat(String key, Float defaultValue) {
230 try {
231 if (containsPropery(key)) return Float.valueOf(getProperty(key));
232 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
233 return defaultValue;
234 } catch (NumberFormatException nfe) {
235 if (iSaveDefaults && defaultValue!=null) setProperty(key, String.valueOf(defaultValue));
236 return defaultValue;
237 }
238 }
239
240 public void setProperty(String key, Object[] value) {
241 StringBuffer sb = new StringBuffer();
242 for (int i=0;i<value.length;i++) {
243 if (i>0) sb.append(",");
244 sb.append(value[i]==null?"null":value[i].toString());
245 }
246 setProperty(key, sb.toString());
247 }
248
249 public Long[] getPropertyLongArry(String key, Long[] defaultValue) {
250 try {
251 if (containsPropery(key)) {
252 StringTokenizer stk = new StringTokenizer(getProperty(key),",");
253 Long ret[] = new Long[stk.countTokens()];
254 for (int i=0; stk.hasMoreTokens(); i++) {
255 String t = stk.nextToken();
256 ret[i] = ("null".equals(t)?null:Long.valueOf(t));
257 }
258 return ret;
259 }
260 if (iSaveDefaults && defaultValue!=null) setProperty(key, defaultValue);
261 return defaultValue;
262 } catch (NumberFormatException nfe) {
263 if (iSaveDefaults && defaultValue!=null) setProperty(key, defaultValue);
264 return defaultValue;
265 }
266 }
267
268 public Integer[] getPropertyIntegerArry(String key, Integer[] defaultValue) {
269 try {
270 if (containsPropery(key)) {
271 StringTokenizer stk = new StringTokenizer(getProperty(key),",");
272 Integer ret[] = new Integer[stk.countTokens()];
273 for (int i=0; stk.hasMoreTokens(); i++) {
274 String t = stk.nextToken();
275 ret[i] = ("null".equals(t)?null:Integer.valueOf(t));
276 }
277 return ret;
278 }
279 if (iSaveDefaults && defaultValue!=null) setProperty(key, defaultValue);
280 return defaultValue;
281 } catch (NumberFormatException nfe) {
282 if (iSaveDefaults && defaultValue!=null) setProperty(key, defaultValue);
283 return defaultValue;
284 }
285 }
286
287 /** Returns properties as dictionary.
288 */
289 public Dictionary toDict() {
290 Hashtable ret = new Hashtable();
291 for (Enumeration e=propertyNames();e.hasMoreElements();) {
292 String key = (String)e.nextElement();
293 String prop = getProperty(key);
294 if (key!=null && prop!=null) ret.put(key,prop);
295 }
296 return ret;
297 }
298
299 private void expand(String key) {
300 String value = getProperty(key);
301 if (value==null) return;
302 int done = -1, idx = -1;
303 while ((idx=value.indexOf('%', done+1))>=0) {
304 int idx2 = value.indexOf('%', idx+1);
305 if (idx2<0) return;
306 String subString = value.substring(idx+1,idx2);
307 if (containsPropery(subString))
308 value = value.substring(0,idx)+getProperty(subString)+value.substring(idx2+1);
309 else
310 done=idx;
311 }
312 setProperty(key,value);
313 }
314
315 public void expand() {
316 for (Enumeration e=keys();e.hasMoreElements();) {
317 expand((String)e.nextElement());
318 }
319 }
320
321 /** Loads properties from an input stream*/
322 public void load(java.io.InputStream inputStream) throws java.io.IOException {
323 super.load(inputStream);
324 expand();
325 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
326 }
327 }