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<>();
