]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/org.argeo.slc.spring/src/org/argeo/slc/core/execution/xml/SpecBeanDefinitionParser.java
Massive Argeo APIs refactoring
[gpl/argeo-slc.git] / legacy / org.argeo.slc.spring / src / org / argeo / slc / core / execution / xml / SpecBeanDefinitionParser.java
1 package org.argeo.slc.core.execution.xml;
2
3 import java.util.List;
4
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;
19
20 /** Interprets the <flow:spec> tag */
21 public class SpecBeanDefinitionParser extends
22 AbstractSingleBeanDefinitionParser {
23 private CmsLog log = CmsLog.getLog(SpecBeanDefinitionParser.class);
24
25 @Override
26 protected void doParse(Element element, ParserContext parserContext,
27 BeanDefinitionBuilder builder) {
28 builder.getBeanDefinition().setDescription(
29 DomUtils.getChildElementValueByTagName(element, "description"));
30
31 ManagedMap<String, BeanDefinition> attributes = new ManagedMap<String, BeanDefinition>();
32
33 // Primitives
34 for (Element child : (List<Element>) DomUtils
35 .getChildElementsByTagName(element, "primitive")) {
36 BeanDefinitionBuilder childBuilder = BeanDefinitionBuilder
37 .genericBeanDefinition(PrimitiveSpecAttribute.class);
38 addCommonProperties(child, parserContext, childBuilder);
39
40 String type = child.getAttribute("type");
41 if (StringUtils.hasText(type))
42 childBuilder.addPropertyValue("type", type);
43
44 putInAttributes(attributes, child,
45 childBuilder.getBeanDefinition(), "primitive");
46 }
47
48 // Refs
49 for (Element refAttrElem : (List<Element>) DomUtils
50 .getChildElementsByTagName(element, "ref")) {
51 BeanDefinitionBuilder refAttrBuilder = BeanDefinitionBuilder
52 .genericBeanDefinition(RefSpecAttribute.class);
53 addCommonProperties(refAttrElem, parserContext, refAttrBuilder);
54
55 String targetClassName = refAttrElem.getAttribute("targetClass");
56 if (StringUtils.hasText(targetClassName))
57 refAttrBuilder.addPropertyValue("targetClass", targetClassName);
58
59 // Choices
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>(
66 choices.size());
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);
75
76 choiceBeans.add(choiceBuilder.getBeanDefinition());
77 }
78 refAttrBuilder.addPropertyValue("choices", choiceBeans);
79 }
80
81 putInAttributes(attributes, refAttrElem,
82 refAttrBuilder.getBeanDefinition(), "ref");
83 }
84
85 builder.addPropertyValue("attributes", attributes);
86 }
87
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);
95
96 Object value = NamespaceUtils.parseValue(element, parserContext,
97 specAttr.getBeanDefinition(), "value");
98 if (value != null)
99 specAttr.addPropertyValue("value", value);
100
101 }
102
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);
110
111 }
112
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));
118
119 }
120
121 @Override
122 protected Class<DefaultExecutionSpec> getBeanClass(Element element) {
123 return DefaultExecutionSpec.class;
124 }
125
126 protected boolean shouldGenerateIdAsFallback() {
127 return false;
128 }
129
130 }