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 ec6a3a3424bb0a30180948bc8a7cbc3e1bf9fdd3
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sat Oct 30 14:56:11 2021 +0200

    CAMEL-17150: camel-yaml-dsl - Should be able to load camel-k yaml file
---
 .../camel/dsl/yaml/KameletRoutesBuilderLoader.java |  4 ++
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    | 53 +++++++++++++++++++++-
 2 files changed, 55 insertions(+), 2 deletions(-)

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 c8ed68d..1f770ca 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
@@ -47,6 +47,10 @@ public class KameletRoutesBuilderLoader extends 
YamlRoutesBuilderLoaderSupport {
     protected RouteBuilder builder(Node node) {
         Node template = nodeAt(node, "/spec/template");
         if (template == null) {
+            // fallback till flows get removed
+            template = nodeAt(node, "/spec/flows");
+        }
+        if (template == null) {
             // fallback till flow get removed
             template = nodeAt(node, "/spec/flow");
         }
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 50348b5..30cd3fa 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -16,11 +16,15 @@
  */
 package org.apache.camel.dsl.yaml;
 
+import java.util.List;
+import java.util.Objects;
+
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.builder.RouteConfigurationBuilder;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
 import org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RouteConfigurationDefinition;
@@ -31,9 +35,14 @@ import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.VerbDefinition;
 import org.apache.camel.spi.CamelContextCustomizer;
 import org.apache.camel.spi.annotations.RoutesLoader;
+import org.snakeyaml.engine.v2.nodes.MappingNode;
 import org.snakeyaml.engine.v2.nodes.Node;
+import org.snakeyaml.engine.v2.nodes.NodeTuple;
+import org.snakeyaml.engine.v2.nodes.NodeType;
 
 import static 
org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asSequenceNode;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asText;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.nodeAt;
 
 @ManagedResource(description = "Managed YAML RoutesBuilderLoader")
 @RoutesLoader(YamlRoutesBuilderLoader.EXTENSION)
@@ -48,7 +57,9 @@ public class YamlRoutesBuilderLoader extends 
YamlRoutesBuilderLoaderSupport {
         return new RouteConfigurationBuilder() {
             @Override
             public void configure() throws Exception {
-                for (Node node : asSequenceNode(root).getValue()) {
+                Node target = preConfigureNode(root);
+
+                for (Node node : asSequenceNode(target).getValue()) {
                     Object item = 
getDeserializationContext().mandatoryResolve(node).construct(node);
 
                     if (item instanceof OutputAwareFromDefinition) {
@@ -96,7 +107,9 @@ public class YamlRoutesBuilderLoader extends 
YamlRoutesBuilderLoaderSupport {
 
             @Override
             public void configuration() throws Exception {
-                for (Node node : asSequenceNode(root).getValue()) {
+                Node target = preConfigureNode(root);
+
+                for (Node node : asSequenceNode(target).getValue()) {
                     Object item = 
getDeserializationContext().mandatoryResolve(node).construct(node);
                     if (item instanceof RouteConfigurationDefinition) {
                         
CamelContextAware.trySetCamelContext(getRouteConfigurationCollection(), 
getCamelContext());
@@ -107,4 +120,40 @@ public class YamlRoutesBuilderLoader extends 
YamlRoutesBuilderLoaderSupport {
         };
     }
 
+    private static Node preConfigureNode(Node root) {
+        Node target = root;
+
+        // check if the yaml is a camel-k yaml with embedded routes (called 
flow(s))
+        if (Objects.equals(root.getNodeType(), NodeType.MAPPING)) {
+            final MappingNode mn = YamlDeserializerSupport.asMappingNode(root);
+            boolean camelk = anyTupleMatches(mn.getValue(), "apiVersion", 
"camel.apache.org/v1") &&
+                    anyTupleMatches(mn.getValue(), "kind", "Integration");
+            if (camelk) {
+                Node routes = nodeAt(root, "/spec/flows");
+                if (routes == null) {
+                    routes = nodeAt(root, "/spec/flow");
+                }
+                if (routes != null) {
+                    target = routes;
+                }
+            }
+        }
+
+        return target;
+    }
+
+    private static boolean anyTupleMatches(List<NodeTuple> list, String aKey, 
String aValue) {
+        for (NodeTuple tuple : list) {
+            final String key = asText(tuple.getKeyNode());
+            final Node val = tuple.getValueNode();
+            if (Objects.equals(aKey, key) && 
NodeType.SCALAR.equals(val.getNodeType())) {
+                String value = asText(tuple.getValueNode());
+                if (Objects.equals(aValue, value)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
 }

Reply via email to