/* * 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.core.execution.DefaultExecutionSpec; import org.argeo.slc.execution.RefSpecAttribute; import org.argeo.slc.execution.RefValueChoice; import org.argeo.slc.primitive.PrimitiveSpecAttribute; 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; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** Interprets the tag */ public class SpecBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { private Log log = LogFactory.getLog(SpecBeanDefinitionParser.class); @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { 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); addCommonProperties(child, parserContext, childBuilder); String type = child.getAttribute("type"); if (StringUtils.hasText(type)) childBuilder.addPropertyValue("type", type); putInAttributes(attributes, child, childBuilder.getBeanDefinition(), "primitive"); } // Refs for (Element refAttrElem : (List) DomUtils .getChildElementsByTagName(element, "ref")) { BeanDefinitionBuilder refAttrBuilder = BeanDefinitionBuilder .genericBeanDefinition(RefSpecAttribute.class); addCommonProperties(refAttrElem, parserContext, refAttrBuilder); String targetClassName = refAttrElem.getAttribute("targetClass"); if (StringUtils.hasText(targetClassName)) refAttrBuilder.addPropertyValue("targetClass", targetClassName); // Choices Element choicesElem = DomUtils.getChildElementByTagName( refAttrElem, "choices"); if (choicesElem != null) { List choices = DomUtils.getChildElementsByTagName( choicesElem, "choice"); ManagedList choiceBeans = new ManagedList( choices.size()); for (Element choiceElem : choices) { BeanDefinitionBuilder choiceBuilder = BeanDefinitionBuilder .genericBeanDefinition(RefValueChoice.class); 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); } putInAttributes(attributes, refAttrElem, refAttrBuilder.getBeanDefinition(), "ref"); } builder.addPropertyValue("attributes", attributes); } 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); Object value = NamespaceUtils.parseValue(element, parserContext, specAttr.getBeanDefinition(), "value"); if (value != null) specAttr.addPropertyValue("value", value); } 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); } private void addBooleanProperty(String name, BeanDefinitionBuilder specAttr, Element element) { String bool = element.getAttribute(name); if (StringUtils.hasText(bool)) specAttr.addPropertyValue(name, Boolean.parseBoolean(bool)); } @Override protected Class getBeanClass(Element element) { return DefaultExecutionSpec.class; } protected boolean shouldGenerateIdAsFallback() { return false; } }