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'
+    }
+
+}

Reply via email to