001 package ifs.util;
002
003 import java.util.*;
004
005 /** Data properties.
006 *
007 * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
008 * @version 1.0
009 */
010 public class DataProperties extends Properties {
011 private boolean iSaveDefaults = false;
012
013 /** Constructor */
014 public DataProperties() {
015 super();
016 }
017
018 /** Constructor
019 * @param defaults default properties
020 */
021 public DataProperties(Properties defaults) {
022 super(defaults);
023 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
024 }
025
026 /** Constructor
027 * @param properties default properties
028 */
029 public DataProperties(Dictionary properties) {
030 super();
031 for (Enumeration e=properties.keys();e.hasMoreElements();) {
032 Object key = e.nextElement();
033 Object value = properties.get(key);
034 setProperty(key.toString(), value.toString());
035 }
036 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
037 }
038
039 /** Returns string property
040 * @param key key
041 * @param defaultValue default value to be returned when such property is not present
042 */
043 public String getProperty(String key, String defaultValue) {
044 if (!iSaveDefaults || containsPropery(key)) return super.getProperty(key, defaultValue);
045 if (defaultValue!=null) setProperty(key, defaultValue);
046 return defaultValue;
047 }
048
049 /** Sets string property
050 * @param key key
051 * @param value value
052 */
053 public Object setProperty(String key, String value) {
054 Object ret = super.setProperty(key, value);
055 if ("General.SaveDefaultProperties".equals(key))
056 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
057 return ret;
058 }
059
060 /** Returns int property
061 * @param key key
062 * @param defaultValue default value to be returned when such property is not present
063 */
064 public int getPropertyInt(String key, int defaultValue) {
065 try {
066 if (containsPropery(key)) return Integer.parseInt(getProperty(key));
067 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
068 return defaultValue;
069 } catch (NumberFormatException nfe) {
070 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
071 return defaultValue;
072 }
073 }
074
075 /** Returns long property
076 * @param key key
077 * @param defaultValue default value to be returned when such property is not present
078 */
079 public long getPropertyLong(String key, long defaultValue) {
080 try {
081 if (containsPropery(key)) return Long.parseLong(getProperty(key));
082 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
083 return defaultValue;
084 } catch (NumberFormatException nfe) {
085 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
086 return defaultValue;
087 }
088 }
089
090 /** Returns true if there is such property
091 * @param key key
092 */
093 public boolean containsPropery(String key) {
094 return getProperty(key)!=null;
095 }
096
097 /** Returns boolean property
098 * @param key key
099 * @param defaultValue default value to be returned when such property is not present
100 */
101 public boolean getPropertyBoolean(String key, boolean defaultValue) {
102 try {
103 if (containsPropery(key)) return getProperty(key).equalsIgnoreCase("true");
104 if (iSaveDefaults) setProperty(key, (defaultValue?"true":"false"));
105 return defaultValue;
106 } catch (Exception nfe) {
107 if (iSaveDefaults) setProperty(key, (defaultValue?"true":"false"));
108 return defaultValue;
109 }
110 }
111
112 /** Returns double property
113 * @param key key
114 * @param defaultValue default value to be returned when such property is not present
115 */
116 public double getPropertyDouble(String key, double defaultValue) {
117 try {
118 if (containsPropery(key)) return Double.parseDouble(getProperty(key));
119 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
120 return defaultValue;
121 } catch (NumberFormatException nfe) {
122 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
123 return defaultValue;
124 }
125 }
126
127 /** Returns float property
128 * @param key key
129 * @param defaultValue default value to be returned when such property is not present
130 */
131 public float getPropertyFloat(String key, float defaultValue) {
132 try {
133 if (containsPropery(key)) return Float.parseFloat(getProperty(key));
134 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
135 return defaultValue;
136 } catch (NumberFormatException nfe) {
137 if (iSaveDefaults) setProperty(key, String.valueOf(defaultValue));
138 return defaultValue;
139 }
140 }
141
142 /** Returns properties as dictionary.
143 */
144 public Dictionary toDict() {
145 Hashtable ret = new Hashtable();
146 for (Enumeration e=propertyNames();e.hasMoreElements();) {
147 String key = (String)e.nextElement();
148 String prop = getProperty(key);
149 if (key!=null && prop!=null) ret.put(key,prop);
150 }
151 return ret;
152 }
153
154 private void expand(String key) {
155 String value = getProperty(key);
156 if (value==null) return;
157 int done = -1, idx = -1;
158 while ((idx=value.indexOf('%', done+1))>=0) {
159 int idx2 = value.indexOf('%', idx+1);
160 if (idx2<0) return;
161 String subString = value.substring(idx+1,idx2);
162 if (containsPropery(subString))
163 value = value.substring(0,idx)+getProperty(subString)+value.substring(idx2+1);
164 else
165 done=idx;
166 }
167 }
168
169 /** Loads properties from an input stream*/
170 public void load(java.io.InputStream inputStream) throws java.io.IOException {
171 super.load(inputStream);
172 for (Enumeration e=keys();e.hasMoreElements();) {
173 expand((String)e.nextElement());
174 }
175 iSaveDefaults = getPropertyBoolean("General.SaveDefaultProperties", false);
176 }
177 }