Now there is a way to set default-values for non-existing properties
[mir.git] / source / mir / config / MirPropertiesConfiguration.java
1 /*
2  * Copyright (C) 2001, 2002  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with the com.oreilly.servlet library, any library
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24  * the above that use the same license as the above), and distribute linked
25  * combinations including the two.  You must obey the GNU General Public
26  * License in all respects for all of the code used other than the above
27  * mentioned libraries.  If you modify this file, you may extend this exception
28  * to your version of the file, but you are not obligated to do so.  If you do
29  * not wish to do so, delete this exception statement from your version.
30  */
31 package mir.config;
32
33 import multex.Exc;
34 import multex.Failure;
35
36 import org.apache.commons.configuration.PropertiesConfiguration;
37
38 import java.io.File;
39 import java.io.FileNotFoundException;
40 import java.io.IOException;
41
42 import java.util.HashMap;
43 import java.util.Iterator;
44 import java.util.Map;
45
46 import javax.servlet.ServletContext;
47
48
49 /**
50  * @author idefix
51  */
52 public class MirPropertiesConfiguration extends PropertiesConfiguration {
53   private static MirPropertiesConfiguration instance;
54   private static ServletContext context;
55   private static String contextPath;
56
57   //if one of these properties is not present a new 
58   //property is added with its default value;
59   private  static NeededProperty[] neededWithValue =
60   {
61         new NeededProperty("Producer.DocRoot",""),
62                 new NeededProperty("Producer.ImageRoot",""),
63                 new NeededProperty("Producer.Image.Path",""),
64                 new NeededProperty("Producer.Media.Path",""),
65                 new NeededProperty("Producer.RealMedia.Path",""),
66                 new NeededProperty("Producer.Image.IconPath","")
67   };
68
69   /**
70    * Constructor for MirPropertiesConfiguration.
71    */
72   private MirPropertiesConfiguration(ServletContext ctx, String ctxPath)
73     throws IOException {
74     super(ctx.getRealPath("/WEB-INF/etc/") + "/config.properties",
75       ctx.getRealPath("/WEB-INF/") + "/default.properties");
76     addProperty("Home", ctx.getRealPath("/WEB-INF/") + "/");
77     checkMissing();
78   }
79
80   public static synchronized MirPropertiesConfiguration instance()
81     throws PropertiesConfigExc {
82     if (instance == null) {
83       if (context == null) {
84         throw new MirPropertiesConfiguration.PropertiesConfigExc(
85           "Context was not set");
86       }
87
88       try {
89         instance = new MirPropertiesConfiguration(context, contextPath);
90       } catch (IOException e) {
91         e.printStackTrace();
92       }
93     }
94
95     return instance;
96   }
97
98   /**
99    * Sets the context.
100    * @param context The context to set
101    */
102   public static void setContext(ServletContext context) {
103     MirPropertiesConfiguration.context = context;
104   }
105
106   /**
107    * Returns the context.
108    * @return ServletContext
109    */
110   public static ServletContext getContext() {
111     return context;
112   }
113
114         /**
115          * Returns all properties in a Map
116          * @return Map
117          */
118   public Map allSettings() {
119     Iterator iterator = this.getKeys();
120     Map returnMap = new HashMap();
121
122     while (iterator.hasNext()) {
123       String key = (String) iterator.next();
124       Object o = this.getString(key);
125
126       if (o == null) {
127         o = new Object();
128       }
129
130       returnMap.put(key, o);
131     }
132
133     return returnMap;
134   }
135
136
137   /**
138    * Returns a String-property concatenated with the home-dir of the
139    * installation
140    * @param key
141    * @return String
142    */
143   public String getStringWithHome(String key) {
144     String returnString = getString(key);
145
146     if (returnString == null) {
147       returnString = new String();
148     }
149
150     return getString("Home") + returnString;
151   }
152
153   /**
154    * Checks if one property is missing and adds a default value
155    */
156   private void checkMissing() {
157                 for (int i = 0; i < neededWithValue.length; i++) {
158                         if (super.getProperty(neededWithValue[i].getKey()) == null) {
159                                 addProperty(neededWithValue[i].getKey(), neededWithValue[i].getValue());
160                         }
161                 }
162   }
163
164   public File getFile(String key) throws FileNotFoundException {
165     String path = getStringWithHome(key);
166     File returnFile = new File(path);
167
168     if (returnFile.exists()) {
169       return returnFile;
170     } else {
171       throw new FileNotFoundException();
172     }
173   }
174
175   /**
176    * @see org.apache.commons.configuration.Configuration#getString(java.lang.String)
177    */
178   public String getString(String key) {
179     if (super.getString(key) == null) {
180       return new String();
181     }
182
183     return super.getString(key);
184   }
185
186   /**
187    * @see org.apache.commons.configuration.Configuration#getString(java.lang.String)
188    */
189   public Object getProperty(String key) {
190     if (super.getProperty(key) == null) {
191       return new String();
192     }
193
194     return super.getProperty(key);
195   }
196
197   /**
198    * @author idefix
199    */
200   public static class PropertiesConfigExc extends Exc {
201     /**
202      * Constructor for PropertiesConfigExc.
203      * @param arg0
204      */
205     public PropertiesConfigExc(String msg) {
206       super(msg);
207     }
208   }
209
210   /**
211    * @author idefix
212    */
213   public static class PropertiesConfigFailure extends Failure {
214     /**
215      * Constructor for PropertiesConfigExc.
216      * @param arg0
217      */
218     public PropertiesConfigFailure(String msg, Throwable cause) {
219       super(msg, cause);
220     }
221     
222   }
223   
224         /**
225          * A Class for properties to be checked
226          * @author idefix
227          */
228         private static class NeededProperty {
229                 private String _key;
230                 private String _value;
231         
232                 public NeededProperty(String key, String value) {
233                         _key = key;
234                         _value = value;
235                 }
236                 
237                 public String getKey() {
238                         return _key;
239                 }
240                 
241                 public String getValue() {
242                         return _value;
243                 }
244         }
245 }