sorry forget these two Exceptions
[mir.git] / source / mir / config / ConfigChecker.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
32 package  mir.config;\r
33 \r
34 import java.util.HashMap;
35 import java.util.Iterator;
36 import java.util.Map;
37 import java.util.Vector;
38
39 import mir.config.exceptions.ConfigFailure;
40 \r
41 public class ConfigChecker {\r
42   public final static int STRING = 0;\r
43   public final static int INTEGER = 1;\r
44   public final static int BOOLEAN = 2;\r
45   public final static int DOUBLE = 3;\r
46   public final static int PATH = 4;\r
47 //  public final static int ABSOLUTEPATH = 5;\r
48 //  public final static int ABSOLUTEURL = 6;\r
49 \r
50   private Node rootNode;\r
51 \r
52   public Node getRootNode() {\r
53     return rootNode;\r
54   }\r
55 \r
56   public ConfigChecker() {\r
57     super();\r
58 \r
59     rootNode = new Node();\r
60   }\r
61 \r
62   public void check(ConfigNode aNode) throws ConfigFailure {\r
63     getRootNode().check(aNode);\r
64   }\r
65 \r
66   public class Node {\r
67 \r
68     private Map subNodes;\r
69     private Vector constraints;\r
70 \r
71     public Node() {\r
72       subNodes = new HashMap();\r
73       constraints = new Vector();\r
74     }\r
75 \r
76     public Node getSubNode(String aName) {\r
77       Node subNode = (Node) subNodes.get(aName);\r
78 \r
79       if (subNode==null) {\r
80         subNode = new Node();\r
81         subNodes.put(aName, subNode);\r
82       }\r
83 \r
84       return subNode;\r
85     }\r
86 \r
87     public void addExistenceConstraint(String aPropertyName) {\r
88       constraints.add(new ExistenceConstraint(aPropertyName));\r
89     }\r
90 \r
91     public void addTypeConstraint(String aPropertyName, int aType) {\r
92       constraints.add(new TypeConstraint(aPropertyName, aType));\r
93     }\r
94 \r
95     public void addExistenceAndTypeConstraint(String aPropertyName, int aType) {\r
96       addExistenceConstraint(aPropertyName);\r
97       addTypeConstraint(aPropertyName, aType);\r
98     }\r
99 \r
100     public void check(ConfigNode aNode) throws ConfigFailure {\r
101       Iterator iterator;\r
102 \r
103       iterator=constraints.iterator();\r
104       while (iterator.hasNext()) {\r
105         ((Constraint) iterator.next()).check(aNode);\r
106       }\r
107 \r
108       iterator=subNodes.keySet().iterator();\r
109       while (iterator.hasNext()) {\r
110         Map.Entry entry = (Map.Entry) iterator.next();\r
111         ((Node) entry.getValue()).check(aNode.getSubNode((String) entry.getKey()));\r
112       }\r
113 \r
114     }\r
115 \r
116     private class Constraint {\r
117       protected String propertyName;\r
118 \r
119       Constraint(String aPropertyName) {\r
120         propertyName=aPropertyName;\r
121       }\r
122 \r
123       public void check(ConfigNode aNode) throws ConfigFailure {\r
124       };\r
125     }\r
126 \r
127     private class ExistenceConstraint extends Constraint {\r
128       ExistenceConstraint(String aPropertyName) {\r
129         super(aPropertyName);\r
130       }\r
131 \r
132       public void check(ConfigNode aNode) throws ConfigFailure {\r
133         aNode.getRequiredStringProperty(propertyName);\r
134       };\r
135     }\r
136 \r
137     private class TypeConstraint extends Constraint {\r
138       private int type;\r
139 \r
140       TypeConstraint(String aPropertyName, int aType) {\r
141         super(aPropertyName);\r
142 \r
143         type=aType;\r
144       }\r
145 \r
146       public void check(ConfigNode aNode) throws ConfigFailure {\r
147         switch(type) {\r
148           case INTEGER:\r
149             aNode.getOptionalIntegerProperty(propertyName, new Integer(0));\r
150             break;\r
151           case STRING:\r
152             aNode.getOptionalStringProperty(propertyName, "");\r
153             break;\r
154           case DOUBLE:\r
155             aNode.getOptionalDoubleProperty(propertyName, new Double(0.0));\r
156             break;\r
157           case BOOLEAN:\r
158             aNode.getOptionalBooleanProperty(propertyName, Boolean.FALSE);\r
159             break;\r
160           default:\r
161             throw new ConfigFailure("Invalid value for type in type constraint: "+new Integer(type).toString());\r
162         }\r
163       }\r
164     }\r
165   }\r
166 }\r