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/07/06 10:22:58 UTC
[camel] 02/03: CAMEL-16757: camel-core - Global error handling,
interceptor in all DSL
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch CAMEL-16757
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 7793f70a8decdb58f9d620064fc7aebe289c8e08
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jul 6 12:17:36 2021 +0200
CAMEL-16757: camel-core - Global error handling, interceptor in all DSL
---
.../camel/model/RouteTemplatesDefinition.java | 3 +-
.../org/apache/camel/model/RoutesDefinition.java | 4 +-
.../apache/camel/model/rest/RestsDefinition.java | 3 +-
.../camel-yaml-dsl-deserializers/pom.xml | 1 +
.../dsl/yaml/deserializers/ModelDeserializers.java | 70 ----------------------
.../deserializers/ModelDeserializersResolver.java | 2 -
.../dsl/yaml/deserializers/CustomResolver.java | 3 +
.../RoutesConfigurationDefinitionDeserializer.java | 70 ++++++++++++++++++++++
.../src/generated/resources/camel-yaml-dsl.json | 66 ++++++++++----------
.../camel/dsl/yaml/YamlRoutesBuilderLoader.java | 12 ++++
.../camel/dsl/yaml/RoutesConfigurationTest.groovy | 61 +++++++++++++++++++
11 files changed, 189 insertions(+), 106 deletions(-)
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java
index c06a722..0beaddd 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplatesDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
import org.apache.camel.ErrorHandlerFactory;
import org.apache.camel.spi.Metadata;
@@ -36,7 +37,7 @@ import org.apache.camel.spi.Metadata;
@XmlRootElement(name = "routeTemplates")
@XmlAccessorType(XmlAccessType.FIELD)
public class RouteTemplatesDefinition extends OptionalIdentifiedDefinition<RouteTemplatesDefinition>
- implements RouteTemplateContainer {
+ implements RouteTemplateContainer, CamelContextAware {
@XmlElementRef
private List<RouteTemplateDefinition> routeTemplates = new ArrayList<>();
@XmlTransient
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
index 6f18e08..8b17df1 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
import org.apache.camel.Endpoint;
import org.apache.camel.ErrorHandlerFactory;
import org.apache.camel.builder.EndpointConsumerBuilder;
@@ -38,7 +39,8 @@ import org.apache.camel.spi.Metadata;
@Metadata(label = "configuration")
@XmlRootElement(name = "routes")
@XmlAccessorType(XmlAccessType.FIELD)
-public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinition> implements RouteContainer {
+public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinition>
+ implements RouteContainer, CamelContextAware {
@XmlElementRef
private List<RouteDefinition> routes = new ArrayList<>();
// TODO: Use RoutesConfigurationDefinition instead
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java
index 06f272e..3b8b150 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestsDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
import org.apache.camel.model.OptionalIdentifiedDefinition;
import org.apache.camel.spi.Metadata;
@@ -35,7 +36,7 @@ import org.apache.camel.spi.Metadata;
@Metadata(label = "rest")
@XmlRootElement(name = "rests")
@XmlAccessorType(XmlAccessType.FIELD)
-public class RestsDefinition extends OptionalIdentifiedDefinition<RestsDefinition> implements RestContainer {
+public class RestsDefinition extends OptionalIdentifiedDefinition<RestsDefinition> implements RestContainer, CamelContextAware {
@XmlElementRef
private List<RestDefinition> rests = new ArrayList<>();
@XmlTransient
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
index 3ccadeb..0403a1c 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
@@ -134,6 +134,7 @@
<bannedDefinition>org.apache.camel.model.RouteTemplateBeanDefinition</bannedDefinition>
<bannedDefinition>org.apache.camel.model.RoutesDefinition</bannedDefinition>
<bannedDefinition>org.apache.camel.model.RestsDefinition</bannedDefinition>
+ <bannedDefinition>org.apache.camel.model.RoutesConfigurationDefinition</bannedDefinition>
</bannedDefinitions>
<additionalDefinitions>
<!-- saga -->
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 666b14d..56ecd7b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -73,7 +73,6 @@ import org.apache.camel.model.RouteContextRefDefinition;
import org.apache.camel.model.RouteDefinition;
import org.apache.camel.model.RouteTemplateParameterDefinition;
import org.apache.camel.model.RouteTemplateScriptDefinition;
-import org.apache.camel.model.RoutesConfigurationDefinition;
import org.apache.camel.model.RoutingSlipDefinition;
import org.apache.camel.model.SagaActionUriDefinition;
import org.apache.camel.model.SagaDefinition;
@@ -12881,75 +12880,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
}
@YamlType(
- types = org.apache.camel.model.RoutesConfigurationDefinition.class,
- order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
- nodes = "routes-configuration",
- properties = {
- @YamlProperty(name = "intercept", type = "array:org.apache.camel.model.InterceptDefinition"),
- @YamlProperty(name = "intercept-from", type = "array:org.apache.camel.model.InterceptFromDefinition"),
- @YamlProperty(name = "intercept-send-to-endpoint", type = "array:org.apache.camel.model.InterceptSendToEndpointDefinition"),
- @YamlProperty(name = "on-completion", type = "array:org.apache.camel.model.OnCompletionDefinition"),
- @YamlProperty(name = "on-exception", type = "array:org.apache.camel.model.OnExceptionDefinition")
- }
- )
- public static class RoutesConfigurationDefinitionDeserializer extends YamlDeserializerBase<RoutesConfigurationDefinition> {
- public RoutesConfigurationDefinitionDeserializer() {
- super(RoutesConfigurationDefinition.class);
- }
-
- @Override
- protected RoutesConfigurationDefinition newInstance() {
- return new RoutesConfigurationDefinition();
- }
-
- @Override
- protected boolean setProperty(RoutesConfigurationDefinition target, String propertyKey,
- String propertyName, Node node) {
- switch(propertyKey) {
- case "intercept-from": {
- java.util.List<org.apache.camel.model.InterceptFromDefinition> val = asFlatList(node, org.apache.camel.model.InterceptFromDefinition.class);
- target.setInterceptFroms(val);
- break;
- }
- case "intercept-send-to-endpoint": {
- java.util.List<org.apache.camel.model.InterceptSendToEndpointDefinition> val = asFlatList(node, org.apache.camel.model.InterceptSendToEndpointDefinition.class);
- target.setInterceptSendTos(val);
- break;
- }
- case "intercept": {
- java.util.List<org.apache.camel.model.InterceptDefinition> val = asFlatList(node, org.apache.camel.model.InterceptDefinition.class);
- target.setIntercepts(val);
- break;
- }
- case "on-completion": {
- java.util.List<org.apache.camel.model.OnCompletionDefinition> val = asFlatList(node, org.apache.camel.model.OnCompletionDefinition.class);
- target.setOnCompletions(val);
- break;
- }
- case "on-exception": {
- java.util.List<org.apache.camel.model.OnExceptionDefinition> val = asFlatList(node, org.apache.camel.model.OnExceptionDefinition.class);
- target.setOnExceptions(val);
- break;
- }
- case "id": {
- String val = asText(node);
- target.setId(val);
- break;
- }
- case "description": {
- org.apache.camel.model.DescriptionDefinition val = asType(node, org.apache.camel.model.DescriptionDefinition.class);
- target.setDescription(val);
- break;
- }
- default: {
- return false;
- }
- }
- return true;
- }
- }
-
- @YamlType(
inline = true,
types = org.apache.camel.model.RoutingSlipDefinition.class,
order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
index f525761..965e470 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
@@ -304,8 +304,6 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve
case "org.apache.camel.model.RouteTemplateParameterDefinition": return new ModelDeserializers.RouteTemplateParameterDefinitionDeserializer();
case "template-script": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer();
case "org.apache.camel.model.RouteTemplateScriptDefinition": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer();
- case "routes-configuration": return new ModelDeserializers.RoutesConfigurationDefinitionDeserializer();
- case "org.apache.camel.model.RoutesConfigurationDefinition": return new ModelDeserializers.RoutesConfigurationDefinitionDeserializer();
case "routing-slip": return new ModelDeserializers.RoutingSlipDefinitionDeserializer();
case "org.apache.camel.model.RoutingSlipDefinition": return new ModelDeserializers.RoutingSlipDefinitionDeserializer();
case "rss": return new ModelDeserializers.RssDataFormatDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
index 08ac067..6dc4791 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
@@ -38,6 +38,9 @@ public class CustomResolver implements YamlDeserializerResolver {
case "route":
case "org.apache.camel.model.RouteDefinition":
return new RouteDefinitionDeserializer();
+ case "routes-configuration":
+ case "org.apache.camel.model.RoutesConfigurationDefinition":
+ return new RoutesConfigurationDefinitionDeserializer();
case "template":
case "org.apache.camel.model.RouteTemplateDefinition":
return new RouteTemplateDefinitionDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RoutesConfigurationDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RoutesConfigurationDefinitionDeserializer.java
new file mode 100644
index 0000000..314f8f2
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RoutesConfigurationDefinitionDeserializer.java
@@ -0,0 +1,70 @@
+package org.apache.camel.dsl.yaml.deserializers;
+
+import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerBase;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver;
+import org.apache.camel.model.OnExceptionDefinition;
+import org.apache.camel.model.RoutesConfigurationDefinition;
+import org.apache.camel.spi.CamelContextCustomizer;
+import org.apache.camel.spi.annotations.YamlProperty;
+import org.apache.camel.spi.annotations.YamlType;
+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 org.snakeyaml.engine.v2.nodes.ScalarNode;
+import org.snakeyaml.engine.v2.nodes.SequenceNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@YamlType(
+ inline = true,
+ types = org.apache.camel.model.RoutesConfigurationDefinition.class,
+ order = YamlDeserializerResolver.ORDER_DEFAULT,
+ nodes = "routes-configuration",
+ properties = {
+ @YamlProperty(name = "intercept", type = "array:org.apache.camel.model.InterceptDefinition"),
+ @YamlProperty(name = "intercept-from", type = "array:org.apache.camel.model.InterceptFromDefinition"),
+ @YamlProperty(name = "intercept-send-to-endpoint",
+ type = "array:org.apache.camel.model.InterceptSendToEndpointDefinition"),
+ @YamlProperty(name = "on-completion", type = "array:org.apache.camel.model.OnCompletionDefinition"),
+ @YamlProperty(name = "on-exception", type = "array:org.apache.camel.model.OnExceptionDefinition")
+ })
+public class RoutesConfigurationDefinitionDeserializer extends YamlDeserializerBase<RoutesConfigurationDefinition> {
+ public RoutesConfigurationDefinitionDeserializer() {
+ super(RoutesConfigurationDefinition.class);
+ }
+
+ @Override
+ protected RoutesConfigurationDefinition newInstance() {
+ return new RoutesConfigurationDefinition();
+ }
+
+ @Override
+ public Object construct(Node node) {
+ final RoutesConfigurationDefinition target = newInstance();
+
+ final YamlDeserializationContext dc = getDeserializationContext(node);
+ final SequenceNode sn = asSequenceNode(node);
+ for (Node item : sn.getValue()) {
+ final MappingNode bn = asMappingNode(item);
+ setDeserializationContext(item, dc);
+
+ for (NodeTuple tuple : bn.getValue()) {
+ final String key = asText(tuple.getKeyNode());
+ final Node val = tuple.getValueNode();
+ switch (key) {
+ case "on-exception":
+ setDeserializationContext(val, dc);
+ OnExceptionDefinition obj = asType(val, OnExceptionDefinition.class);
+ target.getOnExceptions().add(obj);
+ break;
+ }
+ }
+ }
+
+ return target;
+ }
+
+}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index 031f947..3708e2f 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -2151,39 +2151,43 @@
} ]
},
"org.apache.camel.model.RoutesConfigurationDefinition" : {
- "type" : "object",
- "properties" : {
- "intercept" : {
- "type" : "array",
- "items" : {
- "$ref" : "#/items/definitions/org.apache.camel.model.InterceptDefinition"
- }
- },
- "intercept-from" : {
- "type" : "array",
- "items" : {
- "$ref" : "#/items/definitions/org.apache.camel.model.InterceptFromDefinition"
- }
- },
- "intercept-send-to-endpoint" : {
- "type" : "array",
- "items" : {
- "$ref" : "#/items/definitions/org.apache.camel.model.InterceptSendToEndpointDefinition"
- }
- },
- "on-completion" : {
- "type" : "array",
- "items" : {
- "$ref" : "#/items/definitions/org.apache.camel.model.OnCompletionDefinition"
- }
- },
- "on-exception" : {
- "type" : "array",
- "items" : {
- "$ref" : "#/items/definitions/org.apache.camel.model.OnExceptionDefinition"
+ "oneOf" : [ {
+ "type" : "string"
+ }, {
+ "type" : "object",
+ "properties" : {
+ "intercept" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/items/definitions/org.apache.camel.model.InterceptDefinition"
+ }
+ },
+ "intercept-from" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/items/definitions/org.apache.camel.model.InterceptFromDefinition"
+ }
+ },
+ "intercept-send-to-endpoint" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/items/definitions/org.apache.camel.model.InterceptSendToEndpointDefinition"
+ }
+ },
+ "on-completion" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/items/definitions/org.apache.camel.model.OnCompletionDefinition"
+ }
+ },
+ "on-exception" : {
+ "type" : "array",
+ "items" : {
+ "$ref" : "#/items/definitions/org.apache.camel.model.OnExceptionDefinition"
+ }
}
}
- }
+ } ]
},
"org.apache.camel.model.RoutingSlipDefinition" : {
"oneOf" : [ {
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 d16728d..15a4057 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,13 +16,16 @@
*/
package org.apache.camel.dsl.yaml;
+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.dsl.yaml.deserializers.OutputAwareFromDefinition;
+import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.OnExceptionDefinition;
import org.apache.camel.model.RouteDefinition;
import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.model.RoutesConfigurationDefinition;
import org.apache.camel.model.rest.RestConfigurationDefinition;
import org.apache.camel.model.rest.RestDefinition;
import org.apache.camel.model.rest.VerbDefinition;
@@ -52,16 +55,23 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
RouteDefinition route = new RouteDefinition();
route.setInput(((OutputAwareFromDefinition) item).getDelegate());
route.setOutputs(((OutputAwareFromDefinition) item).getOutputs());
+
+ CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().route(route);
} else if (item instanceof RouteDefinition) {
+ CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().route((RouteDefinition) item);
} else if (item instanceof CamelContextCustomizer) {
((CamelContextCustomizer) item).configure(getCamelContext());
+ } else if (item instanceof RoutesConfigurationDefinition) {
+ getContext().adapt(ModelCamelContext.class)
+ .addRoutesConfiguration((RoutesConfigurationDefinition) item);
} else if (item instanceof OnExceptionDefinition) {
if (!getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException(
"onException must be defined before any routes in the RouteBuilder");
}
+ CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
getRouteCollection().getOnExceptions().add((OnExceptionDefinition) item);
} else if (item instanceof ErrorHandlerBuilder) {
if (!getRouteCollection().getRoutes().isEmpty()) {
@@ -70,12 +80,14 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
}
errorHandler((ErrorHandlerBuilder) item);
} else if (item instanceof RouteTemplateDefinition) {
+ CamelContextAware.trySetCamelContext(getRouteTemplateCollection(), getCamelContext());
getRouteTemplateCollection().routeTemplate((RouteTemplateDefinition) item);
} else if (item instanceof RestDefinition) {
RestDefinition definition = (RestDefinition) item;
for (VerbDefinition verb : definition.getVerbs()) {
verb.setRest(definition);
}
+ CamelContextAware.trySetCamelContext(getRestCollection(), getCamelContext());
getRestCollection().rest(definition);
} else if (item instanceof RestConfigurationDefinition) {
((RestConfigurationDefinition) item).asRestConfiguration(
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesConfigurationTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesConfigurationTest.groovy
new file mode 100644
index 0000000..427748a
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesConfigurationTest.groovy
@@ -0,0 +1,61 @@
+/*
+ * 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.component.mock.MockEndpoint
+import org.apache.camel.dsl.yaml.support.YamlTestSupport
+import org.apache.camel.dsl.yaml.support.model.MyException
+import org.apache.camel.dsl.yaml.support.model.MyFailingProcessor
+
+class RoutesConfigurationTest extends YamlTestSupport {
+ def "routes-configuration"() {
+ setup:
+ loadRoutes """
+ - beans:
+ - name: myFailingProcessor
+ type: ${MyFailingProcessor.name}
+ - routes-configuration:
+ - on-exception:
+ handled:
+ constant: "true"
+ exception:
+ - ${MyException.name}
+ steps:
+ - transform:
+ constant: "Sorry"
+ - to: "mock:on-exception"
+ - from:
+ uri: "direct:start"
+ steps:
+ - process:
+ ref: "myFailingProcessor"
+ """
+
+ withMock('mock:on-exception') {
+ expectedBodiesReceived 'Sorry'
+ }
+
+ when:
+ context.start()
+
+ withTemplate {
+ to('direct:start').withBody('hello').send()
+ }
+ then:
+ MockEndpoint.assertIsSatisfied(context)
+ }
+}