CAMEL-8317: XML DSL - Allow to use bean property style to configure endpoint options
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d1625272 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d1625272 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d1625272 Branch: refs/heads/master Commit: d1625272c8935a4b9c1760d1395db539620db975 Parents: 07691e9 Author: Claus Ibsen <[email protected]> Authored: Thu Feb 5 11:15:06 2015 +0100 Committer: Claus Ibsen <[email protected]> Committed: Thu Feb 5 15:51:23 2015 +0100 ---------------------------------------------------------------------- .../xml/AbstractCamelEndpointFactoryBean.java | 7 +-- .../camel/spring/CamelEndpointFactoryBean.java | 5 ++ .../spring/handler/CamelNamespaceHandler.java | 33 ++++++++++++- .../spring/SpringEndpointPropertyTest.java | 52 ++++++++++++++++++++ .../camel/spring/SpringEndpointPropertyTest.xml | 51 +++++++++++++++++++ 5 files changed, 143 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/d1625272/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelEndpointFactoryBean.java ---------------------------------------------------------------------- diff --git a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelEndpointFactoryBean.java b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelEndpointFactoryBean.java index 8f445c5..10f2d9c 100644 --- a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelEndpointFactoryBean.java +++ b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelEndpointFactoryBean.java @@ -18,13 +18,14 @@ package org.apache.camel.core.xml; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.Endpoint; @@ -43,8 +44,8 @@ public abstract class AbstractCamelEndpointFactoryBean extends AbstractCamelFact @XmlAttribute @Deprecated private ExchangePattern pattern; - @XmlElement(name = "property") - private List<PropertyDefinition> properties; + @XmlElementRef + private List<PropertyDefinition> properties = new ArrayList<PropertyDefinition>(); @XmlTransient private Endpoint endpoint; http://git-wip-us.apache.org/repos/asf/camel/blob/d1625272/components/camel-spring/src/main/java/org/apache/camel/spring/CamelEndpointFactoryBean.java ---------------------------------------------------------------------- diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelEndpointFactoryBean.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelEndpointFactoryBean.java index 55cc002..ace1ccd 100644 --- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelEndpointFactoryBean.java +++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelEndpointFactoryBean.java @@ -50,4 +50,9 @@ public class CamelEndpointFactoryBean extends AbstractCamelEndpointFactoryBean i this.applicationContext = applicationContext; } + @Override + public Endpoint getObject() throws Exception { + Endpoint answer = super.getObject(); + return answer; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/d1625272/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java ---------------------------------------------------------------------- diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java index 2efbd89..125a472 100644 --- a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java +++ b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java @@ -72,7 +72,7 @@ import org.w3c.dom.NodeList; public class CamelNamespaceHandler extends NamespaceHandlerSupport { private static final String SPRING_NS = "http://camel.apache.org/schema/spring"; private static final Logger LOG = LoggerFactory.getLogger(CamelNamespaceHandler.class); - protected BeanDefinitionParser endpointParser = new BeanDefinitionParser(CamelEndpointFactoryBean.class, false); + protected BeanDefinitionParser endpointParser = new EndpointDefinitionParser(); protected BeanDefinitionParser beanPostProcessorParser = new BeanDefinitionParser(CamelBeanPostProcessor.class, false); protected Set<String> parserElementNames = new HashSet<String>(); protected Map<String, BeanDefinitionParser> parserMap = new HashMap<String, BeanDefinitionParser>(); @@ -126,6 +126,8 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport { registerParser("restContext", new RestContextDefinitionParser()); // register routeContext parser registerParser("routeContext", new RouteContextDefinitionParser()); + // register endpoint parser + registerParser("endpoint", endpointParser); addBeanDefinitionParser("keyStoreParameters", KeyStoreParametersFactoryBean.class, true, true); addBeanDefinitionParser("secureRandomParameters", SecureRandomParametersFactoryBean.class, true, true); @@ -135,7 +137,6 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport { addBeanDefinitionParser("template", CamelProducerTemplateFactoryBean.class, true, false); addBeanDefinitionParser("consumerTemplate", CamelConsumerTemplateFactoryBean.class, true, false); addBeanDefinitionParser("export", CamelServiceExporter.class, true, false); - addBeanDefinitionParser("endpoint", CamelEndpointFactoryBean.class, true, false); addBeanDefinitionParser("threadPool", CamelThreadPoolFactoryBean.class, true, true); addBeanDefinitionParser("redeliveryPolicyProfile", CamelRedeliveryPolicyFactoryBean.class, true, true); @@ -238,6 +239,7 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + doBeforeParse(element); super.doParse(element, builder); // Note: prefer to use doParse from parent and postProcess; however, parseUsingJaxb requires @@ -302,6 +304,33 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport { } } + protected class EndpointDefinitionParser extends BeanDefinitionParser { + + public EndpointDefinitionParser() { + super(CamelEndpointFactoryBean.class, false); + } + + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + doBeforeParse(element); + super.doParse(element, parserContext, builder); + + // now lets parse the routes with JAXB + Binder<Node> binder; + try { + binder = getJaxbContext().createBinder(); + } catch (JAXBException e) { + throw new BeanDefinitionStoreException("Failed to create the JAXB binder", e); + } + Object value = parseUsingJaxb(element, parserContext, binder); + + if (value instanceof CamelEndpointFactoryBean) { + CamelEndpointFactoryBean factoryBean = (CamelEndpointFactoryBean) value; + builder.addPropertyValue("properties", factoryBean.getProperties()); + } + } + } + protected class RestContextDefinitionParser extends BeanDefinitionParser { public RestContextDefinitionParser() { http://git-wip-us.apache.org/repos/asf/camel/blob/d1625272/components/camel-spring/src/test/java/org/apache/camel/spring/SpringEndpointPropertyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/SpringEndpointPropertyTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/SpringEndpointPropertyTest.java new file mode 100644 index 0000000..f2ae331 --- /dev/null +++ b/components/camel-spring/src/test/java/org/apache/camel/spring/SpringEndpointPropertyTest.java @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.spring; + +import org.apache.camel.component.seda.SedaEndpoint; +import org.springframework.context.support.AbstractXmlApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @version + */ +public class SpringEndpointPropertyTest extends SpringTestSupport { + + @Override + protected AbstractXmlApplicationContext createApplicationContext() { + return new ClassPathXmlApplicationContext("org/apache/camel/spring/SpringEndpointPropertyTest.xml"); + } + + public void testEndpointProperty() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(2); + template.sendBody("ref:foo", "Hello World"); + template.sendBody("ref:bar", "Bye World"); + assertMockEndpointsSatisfied(); + + SedaEndpoint foo = applicationContext.getBean("foo", SedaEndpoint.class); + assertNotNull(foo); + assertEquals(100, foo.getSize()); + assertEquals(5000, foo.getPollTimeout()); + assertEquals(true, foo.isBlockWhenFull()); + assertEquals("seda://foo?blockWhenFull=true&pollTimeout=5000&size=100", foo.getEndpointUri()); + + SedaEndpoint bar = applicationContext.getBean("bar", SedaEndpoint.class); + assertNotNull(bar); + assertEquals(200, bar.getSize()); + assertEquals("seda://bar?size=200", bar.getEndpointUri()); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/d1625272/components/camel-spring/src/test/resources/org/apache/camel/spring/SpringEndpointPropertyTest.xml ---------------------------------------------------------------------- diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/SpringEndpointPropertyTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/SpringEndpointPropertyTest.xml new file mode 100644 index 0000000..80c930c --- /dev/null +++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/SpringEndpointPropertyTest.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + "> + + <!-- outside camelContext --> + <endpoint id="bar" uri="seda:bar" camelContextId="myCamel" xmlns="http://camel.apache.org/schema/spring"> + <property key="size" value="200"/> + </endpoint> + + <camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring"> + + <!-- inside camelContext --> + <endpoint id="foo" uri="seda:foo"> + <property key="size" value="100"/> + <property key="pollTimeout" value="5000"/> + <property key="blockWhenFull" value="true"/> + </endpoint> + + <route> + <from uri="ref:foo"/> + <to uri="mock:result"/> + </route> + + <route> + <from uri="ref:bar"/> + <to uri="mock:result"/> + </route> + + </camelContext> + +</beans>
