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=4ef3f978899d27fc5f9bae44784c2eb71327f9f6;hb=f86db0937b395c7fa96fa4bf4a29cc2c676fe3f5;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..4ef3f9788 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 @@ -1,15 +1,29 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.slc.core.execution.xml; 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,9 +32,8 @@ 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; +/** Interprets the tag */ public class SpecBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { private Log log = LogFactory.getLog(SpecBeanDefinitionParser.class); @@ -29,109 +42,88 @@ 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 - .getAttribute("name")); + choiceBuilder.addPropertyValue("name", + choiceElem.getAttribute("name")); String desc = choiceElem.getAttribute("description"); if (StringUtils.hasText(desc)) choiceBuilder.addPropertyValue("description", desc); 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("isImmutable", specAttr, element); + addBooleanProperty("isConstant", specAttr, element); + addBooleanProperty("isHidden", specAttr, element); 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; - } + Object value = NamespaceUtils.parseValue(element, parserContext, + specAttr.getBeanDefinition(), "value"); + if (value != null) + specAttr.addPropertyValue("value", value); - if (element.hasAttribute("value-ref")) { - if (alreadySet) - throw new SlcException("Multiple value definition for " - + specAttr); - specAttr.addPropertyValue("value", new RuntimeBeanReference(element - .getAttribute("value-ref"))); - } - - 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 +139,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; }