You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/07/03 11:11:20 UTC

[camel-karaf] branch master updated: CAMEL-14963: Route Template

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git


The following commit(s) were added to refs/heads/master by this push:
     new fcf5fe1  CAMEL-14963: Route Template
fcf5fe1 is described below

commit fcf5fe12e505573fecdb5f822ed42fc792c004e6
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Jul 3 13:11:06 2020 +0200

    CAMEL-14963: Route Template
---
 .../org/apache/camel/blueprint/jaxb.index          |  1 +
 .../camel/blueprint/CamelContextFactoryBean.java   | 25 +++++++++++
 .../CamelRouteTemplateContextFactoryBean.java      | 40 ++++++++++++++++++
 .../blueprint/handler/CamelNamespaceHandler.java   | 48 ++++++++++++++++++++++
 4 files changed, 114 insertions(+)

diff --git a/components/camel-blueprint/src/generated/resources/org/apache/camel/blueprint/jaxb.index b/components/camel-blueprint/src/generated/resources/org/apache/camel/blueprint/jaxb.index
index 3ab0ca9..bab0bd6 100644
--- a/components/camel-blueprint/src/generated/resources/org/apache/camel/blueprint/jaxb.index
+++ b/components/camel-blueprint/src/generated/resources/org/apache/camel/blueprint/jaxb.index
@@ -9,5 +9,6 @@ CamelProxyFactoryBean
 CamelRedeliveryPolicyFactoryBean
 CamelRestContextFactoryBean
 CamelRouteContextFactoryBean
+CamelRouteTemplateContextFactoryBean
 CamelThreadPoolFactoryBean
 ErrorHandlerType
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
index 4ae7856..8a94a81 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
@@ -63,6 +63,8 @@ import org.apache.camel.model.RestContextRefDefinition;
 import org.apache.camel.model.RouteBuilderDefinition;
 import org.apache.camel.model.RouteContextRefDefinition;
 import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.model.RouteTemplateContextRefDefinition;
+import org.apache.camel.model.RouteTemplateDefinition;
 import org.apache.camel.model.ThreadPoolProfileDefinition;
 import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
 import org.apache.camel.model.dataformat.DataFormatsDefinition;
@@ -192,6 +194,8 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu
     private FaultToleranceConfigurationDefinition defaultFaultToleranceConfiguration;
     @XmlElement(name = "faultToleranceConfiguration", type = FaultToleranceConfigurationDefinition.class)
     private List<FaultToleranceConfigurationDefinition> faultToleranceConfigurations;
+    @XmlElement(name = "routeTemplateContextRef")
+    private List<RouteTemplateContextRefDefinition> routeTemplateRefs = new ArrayList<>();
     @XmlElement(name = "routeBuilder")
     private List<RouteBuilderDefinition> builderRefs = new ArrayList<>();
     @XmlElement(name = "routeContextRef")
@@ -226,6 +230,8 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu
     private RestConfigurationDefinition restConfiguration;
     @XmlElement(name = "rest")
     private List<RestDefinition> rests = new ArrayList<>();
+    @XmlElement(name = "routeTemplate")
+    private List<RouteTemplateDefinition> routeTemplates = new ArrayList<>();
     @XmlElement(name = "route")
     private List<RouteDefinition> routes = new ArrayList<>();
     @XmlTransient
@@ -565,6 +571,15 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu
     }
 
     @Override
+    public List<RouteTemplateContextRefDefinition> getRouteTemplateRefs() {
+        return routeTemplateRefs;
+    }
+
+    public void setRouteTemplateRefs(List<RouteTemplateContextRefDefinition> routeTemplateRefs) {
+        this.routeTemplateRefs = routeTemplateRefs;
+    }
+
+    @Override
     public List<RouteContextRefDefinition> getRouteRefs() {
         return routeRefs;
     }
@@ -950,6 +965,16 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu
     }
 
     @Override
