1 package org
.argeo
.slc
.core
.execution
.xml
;
3 import java
.util
.ArrayList
;
6 import org
.argeo
.slc
.SlcException
;
7 import org
.argeo
.slc
.core
.execution
.DefaultExecutionFlow
;
8 import org
.springframework
.beans
.factory
.config
.RuntimeBeanReference
;
9 import org
.springframework
.beans
.factory
.support
.BeanDefinitionBuilder
;
10 import org
.springframework
.beans
.factory
.support
.ManagedList
;
11 import org
.springframework
.beans
.factory
.support
.ManagedMap
;
12 import org
.springframework
.beans
.factory
.xml
.AbstractSingleBeanDefinitionParser
;
13 import org
.springframework
.beans
.factory
.xml
.ParserContext
;
14 import org
.springframework
.util
.StringUtils
;
15 import org
.springframework
.util
.xml
.DomUtils
;
16 import org
.w3c
.dom
.Element
;
17 import org
.w3c
.dom
.Node
;
18 import org
.w3c
.dom
.NodeList
;
20 public class FlowBeanDefinitionParser
extends
21 AbstractSingleBeanDefinitionParser
{
22 // private Log log = LogFactory.getLog(FlowBeanDefinitionParser.class);
24 @SuppressWarnings("unchecked")
26 protected void doParse(Element element
, ParserContext parserContext
,
27 BeanDefinitionBuilder builder
) {
28 String path
= element
.getAttribute("path");
29 if (StringUtils
.hasText(path
))
30 builder
.addPropertyValue("path", path
);
32 String spec
= element
.getAttribute("spec");
33 if (StringUtils
.hasText(spec
))
34 builder
.getBeanDefinition().getConstructorArgumentValues()
35 .addGenericArgumentValue(new RuntimeBeanReference(spec
));
37 String abstrac
= element
.getAttribute("abstract");
38 if (StringUtils
.hasText(abstrac
))
39 builder
.setAbstract(Boolean
.parseBoolean(abstrac
));
41 String parent
= element
.getAttribute("parent");
42 if (StringUtils
.hasText(parent
))
43 builder
.setParentName(parent
);
45 List
<Element
> execElems
= new ArrayList
<Element
>();
46 List
<Element
> argsElems
= new ArrayList
<Element
>();
47 NodeList nodeList
= element
.getChildNodes();
48 for (int i
= 0; i
< nodeList
.getLength(); i
++) {
49 Node node
= nodeList
.item(i
);
50 if (node
instanceof Element
) {
51 if (DomUtils
.nodeNameEquals(node
, "arg"))
52 argsElems
.add((Element
) node
);
54 execElems
.add((Element
) node
);
59 if (argsElems
.size() != 0) {
60 ManagedMap args
= new ManagedMap(argsElems
.size());
61 for (Element argElem
: argsElems
) {
62 Object value
= NamespaceUtils
.parseValue(argElem
,
63 parserContext
, builder
.getBeanDefinition(), null);
65 args
.put(argElem
.getAttribute("name"), value
);
67 throw new SlcException("No value defined.");
69 builder
.getBeanDefinition().getConstructorArgumentValues()
70 .addGenericArgumentValue(args
);
74 if (execElems
.size() != 0) {
75 ManagedList executables
= new ManagedList(execElems
.size());
76 for (int i
= 0; i
< execElems
.size(); i
++) {
77 Element child
= execElems
.get(i
);
78 String name
= child
.getLocalName();
79 if (DomUtils
.nodeNameEquals(child
, "bean")
80 || DomUtils
.nodeNameEquals(child
, "ref")) {
81 // Object target = parseBeanReference((Element) child,
82 // parserContext, builder);
83 executables
.add(NamespaceUtils
.parseBeanReference(child
,
84 parserContext
, builder
.getBeanDefinition()));
85 } else if (DomUtils
.nodeNameEquals(child
, "flow")) {
86 throw new SlcException(
87 "Nested flows are not yet supported, use a standard ref to another flow.");
89 throw new SlcException("Unsupported child '" + name
+ "'");
92 builder
.addPropertyValue("executables", executables
);
97 protected Class
<DefaultExecutionFlow
> getBeanClass(Element element
) {
98 return DefaultExecutionFlow
.class;
101 // parse nested bean definition
102 // private Object parseBeanReference(Element element,
103 // ParserContext parserContext, BeanDefinitionBuilder builder) {
104 // return parserContext.getDelegate().parsePropertySubElement(element,
105 // builder.getBeanDefinition());
108 protected boolean shouldGenerateIdAsFallback() {