This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit da71cccd1648276e6e0d995f68e3366b751ff0f1 Author: Claus Ibsen <[email protected]> AuthorDate: Sat Dec 4 10:52:32 2021 +0100 CAMEL-17272: camel-spring-xml - Classic Spring XML add support for external route configuration XML files --- .../org/apache/camel/spring/xml/jaxb.index | 1 + .../spring/xml/routeConfigurationContext.json | 17 ++++++ .../CamelRouteConfigurationContextFactoryBean.java | 67 ++++++++++++++++++++++ .../spring/xml/handler/CamelNamespaceHandler.java | 33 +++++++++++ 4 files changed, 118 insertions(+) diff --git a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index index f7926d6..ee308b7 100644 --- a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index +++ b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index @@ -7,6 +7,7 @@ CamelFluentProducerTemplateFactoryBean CamelProducerTemplateFactoryBean CamelRedeliveryPolicyFactoryBean CamelRestContextFactoryBean +CamelRouteConfigurationContextFactoryBean CamelRouteContextFactoryBean CamelRouteTemplateContextFactoryBean CamelThreadPoolFactoryBean diff --git a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/routeConfigurationContext.json b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/routeConfigurationContext.json new file mode 100644 index 0000000..a858ab4 --- /dev/null +++ b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/routeConfigurationContext.json @@ -0,0 +1,17 @@ +{ + "model": { + "kind": "model", + "name": "routeConfigurationContext", + "title": "Route Configuration Context", + "description": "Configuration of route configurations using XML", + "deprecated": false, + "label": "spring,configuration,routing", + "javaType": "org.apache.camel.spring.xml.CamelRouteConfigurationContextFactoryBean", + "input": false, + "output": false + }, + "properties": { + "routeConfiguration": { "kind": "element", "displayName": "Route Configuration", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.RouteConfigurationDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Route Configurations" }, + "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" } + } +} diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelRouteConfigurationContextFactoryBean.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelRouteConfigurationContextFactoryBean.java new file mode 100644 index 0000000..0e10ef1 --- /dev/null +++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelRouteConfigurationContextFactoryBean.java @@ -0,0 +1,67 @@ +/* + * 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.xml; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.camel.model.IdentifiedType; +import org.apache.camel.model.RouteConfigurationDefinition; +import org.apache.camel.spi.Metadata; +import org.springframework.beans.factory.FactoryBean; + +/** + * Configuration of route configurations using XML + */ +@Metadata(label = "spring,configuration,routing") +@XmlRootElement(name = "routeConfigurationContext") +@XmlAccessorType(XmlAccessType.FIELD) +public class CamelRouteConfigurationContextFactoryBean extends IdentifiedType + implements FactoryBean<List<RouteConfigurationDefinition>> { + + @XmlElement(name = "routeConfiguration", required = true) + @Metadata(description = "Route Configurations") + private List<RouteConfigurationDefinition> routeConfigurations = new ArrayList<>(); + + @Override + public List<RouteConfigurationDefinition> getObject() throws Exception { + return routeConfigurations; + } + + @Override + public Class<?> getObjectType() { + return routeConfigurations.getClass(); + } + + @Override + public boolean isSingleton() { + return true; + } + + public List<RouteConfigurationDefinition> getRouteConfigurations() { + return routeConfigurations; + } + + public void setRouteConfigurations(List<RouteConfigurationDefinition> routeConfigurations) { + this.routeConfigurations = routeConfigurations; + } +} diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java index fed1bba..d525e8d 100644 --- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java +++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java @@ -47,6 +47,7 @@ import org.apache.camel.spring.xml.CamelFluentProducerTemplateFactoryBean; import org.apache.camel.spring.xml.CamelProducerTemplateFactoryBean; import org.apache.camel.spring.xml.CamelRedeliveryPolicyFactoryBean; import org.apache.camel.spring.xml.CamelRestContextFactoryBean; +import org.apache.camel.spring.xml.CamelRouteConfigurationContextFactoryBean; import org.apache.camel.spring.xml.CamelRouteContextFactoryBean; import org.apache.camel.spring.xml.CamelRouteTemplateContextFactoryBean; import org.apache.camel.spring.xml.CamelThreadPoolFactoryBean; @@ -126,6 +127,8 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { + // register routeContext parser + registerParser("routeConfigurationContext", new RouteConfigurationContextDefinitionParser()); // register routeTemplateContext parser registerParser("routeTemplateContext", new RouteTemplateContextDefinitionParser()); // register restContext parser @@ -263,6 +266,36 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport { } } + protected class RouteConfigurationContextDefinitionParser extends BeanDefinitionParser { + + public RouteConfigurationContextDefinitionParser() { + super(CamelRouteConfigurationContextFactoryBean.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 CamelRouteConfigurationContextFactoryBean) { + CamelRouteConfigurationContextFactoryBean factoryBean = (CamelRouteConfigurationContextFactoryBean) value; + builder.addPropertyValue("routeConfigurations", factoryBean.getRouteConfigurations()); + } + + // lets inject the namespaces into any namespace aware POJOs + injectNamespaces(element, binder); + } + } + protected class RouteTemplateContextDefinitionParser extends BeanDefinitionParser { public RouteTemplateContextDefinitionParser() {
