]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - legacy/org.argeo.slc.spring/src/org/argeo/slc/core/execution/xml/NamespaceUtils.java
Clarify overall project structure.
[gpl/argeo-slc.git] / legacy / org.argeo.slc.spring / src / org / argeo / slc / core / execution / xml / NamespaceUtils.java
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 (file)
index 0000000..baa0152
--- /dev/null
@@ -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);
+       }
+}