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 a7d7361343050b07194af07a229ed99408284007
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jun 18 20:29:26 2021 +0200

    CAMEL-16650: camel-kamelet - Add option to configure location for kamelet 
template to load from resource.
---
 .../camel/spi/RouteTemplateParameterSource.java    |  4 +-
 .../java/org/apache/camel/impl/DefaultModel.java   | 53 ++++++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/RouteTemplateParameterSource.java
 
b/core/camel-api/src/main/java/org/apache/camel/spi/RouteTemplateParameterSource.java
index 240ab09..881b67c 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/RouteTemplateParameterSource.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/RouteTemplateParameterSource.java
@@ -26,6 +26,8 @@ public interface RouteTemplateParameterSource {
 
     String TEMPLATE_ID = "templateId";
 
+    String LOCATION = "location";
+
     /**
      * The parameters for the given route
      *
@@ -35,7 +37,7 @@ public interface RouteTemplateParameterSource {
     Map<String, Object> parameters(String routeId);
 
     /**
-     * Gets the route ids as a set.
+     * Gets the route id's as a set.
      */
     Set<String> routeIds();
 
diff --git 
a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java 
b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
index 74421ad..e62511d 100644
--- 
a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
+++ 
b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -60,11 +60,14 @@ import org.apache.camel.spi.ExchangeFactory;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.ModelReifierFactory;
 import org.apache.camel.spi.PropertyConfigurer;
+import org.apache.camel.spi.Resource;
+import org.apache.camel.spi.RouteTemplateParameterSource;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.support.PropertyBindingSupport;
 import org.apache.camel.support.ScriptHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.AntPathMatcher;
+import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.function.Suppliers;
 
@@ -259,6 +262,20 @@ public class DefaultModel implements Model {
             }
         }
         if (target == null) {
+            // if the route template has a location parameter, then try to 
load route templates from the location
+            // and look up again
+            Object location = 
routeTemplateContext.getParameters().get(RouteTemplateParameterSource.LOCATION);
+            if (location != null) {
+                loadRouteTemplateFromLocation(routeTemplateId, 
location.toString());
+            }
+            for (RouteTemplateDefinition def : routeTemplateDefinitions) {
+                if (routeTemplateId.equals(def.getId())) {
+                    target = def;
+                    break;
+                }
+            }
+        }
+        if (target == null) {
             throw new IllegalArgumentException("Cannot find RouteTemplate with 
id " + routeTemplateId);
         }
 
@@ -343,6 +360,42 @@ public class DefaultModel implements Model {
         return def.getId();
     }
 
+    private void loadRouteTemplateFromLocation(String templateId, String 
location) throws Exception {
+        ExtendedCamelContext ecc = 
getCamelContext().adapt(ExtendedCamelContext.class);
+        boolean found = false;
+        for (String path : location.split(",")) {
+            String name = path;
+            Resource res = null;
+            // first try resource as-is if the path has an extension
+            String ext = FileUtil.onlyExt(path);
+            if (ext != null) {
+                res = ecc.getResourceLoader().resolveResource(name);
+            }
+            if (res == null || !res.exists()) {
+                if (!path.endsWith("/")) {
+                    path += "/";
+                }
+                name = path + templateId + ".kamelet.yaml";
+                res = ecc.getResourceLoader().resolveResource(name);
+            }
+            if (res.exists()) {
+                ecc.getRoutesLoader().loadRoutes(res);
+                found = true;
+                break;
+            }
+        }
+        if (!found) {
+            // fallback to old behaviour
+            String path = location;
+            if (!path.endsWith("/")) {
+                path += "/";
+            }
+            String target = path + templateId + ".kamelet.yaml";
+            ecc.getRoutesLoader().loadRoutes(
+                    ecc.getResourceLoader().resolveResource(target));
+        }
+    }
+
     private void addTemplateBeans(RouteTemplateContext routeTemplateContext, 
RouteTemplateDefinition target) throws Exception {
         for (RouteTemplateBeanDefinition b : target.getTemplateBeans()) {
             final Map<String, Object> props = new HashMap<>();

Reply via email to