You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/10/30 12:59:09 UTC
[camel] 02/02: CAMEL-17150: camel-yaml-dsl - Should be able to load
camel-k yaml file
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 <cl...@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;
+ }
+
}