1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.commons.pipeline.config;
21
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25
26 import org.apache.commons.beanutils.BeanUtils;
27 import org.apache.commons.digester.AbstractObjectCreationFactory;
28 import org.apache.commons.digester.CallMethodRule;
29 import org.apache.commons.digester.Digester;
30 import org.apache.commons.digester.ObjectCreationFactory;
31 import org.apache.commons.digester.Rule;
32 import org.apache.commons.digester.RuleSet;
33 import org.apache.commons.digester.RuleSetBase;
34 import org.apache.commons.pipeline.Pipeline;
35 import org.apache.commons.pipeline.Stage;
36 import org.apache.commons.pipeline.StageDriver;
37 import org.apache.commons.pipeline.StageDriverFactory;
38 import org.xml.sax.Attributes;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 public class PipelineRuleSet extends RuleSetBase {
115 private static Class[] addBranchTypes = { String.class, Pipeline.class };
116 private static Class[] setEnvTypes = { String.class, Object.class };
117 private List<RuleSet> nestedRuleSets;
118
119
120
121
122 public PipelineRuleSet() {
123 }
124
125
126
127
128
129
130
131
132
133 public PipelineRuleSet(List<RuleSet> nestedRuleSets) {
134 this.nestedRuleSets = nestedRuleSets;
135 }
136
137
138
139
140
141
142 public void addRuleInstances(Digester digester) {
143 ObjectCreationFactory pipelineFactory = new PipelineFactory();
144 ObjectCreationFactory driverFactoryFactory = new StageDriverFactoryFactory();
145
146
147 digester.addFactoryCreate("pipeline", pipelineFactory);
148 digester.addSetProperties("pipeline");
149 digester.addRule("pipeline", new PipelineDriverFactoriesRule());
150
151
152 digester.addFactoryCreate("*/branch/pipeline", pipelineFactory);
153 digester.addRule("*/branch/pipeline", new CallMethodRule(1, "addBranch", 2, addBranchTypes));
154 digester.addCallParam("*/branch/pipeline", 0, "key");
155 digester.addCallParam("*/branch/pipeline", 1, 0);
156 digester.addRule("*/branch/pipeline", new PipelineDriverFactoriesRule());
157
158
159 digester.addObjectCreate("*/pipeline/env/object", "java.lang.Object", "className");
160 digester.addSetProperties("*/pipeline/env/object");
161 digester.addRule("*/pipeline/env/object", new CallMethodRule(1, "setEnv", 2, setEnvTypes));
162 digester.addCallParam("*/pipeline/env/object", 0, "key");
163 digester.addCallParam("*/pipeline/env/object", 1, 0);
164
165 digester.addRule("*/pipeline/env/value", new CallMethodRule(0, "setEnv", 2, setEnvTypes));
166 digester.addCallParam("*/pipeline/env/value", 0, "key");
167 digester.addCallParam("*/pipeline/env/value", 1);
168
169
170 digester.addObjectCreate("*/pipeline/listener", "org.apache.commons.pipeline.StageEventListener", "className");
171 digester.addSetProperties("*/pipeline/listener");
172 digester.addSetNext("*/pipeline/listener", "registerListener", "org.apache.commons.pipeline.StageEventListener");
173
174
175 digester.addFactoryCreate("*/pipeline/driverFactory", driverFactoryFactory);
176 digester.addSetProperties("*/pipeline/driverFactory");
177
178 digester.addObjectCreate("*/driverFactory", "org.apache.commons.pipeline.StageDriverFactory", "className");
179 digester.addSetProperties("*/driverFactory");
180 digester.addSetNext("*/driverFactory", "setWrappedSDF", "org.apache.commons.pipeline.StageDriverFactory");
181
182
183 digester.addObjectCreate("*/pipeline/lifecycleJob", "org.apache.commons.pipeline.PipelineLifecycleJob", "className");
184 digester.addSetProperties("*/pipeline/lifecycleJob");
185 digester.addSetNext("*/pipeline/lifecycleJob", "addLifecycleJob", "org.apache.commons.pipeline.PipelineLifecycleJob");
186
187
188
189 digester.addObjectCreate("*/property", "java.lang.Object", "className");
190 digester.addSetProperties("*/property");
191 digester.addRule("*/property", new SetNestedPropertyObjectRule());
192
193
194 digester.addObjectCreate("*/pipeline/stage", "org.apache.commons.pipeline.BaseStage", "className");
195 digester.addSetProperties("*/pipeline/stage");
196 digester.addRule("*/pipeline/stage", new PipelineAddStageRule());
197
198
199 digester.addRule("*/pipeline/feed/value", new PipelineFeedValueRule());
200
201
202 digester.addObjectCreate("*/pipeline/feed/object", "java.lang.Object", "className");
203 digester.addSetProperties("*/pipeline/feed/object");
204 digester.addRule("*/pipeline/feed/object", new PipelineFeedObjectRule());
205 }
206
207
208
209
210
211
212 private class PipelineFactory extends AbstractObjectCreationFactory {
213 public Object createObject(Attributes attributes) throws java.lang.Exception {
214 String configURI = attributes.getValue("configURI");
215 if (configURI == null) {
216 return new Pipeline();
217 } else {
218 Digester subDigester = new Digester();
219 if (nestedRuleSets != null) {
220 for (RuleSet ruleset : nestedRuleSets) {
221 subDigester.addRuleSet(ruleset);
222 }
223
224 Pipeline pipeline = (Pipeline) subDigester.parse(configURI);
225 return pipeline;
226 } else {
227 throw new IllegalStateException("Unable to parse branch configuration file: No parsing rules provided to PipelineRuleSet constructor.");
228 }
229 }
230 }
231 }
232
233
234
235
236 private class PipelineDriverFactoriesRule extends Rule {
237 public void begin(String namespace, String name, Attributes attributes) throws Exception {
238 digester.push("org.apache.commons.pipeline.config.DriverFactories", new HashMap<String, StageDriverFactory>());
239 super.begin(namespace, name, attributes);
240 }
241
242 public void end(String namespace, String name) throws Exception {
243 super.end(namespace, name);
244 digester.pop("org.apache.commons.pipeline.config.DriverFactories");
245 }
246 }
247
248
249
250
251 private class SetNestedPropertyObjectRule extends Rule {
252 String propName;
253
254 public void begin(String namespace, String name, Attributes attributes) throws Exception {
255 propName = attributes.getValue("propName");
256 super.begin(namespace, name, attributes);
257 }
258
259 public void end(String namespace, String name) throws Exception {
260 super.end(namespace, name);
261 BeanUtils.setProperty(digester.peek(1), propName, digester.peek());
262 }
263 }
264
265
266
267
268
269
270 private class StageDriverFactoryFactory extends AbstractObjectCreationFactory {
271 public Object createObject(Attributes attributes) throws Exception {
272 Map<String, StageDriverFactory> driverFactories =
273 (Map<String,StageDriverFactory>) digester.peek("org.apache.commons.pipeline.config.DriverFactories");
274
275 String className = attributes.getValue("className");
276 String id = attributes.getValue("id");
277 Class clazz = Class.forName(className);
278 if (!StageDriverFactory.class.isAssignableFrom(clazz)) {
279 throw new IllegalArgumentException("Class " + clazz + " does not implement StageDriverFactory.");
280 } else {
281 StageDriverFactory factory = (StageDriverFactory) clazz.newInstance();
282 driverFactories.put(id, factory);
283 return factory;
284 }
285 }
286 }
287
288
289
290
291
292 private class PipelineAddStageRule extends Rule {
293 public void begin(String namespace, String name, Attributes attributes) throws Exception {
294 digester.push("org.apache.commons.pipeline.config.DriverFactoryIds", attributes.getValue("driverFactoryId"));
295 super.begin(namespace, name, attributes);
296 }
297
298 public void end(String namespace, String name) throws Exception {
299 super.end(namespace, name);
300 String factoryId = (String) digester.pop("org.apache.commons.pipeline.config.DriverFactoryIds");
301 Map<String, StageDriverFactory> driverFactories =
302 (Map<String,StageDriverFactory>) digester.peek("org.apache.commons.pipeline.config.DriverFactories");
303 StageDriverFactory factory = driverFactories.get(factoryId);
304 Stage stage = (Stage) digester.peek();
305 Pipeline pipeline = (Pipeline) digester.peek(1);
306 pipeline.addStage(stage, factory);
307 }
308 }
309
310
311
312
313 private class PipelineFeedValueRule extends Rule {
314 public void body(String namespace, String name, String text) throws Exception {
315 Pipeline pipeline = (Pipeline) digester.peek();
316 pipeline.getSourceFeeder().feed(text);
317 super.body(namespace, name, text);
318 }
319 }
320
321
322
323
324 private class PipelineFeedObjectRule extends Rule {
325 public void end(String namespace, String name) throws Exception {
326 super.end(namespace, name);
327 Pipeline pipeline = (Pipeline) digester.peek(1);
328 pipeline.getSourceFeeder().feed(digester.peek());
329 }
330 }
331 }