2 * Copyright (C) 2007-2012 Mathieu Baudier
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.slc
.core
.execution
.xml
;
18 import java
.util
.List
;
20 import org
.apache
.commons
.logging
.Log
;
21 import org
.apache
.commons
.logging
.LogFactory
;
22 import org
.argeo
.slc
.core
.execution
.DefaultExecutionSpec
;
23 import org
.argeo
.slc
.core
.execution
.PrimitiveSpecAttribute
;
24 import org
.argeo
.slc
.core
.execution
.RefSpecAttribute
;
25 import org
.argeo
.slc
.core
.execution
.RefValueChoice
;
26 import org
.springframework
.beans
.factory
.config
.BeanDefinition
;
27 import org
.springframework
.beans
.factory
.support
.BeanDefinitionBuilder
;
28 import org
.springframework
.beans
.factory
.support
.ManagedList
;
29 import org
.springframework
.beans
.factory
.support
.ManagedMap
;
30 import org
.springframework
.beans
.factory
.xml
.AbstractSingleBeanDefinitionParser
;
31 import org
.springframework
.beans
.factory
.xml
.ParserContext
;
32 import org
.springframework
.util
.StringUtils
;
33 import org
.springframework
.util
.xml
.DomUtils
;
34 import org
.w3c
.dom
.Element
;
36 public class SpecBeanDefinitionParser
extends
37 AbstractSingleBeanDefinitionParser
{
38 private Log log
= LogFactory
.getLog(SpecBeanDefinitionParser
.class);
40 @SuppressWarnings("unchecked")
42 protected void doParse(Element element
, ParserContext parserContext
,
43 BeanDefinitionBuilder builder
) {
44 builder
.getBeanDefinition().setDescription(DomUtils
.getChildElementValueByTagName(element
,
47 ManagedMap attributes
= new ManagedMap();
50 for (Element child
: (List
<Element
>) DomUtils
51 .getChildElementsByTagName(element
, "primitive")) {
52 BeanDefinitionBuilder childBuilder
= BeanDefinitionBuilder
53 .genericBeanDefinition(PrimitiveSpecAttribute
.class);
54 addCommonProperties(child
, parserContext
, childBuilder
);
56 String type
= child
.getAttribute("type");
57 if (StringUtils
.hasText(type
))
58 childBuilder
.addPropertyValue("type", type
);
60 putInAttributes(attributes
, child
,
61 childBuilder
.getBeanDefinition(), "primitive");
65 for (Element refAttrElem
: (List
<Element
>) DomUtils
66 .getChildElementsByTagName(element
, "ref")) {
67 BeanDefinitionBuilder refAttrBuilder
= BeanDefinitionBuilder
68 .genericBeanDefinition(RefSpecAttribute
.class);
69 addCommonProperties(refAttrElem
, parserContext
, refAttrBuilder
);
71 String targetClassName
= refAttrElem
.getAttribute("targetClass");
72 if (StringUtils
.hasText(targetClassName
))
73 refAttrBuilder
.addPropertyValue("targetClass", targetClassName
);
76 Element choicesElem
= DomUtils
.getChildElementByTagName(
77 refAttrElem
, "choices");
78 if (choicesElem
!= null) {
79 List
<Element
> choices
= DomUtils
.getChildElementsByTagName(
80 choicesElem
, "choice");
81 ManagedList choiceBeans
= new ManagedList(choices
.size());
82 for (Element choiceElem
: choices
) {
83 BeanDefinitionBuilder choiceBuilder
= BeanDefinitionBuilder
84 .genericBeanDefinition(RefValueChoice
.class);
85 choiceBuilder
.addPropertyValue("name", choiceElem
86 .getAttribute("name"));
87 String desc
= choiceElem
.getAttribute("description");
88 if (StringUtils
.hasText(desc
))
89 choiceBuilder
.addPropertyValue("description", desc
);
91 choiceBeans
.add(choiceBuilder
.getBeanDefinition());
93 refAttrBuilder
.addPropertyValue("choices", choiceBeans
);
96 putInAttributes(attributes
, refAttrElem
, refAttrBuilder
97 .getBeanDefinition(), "ref");
100 builder
.addPropertyValue("attributes", attributes
);
103 protected void addCommonProperties(Element element
,
104 ParserContext parserContext
, BeanDefinitionBuilder specAttr
) {
105 addBooleanProperty("isParameter", specAttr
, element
);
106 addBooleanProperty("isFrozen", specAttr
, element
);
107 addBooleanProperty("isHidden", specAttr
, element
);
109 Object value
= NamespaceUtils
.parseValue(element
, parserContext
,
110 specAttr
.getBeanDefinition(), "value");
112 specAttr
.addPropertyValue("value", value
);
116 @SuppressWarnings("unchecked")
117 protected void putInAttributes(ManagedMap attributes
, Element child
,
118 BeanDefinition beanDefinition
, String nature
) {
119 String name
= child
.getAttribute("name");
120 attributes
.put(name
, beanDefinition
);
121 if (log
.isTraceEnabled())
122 log
.debug("Added " + nature
+ " attribute " + name
);
126 private void addBooleanProperty(String name
,
127 BeanDefinitionBuilder specAttr
, Element element
) {
128 String bool
= element
.getAttribute(name
);
129 if (StringUtils
.hasText(bool
))
130 specAttr
.addPropertyValue(name
, Boolean
.parseBoolean(bool
));
135 protected Class
<DefaultExecutionSpec
> getBeanClass(Element element
) {
136 return DefaultExecutionSpec
.class;
139 protected boolean shouldGenerateIdAsFallback() {