X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=legacy%2Forg.argeo.slc.spring%2Fsrc%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2Fxml%2FNamespaceUtils.java;fp=legacy%2Forg.argeo.slc.spring%2Fsrc%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2Fxml%2FNamespaceUtils.java;h=baa01524f33c8833716d84bd415073b361e7269c;hb=6fc94d69efe089414ac9e63bde3efab1cbf7b7ca;hp=0000000000000000000000000000000000000000;hpb=b36c62642bd0db11b3133b369cc026fd4b7a1ec6;p=gpl%2Fargeo-slc.git diff --git a/legacy/org.argeo.slc.spring/src/org/argeo/slc/core/execution/xml/NamespaceUtils.java b/legacy/org.argeo.slc.spring/src/org/argeo/slc/core/execution/xml/NamespaceUtils.java new file mode 100644 index 000000000..baa01524f --- /dev/null +++ b/legacy/org.argeo.slc.spring/src/org/argeo/slc/core/execution/xml/NamespaceUtils.java @@ -0,0 +1,92 @@ +package org.argeo.slc.core.execution.xml; + +import org.argeo.slc.SlcException; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * Utilities to simplify common tasks when interpreting a custom namespace and + * converting it into bean definitions. + */ +public class NamespaceUtils { + // private final static Log log = LogFactory.getLog(NamespaceUtils.class); + + /** + * Returns the value defined either: directly by the the 'value' attribute, + * as reference by the 'ref' attribute or as a nested bean. + */ + public static Object parseValue(Element element, + ParserContext parserContext, + BeanDefinition containingBeanDefintion, String valueTagName) { + Object value = null; + if (element.hasAttribute("value")) { + value = element.getAttribute("value"); + } + + if (element.hasAttribute("ref")) { + if (value != null) + throw new SlcException("Multiple value definition for " + + element); + value = new RuntimeBeanReference(element.getAttribute("ref")); + } + + Element uniqueSubElem = null; + if (valueTagName != null) { + Element valueElem = DomUtils.getChildElementByTagName(element, + valueTagName); + if (valueElem != null) { + uniqueSubElem = findUniqueSubElement(valueElem); + if (uniqueSubElem == null) + throw new SlcException("No subelement found under " + + valueElem); + } + } else {// no intermediary tag + uniqueSubElem = findUniqueSubElement(element); + } + + if (uniqueSubElem != null) { + if (value != null) + throw new SlcException("Multiple value definition for " + + element); + value = parseBeanOrReference(uniqueSubElem, parserContext, + containingBeanDefintion); + } + return value; + } + + public static Element findUniqueSubElement(Element element) { + NodeList childNodes = element.getChildNodes(); + + Element uniqueSubElem = null; + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node != null && node instanceof Element) { + if (uniqueSubElem == null) + uniqueSubElem = (Element) node; + else + throw new SlcException( + "There are more than one sub element under " + + element); + } + } + return uniqueSubElem; + } + + public static Object parseBeanOrReference(Element element, + ParserContext parserContext, BeanDefinition beanDefinition) { + // return parserContext.getDelegate().parsePropertySubElement(element, + // beanDefinition); + + BeanDefinitionParserDelegate deleg = parserContext.getDelegate(); + // if ("bean".equals(element.getNodeName())) + // return deleg.parseBeanDefinitionElement(element, beanDefinition); + // else + return deleg.parsePropertySubElement(element, beanDefinition); + } +}