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
The following commit(s) were added to refs/heads/main by this push: new 848ebe9 CAMEL-17642: camel-yaml-dsl/camel-jbang - Add support for spec/dependencies to detect and auto download JARs 848ebe9 is described below commit 848ebe9fa4e6f402411b64c27237c2f37ddbca28 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Feb 13 13:37:10 2022 +0100 CAMEL-17642: camel-yaml-dsl/camel-jbang - Add support for spec/dependencies to detect and auto download JARs --- .../camel/dsl/yaml/KameletRoutesBuilderLoader.java | 36 +++++++++++ .../dsl/yaml/KameletLoaderDependenciesTest.groovy | 73 ++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java index 1c53bd1..e9b1ceb 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/KameletRoutesBuilderLoader.java @@ -18,13 +18,18 @@ package org.apache.camel.dsl.yaml; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Set; +import org.apache.camel.CamelContext; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.dsl.yaml.common.YamlDeserializationContext; +import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport; import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplateParameterDefinition; +import org.apache.camel.spi.CamelContextCustomizer; +import org.apache.camel.spi.DependencyStrategy; import org.apache.camel.spi.Resource; import org.apache.camel.spi.annotations.RoutesLoader; import org.snakeyaml.engine.v2.nodes.Node; @@ -91,11 +96,42 @@ public class KameletRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { } } + // if there are dependencies then we should include them + Node deps = nodeAt(root, "/spec/dependencies"); + CamelContextCustomizer customizer = null; + if (deps != null) { + customizer = preConfigureDependencies(deps); + } + final CamelContextCustomizer dependencies = customizer; + return new RouteBuilder() { @Override public void configure() throws Exception { + if (dependencies != null) { + dependencies.configure(getCamelContext()); + } getRouteTemplateCollection().routeTemplate(rtd); } }; } + + private CamelContextCustomizer preConfigureDependencies(Node node) { + final List<String> dep = YamlDeserializerSupport.asStringList(node); + return new CamelContextCustomizer() { + @Override + public void configure(CamelContext camelContext) { + // notify the listeners about each dependency detected + for (DependencyStrategy ds : camelContext.getRegistry().findByType(DependencyStrategy.class)) { + for (String d : dep) { + try { + ds.onDependency(d); + } catch (Exception e) { + // ignore + } + } + } + } + }; + } + } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletLoaderDependenciesTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletLoaderDependenciesTest.groovy new file mode 100644 index 0000000..e010761 --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletLoaderDependenciesTest.groovy @@ -0,0 +1,73 @@ +/* + * 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.dsl.yaml + +import org.apache.camel.dsl.yaml.support.YamlTestSupport +import org.apache.camel.spi.DependencyStrategy + +class KameletLoaderDependenciesTest extends YamlTestSupport { + + var List<String> deps = new ArrayList<>() + + @Override + def doSetup() { + context.registry.bind("myDep", new DependencyStrategy() { + @Override + void onDependency(String dependency) { + deps.add(dependency); + } + }) + + context.start() + } + + def "kamelet dependencies"() { + when: + loadKamelets(''' + apiVersion: camel.apache.org/v1alpha1 + kind: Kamelet + metadata: + name: myDependency + spec: + definition: + properties: + payload: + title: The Payload + type: string + dependencies: + - "camel:jackson" + - "camel:kamelet" + - "camel:sql" + - "mvn:org.apache.commons:commons-dbcp2:2.9.0" + template: + from: + uri: "kamelet:source" + steps: + - set-body: + constant: "{{payload}}" + ''') + then: + context.routeTemplateDefinitions.size() == 1 + + deps.size() == 4 + deps[0] == 'camel:jackson' + deps[1] == 'camel:kamelet' + deps[2] == 'camel:sql' + deps[3] == 'mvn:org.apache.commons:commons-dbcp2:2.9.0' + } + +}