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    }