- Custom namespace
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 9 Jan 2010 13:38:02 +0000 (13:38 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 9 Jan 2010 13:38:02 +0000 (13:38 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3260 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.core/META-INF/spring.handlers [new file with mode: 0644]
runtime/org.argeo.slc.core/META-INF/spring.schemas [new file with mode: 0644]
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/AsFlowDecorator.java [new file with mode: 0644]
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowBeanDefinitionParser.java [new file with mode: 0644]
runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowNamespaceHandler.java [new file with mode: 0644]
runtime/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/execution/xml/slc-flow-0.12.xsd [new file with mode: 0644]

diff --git a/runtime/org.argeo.slc.core/META-INF/spring.handlers b/runtime/org.argeo.slc.core/META-INF/spring.handlers
new file mode 100644 (file)
index 0000000..417a952
--- /dev/null
@@ -0,0 +1 @@
+http\://www.argeo.org/schema/slc-flow=org.argeo.slc.core.execution.xml.FlowNamespaceHandler
\ No newline at end of file
diff --git a/runtime/org.argeo.slc.core/META-INF/spring.schemas b/runtime/org.argeo.slc.core/META-INF/spring.schemas
new file mode 100644 (file)
index 0000000..07987bb
--- /dev/null
@@ -0,0 +1,2 @@
+http\://www.argeo.org/schema/slc-flow.xsd=org/argeo/slc/core/execution/xml/slc-flow-0.12.xsd
+http\://www.argeo.org/schema/slc-flow-0.12.xsd=org/argeo/slc/core/execution/xml/slc-flow-0.12.xsd
diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/AsFlowDecorator.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/AsFlowDecorator.java
new file mode 100644 (file)
index 0000000..7a72e01
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.slc.core.execution.xml;
+
+import org.argeo.slc.SlcException;
+import org.argeo.slc.core.execution.DefaultExecutionFlow;
+import org.springframework.beans.factory.config.BeanDefinitionHolder;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+public class AsFlowDecorator implements BeanDefinitionDecorator {
+
+       @SuppressWarnings("unchecked")
+       public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder bean,
+                       ParserContext ctx) {
+               String flowBeanName = ((Attr) node).getValue();
+               if (ctx.getRegistry().containsBeanDefinition(flowBeanName))
+                       throw new SlcException("A bean named " + flowBeanName
+                                       + " is already defined.");
+               BeanDefinitionBuilder flow = BeanDefinitionBuilder
+                               .rootBeanDefinition(DefaultExecutionFlow.class);
+               ManagedList executables = new ManagedList(1);
+               executables.add(bean.getBeanDefinition());
+               flow.addPropertyValue("executables", executables);
+               ctx.getRegistry().registerBeanDefinition(flowBeanName,
+                               flow.getBeanDefinition());
+               return bean;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowBeanDefinitionParser.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowBeanDefinitionParser.java
new file mode 100644 (file)
index 0000000..306beac
--- /dev/null
@@ -0,0 +1,72 @@
+package org.argeo.slc.core.execution.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.slc.SlcException;
+import org.argeo.slc.core.execution.DefaultExecutionFlow;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.springframework.util.StringUtils;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class FlowBeanDefinitionParser extends
+               AbstractSingleBeanDefinitionParser {
+//     private Log log = LogFactory.getLog(FlowBeanDefinitionParser.class);
+
+       @SuppressWarnings("unchecked")
+       @Override
+       protected void doParse(Element element, ParserContext parserContext,
+                       BeanDefinitionBuilder builder) {
+               String path = element.getAttribute("lenient");
+               if (StringUtils.hasText(path))
+                       builder.addPropertyValue("path", path);
+
+               List<Element> children = new ArrayList<Element>();
+               NodeList nodeList = element.getChildNodes();
+               for (int i = 0; i < nodeList.getLength(); i++) {
+                       Node node = nodeList.item(i);
+                       if (node instanceof Element)
+                               children.add((Element) node);
+               }
+               // children.addAll(DomUtils.getChildElementsByTagName(element, "bean"));
+               // children.addAll(DomUtils.getChildElementsByTagName(element, "ref"));
+
+               ManagedList executables = new ManagedList(children.size());
+               for (int i = 0; i < children.size(); i++) {
+                       Element child = children.get(i);
+                       String name = child.getNodeName();
+                       if ("bean".equals(name) || "ref".equals(name)) {
+                               Object target = parseBeanReference(element, (Element) child,
+                                               parserContext, builder);
+                               executables.add(target);
+                       } else if ("flow".equals(name)) {
+                               // TODO
+                       } else {
+                               throw new SlcException("Unsupported children '" + name + "'");
+                       }
+               }
+               builder.addPropertyValue("executables", executables);
+       }
+
+       @Override
+       protected Class<DefaultExecutionFlow> getBeanClass(Element element) {
+               return DefaultExecutionFlow.class;
+       }
+
+       // parse nested bean definition
+       private Object parseBeanReference(Element parent, Element element,
+                       ParserContext parserContext, BeanDefinitionBuilder builder) {
+               return parserContext.getDelegate().parsePropertySubElement(element,
+                               builder.getBeanDefinition());
+       }
+
+       protected boolean shouldGenerateIdAsFallback() {
+               return true;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowNamespaceHandler.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowNamespaceHandler.java
new file mode 100644 (file)
index 0000000..f20b193
--- /dev/null
@@ -0,0 +1,13 @@
+package org.argeo.slc.core.execution.xml;
+
+import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+
+public class FlowNamespaceHandler extends NamespaceHandlerSupport {
+
+       public void init() {
+               registerBeanDefinitionParser("flow", new FlowBeanDefinitionParser());
+               registerBeanDefinitionDecoratorForAttribute("as-flow",
+                               new AsFlowDecorator());
+       }
+
+}
diff --git a/runtime/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/execution/xml/slc-flow-0.12.xsd b/runtime/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/execution/xml/slc-flow-0.12.xsd
new file mode 100644 (file)
index 0000000..4534138
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+       xmlns:beans="http://www.springframework.org/schema/beans"
+       targetNamespace="http://www.argeo.org/schema/slc-flow"
+       elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+       <xsd:import namespace="http://www.springframework.org/schema/beans" />
+
+
+       <xsd:element name="flow">
+               <xsd:complexType>
+                       <xsd:complexContent>
+                               <xsd:extension base="beans:identifiedType">
+                                       <xsd:sequence>
+                                               <xsd:any minOccurs="1" maxOccurs="unbounded" />
+                                       </xsd:sequence>
+                                       <xsd:attribute name="path" type="xsd:string" />
+                               </xsd:extension>
+                       </xsd:complexContent>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:attribute name="as-flow" type="xsd:string" />
+
+</xsd:schema>
\ No newline at end of file