+    public List<RouteTemplateDefinition> getRouteTemplates() {
+        return routeTemplates;
+    }
+
+    @Override
+    public void setRouteTemplates(List<RouteTemplateDefinition> routeTemplates) {
+        this.routeTemplates = routeTemplates;
+    }
+
+    @Override
     public List<RouteDefinition> getRoutes() {
         return routes;
     }
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelRouteTemplateContextFactoryBean.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelRouteTemplateContextFactoryBean.java
new file mode 100644
index 0000000..e573625
--- /dev/null
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelRouteTemplateContextFactoryBean.java
@@ -0,0 +1,40 @@
+/*
+ * 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.blueprint;
+
+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 java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.model.IdentifiedType;
+import org.apache.camel.model.RouteTemplateDefinition;
+
+@XmlRootElement(name = "routeTemplateContext")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class CamelRouteTemplateContextFactoryBean extends IdentifiedType {
+
+    @XmlElement(name = "routeTemplate", required = true)
+    private List<RouteTemplateDefinition> routeTemplates = new ArrayList<>();
+
+    public List<RouteTemplateDefinition> getRouteTemplates() throws Exception {
+        return routeTemplates;
+    }
+
+}
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
index 3d71208..dfec0be 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
@@ -63,6 +63,7 @@ import org.apache.camel.blueprint.CamelContextFactoryBean;
 import org.apache.camel.blueprint.CamelEndpointFactoryBean;
 import org.apache.camel.blueprint.CamelRestContextFactoryBean;
 import org.apache.camel.blueprint.CamelRouteContextFactoryBean;
+import org.apache.camel.blueprint.CamelRouteTemplateContextFactoryBean;
 import org.apache.camel.core.xml.AbstractCamelFactoryBean;
 import org.apache.camel.impl.engine.CamelPostProcessorHelper;
 import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy;
@@ -115,6 +116,7 @@ import org.osgi.service.blueprint.reflect.RefMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 import static org.osgi.service.blueprint.reflect.ComponentMetadata.ACTIVATION_LAZY;
 import static org.osgi.service.blueprint.reflect.ServiceReferenceMetadata.AVAILABILITY_MANDATORY;
 import static org.osgi.service.blueprint.reflect.ServiceReferenceMetadata.AVAILABILITY_OPTIONAL;
@@ -129,6 +131,7 @@ public class CamelNamespaceHandler implements NamespaceHandler {
 
     private static final String CAMEL_CONTEXT = "camelContext";
     private static final String ROUTE_CONTEXT = "routeContext";
+    private static final String ROUTE_TEMPLATE_CONTEXT = "routeTemplateContext";
     private static final String REST_CONTEXT = "restContext";
     private static final String ENDPOINT = "endpoint";
     private static final String KEY_STORE_PARAMETERS = "keyStoreParameters";
@@ -206,6 +209,9 @@ public class CamelNamespaceHandler implements NamespaceHandler {
             if (element.getLocalName().equals(ROUTE_CONTEXT)) {
                 return parseRouteContextNode(element, context);
             }
+            if (element.getLocalName().equals(ROUTE_TEMPLATE_CONTEXT)) {
+                return parseRouteContextNode(element, context);
+            }
             if (element.getLocalName().equals(REST_CONTEXT)) {
                 return parseRestContextNode(element, context);
             }
@@ -393,6 +399,48 @@ public class CamelNamespaceHandler implements NamespaceHandler {
         return ctx;
     }
 
+    private Metadata parseRouteTemplateContextNode(Element element, ParserContext context) {
+        LOG.trace("Parsing RouteTemplateContext {}", element);
+        // now parse the routes with JAXB
+        Binder<Node> binder;
+        try {
+            binder = getJaxbContext().createBinder();
+        } catch (JAXBException e) {
+
+            throw new ComponentDefinitionException("Failed to create the JAXB binder : " + e, e);
+        }
+        Object value = parseUsingJaxb(element, context, binder);
+        if (!(value instanceof CamelRouteTemplateContextFactoryBean)) {
+            throw new ComponentDefinitionException("Expected an instance of " + CamelRouteTemplateContextFactoryBean.class);
+        }
+
+        CamelRouteTemplateContextFactoryBean rcfb = (CamelRouteTemplateContextFactoryBean) value;
+        String id = rcfb.getId();
+
+        MutablePassThroughMetadata factory = context.createMetadata(MutablePassThroughMetadata.class);
+        factory.setId(".camelBlueprint.passThrough." + id);
+        factory.setObject(new PassThroughCallable<Object>(rcfb));
+
+        MutableBeanMetadata factory2 = context.createMetadata(MutableBeanMetadata.class);
+        factory2.setId(".camelBlueprint.factory." + id);
+        factory2.setFactoryComponent(factory);
+        factory2.setFactoryMethod("call");
+
+        MutableBeanMetadata ctx = context.createMetadata(MutableBeanMetadata.class);
+        ctx.setId(id);
+        ctx.setRuntimeClass(List.class);
+        ctx.setFactoryComponent(factory2);
+        ctx.setFactoryMethod("getRouteTemplates");
+        // must be lazy as we want CamelContext to be activated first
+        ctx.setActivation(ACTIVATION_LAZY);
+
+        // lets inject the namespaces into any namespace aware POJOs
+        injectNamespaces(element, binder);
+
+        LOG.trace("Parsing RouteTemplateContext {} done, returning {}", element, ctx);
+        return ctx;
+    }
+
     private Metadata parseRestContextNode(Element element, ParserContext context) {
         LOG.trace("Parsing RestContext {}", element);
         // now parse the rests with JAXB