1 package org.apache.velocity.tools.config;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.commons.digester.Digester;
23 import org.apache.commons.digester.Rule;
24 import org.apache.commons.digester.RuleSetBase;
25 import org.xml.sax.Attributes;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class XmlFactoryConfigurationRuleSet extends RuleSetBase
58 {
59 protected Class toolboxConfigurationClass = ToolboxConfiguration.class;
60 protected Class toolConfigurationClass = ToolConfiguration.class;
61 protected Class dataClass = Data.class;
62 protected Class propertyClass = Property.class;
63
64 public void setToolboxConfigurationClass(Class clazz)
65 {
66 this.toolboxConfigurationClass = clazz;
67 }
68
69 public void setToolConfigurationClass(Class clazz)
70 {
71 this.toolConfigurationClass = clazz;
72 }
73
74 public void setDataClass(Class clazz)
75 {
76 this.dataClass = clazz;
77 }
78
79 public void setPropertyClass(Class clazz)
80 {
81 this.propertyClass = clazz;
82 }
83
84
85
86
87
88
89
90
91
92
93
94
95 public void addRuleInstances(Digester digester)
96 {
97
98 digester.addObjectCreate("tools/property", propertyClass);
99 digester.addObjectCreate("tools/*/property", propertyClass);
100 digester.addObjectCreate("tools/data", dataClass);
101 digester.addObjectCreate("tools/toolbox", toolboxConfigurationClass);
102 digester.addObjectCreate("tools/toolbox/tool", toolConfigurationClass);
103
104
105 digester.addSetProperties("tools/property");
106 digester.addSetProperties("tools/*/property");
107 digester.addSetProperties("tools");
108 digester.addSetProperties("tools/data");
109 digester.addSetProperties("tools/toolbox");
110 digester.addSetProperties("tools/toolbox/tool");
111
112
113 digester.addRule("tools", new PropertyAttributeRule());
114 digester.addRule("tools/toolbox", new PropertyAttributeRule());
115 digester.addRule("tools/toolbox/tool", new PropertyAttributeRule());
116
117
118 digester.addRule("tools/data", new DataValueInBodyRule());
119 digester.addRule("tools/*/property", new DataValueInBodyRule());
120
121
122 digester.addSetNext("tools/property", "addProperty");
123 digester.addSetNext("tools/*/property", "addProperty");
124 digester.addSetNext("tools/data", "addData");
125 digester.addSetNext("tools/toolbox", "addToolbox");
126 digester.addSetNext("tools/toolbox/tool", "addTool");
127 }
128
129
130
131
132
133
134
135 public static class DataValueInBodyRule extends Rule
136 {
137 public void body(String namespace, String element, String value)
138 throws Exception
139 {
140 Data data = (Data)digester.peek();
141 if (data.getValue() == null)
142 {
143 data.setValue(value);
144 }
145 }
146 }
147
148 public static class PropertyAttributeRule extends Rule
149 {
150 public void begin(String namespace, String element, Attributes attributes)
151 throws Exception
152 {
153 Configuration config = (Configuration)digester.peek();
154
155 for (int i=0; i < attributes.getLength(); i++)
156 {
157 String name = attributes.getLocalName(i);
158 if ("".equals(name))
159 {
160 name = attributes.getQName(i);
161 }
162
163
164 if (!"class".equals(name))
165 {
166 String value = attributes.getValue(i);
167 config.setProperty(name, value);
168 }
169 }
170 }
171 }
172
173 }