X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2Fxml%2FSpecBeanDefinitionParser.java;h=e5a4531ab920a3a8c48bf5bbb733098b1b518108;hb=31a8055cac622a55afd2668e77f00aba1d031f91;hp=2847365acb1d00ef858d6dd7925030ae5e524fc4;hpb=45c15cdf39b3c7a13bb9af729ec4a1e6941e33f0;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/SpecBeanDefinitionParser.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/SpecBeanDefinitionParser.java index 2847365ac..e5a4531ab 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/SpecBeanDefinitionParser.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/SpecBeanDefinitionParser.java @@ -4,12 +4,11 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.slc.SlcException; import org.argeo.slc.core.execution.DefaultExecutionSpec; import org.argeo.slc.core.execution.PrimitiveSpecAttribute; import org.argeo.slc.core.execution.RefSpecAttribute; import org.argeo.slc.core.execution.RefValueChoice; -import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.ManagedMap; @@ -18,8 +17,6 @@ import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; public class SpecBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { @@ -29,46 +26,45 @@ public class SpecBeanDefinitionParser extends @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - ManagedMap specAttrs = new ManagedMap(); + builder.getBeanDefinition().setDescription(DomUtils.getChildElementValueByTagName(element, + "description")); + + ManagedMap attributes = new ManagedMap(); // Primitives for (Element child : (List) DomUtils .getChildElementsByTagName(element, "primitive")) { BeanDefinitionBuilder childBuilder = BeanDefinitionBuilder .genericBeanDefinition(PrimitiveSpecAttribute.class); - addAbstractSpecAttributeProperties(childBuilder, child); - addValue(childBuilder, child, parserContext); + addCommonProperties(child, parserContext, childBuilder); String type = child.getAttribute("type"); if (StringUtils.hasText(type)) childBuilder.addPropertyValue("type", type); - String name = child.getAttribute("name"); - specAttrs.put(name, childBuilder.getBeanDefinition()); - if (log.isTraceEnabled()) - log.debug("Added primitive attribute " + name); + putInAttributes(attributes, child, + childBuilder.getBeanDefinition(), "primitive"); } // Refs - for (Element child : (List) DomUtils + for (Element refAttrElem : (List) DomUtils .getChildElementsByTagName(element, "ref")) { - BeanDefinitionBuilder childBuilder = BeanDefinitionBuilder + BeanDefinitionBuilder refAttrBuilder = BeanDefinitionBuilder .genericBeanDefinition(RefSpecAttribute.class); - addAbstractSpecAttributeProperties(childBuilder, child); - addValue(childBuilder, child, parserContext); + addCommonProperties(refAttrElem, parserContext, refAttrBuilder); - String targetClassName = child.getAttribute("targetClass"); + String targetClassName = refAttrElem.getAttribute("targetClass"); if (StringUtils.hasText(targetClassName)) - childBuilder.addPropertyValue("targetClass", targetClassName); + refAttrBuilder.addPropertyValue("targetClass", targetClassName); // Choices - NodeList choicesNd = child.getElementsByTagName("choices"); - if (choicesNd.getLength() > 0) { - Element choicesElem = (Element) choicesNd.item(0); - List choices = DomUtils.getChildElementsByTagName(choicesElem, - "choice"); + Element choicesElem = DomUtils.getChildElementByTagName( + refAttrElem, "choices"); + if (choicesElem != null) { + List choices = DomUtils.getChildElementsByTagName( + choicesElem, "choice"); ManagedList choiceBeans = new ManagedList(choices.size()); - for (Element choiceElem : (List) choices) { + for (Element choiceElem : choices) { BeanDefinitionBuilder choiceBuilder = BeanDefinitionBuilder .genericBeanDefinition(RefValueChoice.class); choiceBuilder.addPropertyValue("name", choiceElem @@ -79,59 +75,37 @@ public class SpecBeanDefinitionParser extends choiceBeans.add(choiceBuilder.getBeanDefinition()); } - + refAttrBuilder.addPropertyValue("choices", choiceBeans); } - String name = child.getAttribute("name"); - specAttrs.put(name, childBuilder.getBeanDefinition()); - if (log.isTraceEnabled()) - log.debug("Added spec attribute " + name); + putInAttributes(attributes, refAttrElem, refAttrBuilder + .getBeanDefinition(), "ref"); } - builder.addPropertyValue("attributes", specAttrs); + builder.addPropertyValue("attributes", attributes); } - protected void addAbstractSpecAttributeProperties( - BeanDefinitionBuilder specAttr, Element element) { - + protected void addCommonProperties(Element element, + ParserContext parserContext, BeanDefinitionBuilder specAttr) { addBooleanProperty("isParameter", specAttr, element); addBooleanProperty("isFrozen", specAttr, element); addBooleanProperty("isHidden", specAttr, element); - } - - protected void addValue(BeanDefinitionBuilder specAttr, Element element, - ParserContext parserContext) { - Boolean alreadySet = false; - if (element.hasAttribute("value")) { - specAttr.addPropertyValue("value", element.getAttribute("value")); - alreadySet = true; - } - if (element.hasAttribute("value-ref")) { - if (alreadySet) - throw new SlcException("Multiple value definition for " - + specAttr); - specAttr.addPropertyValue("value", new RuntimeBeanReference(element - .getAttribute("value-ref"))); - } + Object value = NamespaceUtils.parseValue(element, parserContext, + specAttr.getBeanDefinition(), "value"); + if (value != null) + specAttr.addPropertyValue("value", value); - Element valueElem = DomUtils.getChildElementByTagName(element, "value"); - if (valueElem != null) { - if (alreadySet) - throw new SlcException("Multiple value definition for " - + specAttr); + } - NodeList valueChildNd = valueElem.getChildNodes(); + @SuppressWarnings("unchecked") + protected void putInAttributes(ManagedMap attributes, Element child, + BeanDefinition beanDefinition, String nature) { + String name = child.getAttribute("name"); + attributes.put(name, beanDefinition); + if (log.isTraceEnabled()) + log.debug("Added " + nature + " attribute " + name); - for (int i = 0; i < valueChildNd.getLength(); i++) { - Node node = valueChildNd.item(i); - if (node != null && node instanceof Element) { - specAttr.addPropertyValue("value", parseBeanReference( - (Element) node, parserContext, specAttr)); - break; - } - } - } } private void addBooleanProperty(String name, @@ -147,13 +121,6 @@ public class SpecBeanDefinitionParser extends return DefaultExecutionSpec.class; } - // parse nested bean definition - private Object parseBeanReference(Element element, - ParserContext parserContext, BeanDefinitionBuilder builder) { - return parserContext.getDelegate().parsePropertySubElement(element, - builder.getBeanDefinition()); - } - protected boolean shouldGenerateIdAsFallback() { return false; }