1 package org
.argeo
.slc
.core
.execution
.xml
;
5 import org
.argeo
.api
.cms
.CmsLog
;
6 import org
.argeo
.slc
.core
.execution
.DefaultExecutionSpec
;
7 import org
.argeo
.slc
.execution
.RefSpecAttribute
;
8 import org
.argeo
.slc
.execution
.RefValueChoice
;
9 import org
.argeo
.slc
.primitive
.PrimitiveSpecAttribute
;
10 import org
.springframework
.beans
.factory
.config
.BeanDefinition
;
11 import org
.springframework
.beans
.factory
.support
.BeanDefinitionBuilder
;
12 import org
.springframework
.beans
.factory
.support
.ManagedList
;
13 import org
.springframework
.beans
.factory
.support
.ManagedMap
;
14 import org
.springframework
.beans
.factory
.xml
.AbstractSingleBeanDefinitionParser
;
15 import org
.springframework
.beans
.factory
.xml
.ParserContext
;
16 import org
.springframework
.util
.StringUtils
;
17 import org
.springframework
.util
.xml
.DomUtils
;
18 import org
.w3c
.dom
.Element
;
20 /** Interprets the <flow:spec> tag */
21 public class SpecBeanDefinitionParser
extends
22 AbstractSingleBeanDefinitionParser
{
23 private CmsLog log
= CmsLog
.getLog(SpecBeanDefinitionParser
.class);
26 protected void doParse(Element element
, ParserContext parserContext
,
27 BeanDefinitionBuilder builder
) {
28 builder
.getBeanDefinition().setDescription(
29 DomUtils
.getChildElementValueByTagName(element
, "description"));
31 ManagedMap
<String
, BeanDefinition
> attributes
= new ManagedMap
<String
, BeanDefinition
>();
34 for (Element child
: (List
<Element
>) DomUtils
35 .getChildElementsByTagName(element
, "primitive")) {
36 BeanDefinitionBuilder childBuilder
= BeanDefinitionBuilder
37 .genericBeanDefinition(PrimitiveSpecAttribute
.class);
38 addCommonProperties(child
, parserContext
, childBuilder
);
40 String type
= child
.getAttribute("type");
41 if (StringUtils
.hasText(type
))
42 childBuilder
.addPropertyValue("type", type
);
44 putInAttributes(attributes
, child
,
45 childBuilder
.getBeanDefinition(), "primitive");
49 for (Element refAttrElem
: (List
<Element
>) DomUtils
50 .getChildElementsByTagName(element
, "ref")) {
51 BeanDefinitionBuilder refAttrBuilder
= BeanDefinitionBuilder
52 .genericBeanDefinition(RefSpecAttribute
.class);
53 addCommonProperties(refAttrElem
, parserContext
, refAttrBuilder
);
55 String targetClassName
= refAttrElem
.getAttribute("targetClass");
56 if (StringUtils
.hasText(targetClassName
))
57 refAttrBuilder
.addPropertyValue("targetClass", targetClassName
);
60 Element choicesElem
= DomUtils
.getChildElementByTagName(
61 refAttrElem
, "choices");
62 if (choicesElem
!= null) {
63 List
<Element
> choices
= DomUtils
.getChildElementsByTagName(
64 choicesElem
, "choice");
65 ManagedList
<BeanDefinition
> choiceBeans
= new ManagedList
<BeanDefinition
>(
67 for (Element choiceElem
: choices
) {
68 BeanDefinitionBuilder choiceBuilder
= BeanDefinitionBuilder
69 .genericBeanDefinition(RefValueChoice
.class);
70 choiceBuilder
.addPropertyValue("name",
71 choiceElem
.getAttribute("name"));
72 String desc
= choiceElem
.getAttribute("description");
73 if (StringUtils
.hasText(desc
))
74 choiceBuilder
.addPropertyValue("description", desc
);
76 choiceBeans
.add(choiceBuilder
.getBeanDefinition());
78 refAttrBuilder
.addPropertyValue("choices", choiceBeans
);
81 putInAttributes(attributes
, refAttrElem
,
82 refAttrBuilder
.getBeanDefinition(), "ref");
85 builder
.addPropertyValue("attributes", attributes
);
88 protected void addCommonProperties(Element element
,
89 ParserContext parserContext
, BeanDefinitionBuilder specAttr
) {
90 addBooleanProperty("isImmutable", specAttr
, element
);
91 addBooleanProperty("isConstant", specAttr
, element
);
92 addBooleanProperty("isHidden", specAttr
, element
);
93 addBooleanProperty("isParameter", specAttr
, element
);
94 addBooleanProperty("isFrozen", specAttr
, element
);
96 Object value
= NamespaceUtils
.parseValue(element
, parserContext
,
97 specAttr
.getBeanDefinition(), "value");
99 specAttr
.addPropertyValue("value", value
);
103 protected void putInAttributes(
104 ManagedMap
<String
, BeanDefinition
> attributes
, Element child
,
105 BeanDefinition beanDefinition
, String nature
) {
106 String name
= child
.getAttribute("name");
107 attributes
.put(name
, beanDefinition
);
108 if (log
.isTraceEnabled())
109 log
.debug("Added " + nature
+ " attribute " + name
);
113 private void addBooleanProperty(String name
,
114 BeanDefinitionBuilder specAttr
, Element element
) {
115 String bool
= element
.getAttribute(name
);
116 if (StringUtils
.hasText(bool
))
117 specAttr
.addPropertyValue(name
, Boolean
.parseBoolean(bool
));
122 protected Class
<DefaultExecutionSpec
> getBeanClass(Element element
) {
123 return DefaultExecutionSpec
.class;
126 protected boolean shouldGenerateIdAsFallback() {