From: Mathieu Baudier Date: Sat, 9 Jan 2010 13:38:02 +0000 (+0000) Subject: - Custom namespace X-Git-Tag: argeo-slc-2.1.7~1486 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=16b2efa4ed3c8531ea539961c9dfaa326a8b164f;hp=9274f558a78cccc62501d59b292b1866f9d4eb07;p=gpl%2Fargeo-slc.git - Custom namespace git-svn-id: https://svn.argeo.org/slc/trunk@3260 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- 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 index 000000000..417a952e8 --- /dev/null +++ b/runtime/org.argeo.slc.core/META-INF/spring.handlers @@ -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 index 000000000..07987bbdd --- /dev/null +++ b/runtime/org.argeo.slc.core/META-INF/spring.schemas @@ -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 index 000000000..7a72e01c6 --- /dev/null +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/AsFlowDecorator.java @@ -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 index 000000000..306beace2 --- /dev/null +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowBeanDefinitionParser.java @@ -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 children = new ArrayList(); + 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 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 index 000000000..f20b193ca --- /dev/null +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/xml/FlowNamespaceHandler.java @@ -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 index 000000000..4534138ec --- /dev/null +++ b/runtime/org.argeo.slc.core/src/main/resources/org/argeo/slc/core/execution/xml/slc-flow-0.12.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file