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