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 f4d48681aa2ed2842b4d22eb11637db4acd93e49 Author: Claus Ibsen <[email protected]> AuthorDate: Tue Jul 6 10:46:54 2021 +0200 CAMEL-16757: camel-core - Global error handling, interceptor in all DSL --- .../org/apache/camel/catalog/models.properties | 1 + .../camel/catalog/models/routesConfiguration.json | 17 +++ .../apache/camel/catalog/schemas/camel-spring.xsd | 25 ++++ .../org/apache/camel/impl/DefaultCamelContext.java | 22 ++++ .../java/org/apache/camel/impl/DefaultModel.java | 23 ++++ .../camel/impl/lw/LightweightCamelContext.java | 16 +++ .../services/org/apache/camel/model.properties | 1 + .../resources/org/apache/camel/model/jaxb.index | 1 + .../apache/camel/model/routesConfiguration.json | 17 +++ .../org/apache/camel/builder/RouteBuilder.java | 26 +++- .../main/java/org/apache/camel/model/Model.java | 7 ++ .../camel/model/RoutesConfigurationDefinition.java | 138 +++++++++++++++++++++ .../org/apache/camel/model/RoutesDefinition.java | 24 +++- ...outesConfigurationMultipleRouteBuilderTest.java | 65 ++++++++++ .../camel/model/RoutesConfigurationTest.java | 51 ++++++++ .../java/org/apache/camel/xml/in/ModelParser.java | 14 +++ .../dsl/yaml/deserializers/ModelDeserializers.java | 70 +++++++++++ .../deserializers/ModelDeserializersResolver.java | 2 + .../src/generated/resources/camel-yaml-dsl.json | 35 ++++++ 19 files changed, 551 insertions(+), 4 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties index d0d5f2f..400daee 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties @@ -152,6 +152,7 @@ routeTemplateContext routeTemplateContextRef routeTemplates routes +routesConfiguration routingSlip rss saga diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routesConfiguration.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routesConfiguration.json new file mode 100644 index 0000000..c4a5307 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routesConfiguration.json @@ -0,0 +1,17 @@ +{ + "model": { + "kind": "model", + "name": "routesConfiguration", + "title": "Routes Configuration", + "description": "Global configuration for Camel routes", + "deprecated": false, + "label": "configuration", + "javaType": "org.apache.camel.model.RoutesConfigurationDefinition", + "input": false, + "output": false + }, + "properties": { + "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }, + "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } + } +} diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd index b4767ff..d700d96 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd @@ -1329,6 +1329,14 @@ A series of Camel routes </xs:annotation> </xs:element> + <xs:element name="routesConfiguration" type="tns:routesConfigurationDefinition"> + <xs:annotation> + <xs:documentation xml:lang="en"><![CDATA[ +Global configuration for Camel routes + ]]></xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="routingSlip" type="tns:routingSlipDefinition"> <xs:annotation> <xs:documentation xml:lang="en"><![CDATA[ @@ -10837,6 +10845,23 @@ Description of the parameter. </xs:complexContent> </xs:complexType> + <xs:complexType name="routesConfigurationDefinition"> + <xs:complexContent> + <xs:extension base="tns:optionalIdentifiedDefinition"> + <xs:sequence> + <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:onException"/> + <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:onCompletion"/> + <xs:choice maxOccurs="unbounded" minOccurs="0"> + <xs:element ref="tns:intercept"/> + <xs:element ref="tns:interceptFrom"/> + </xs:choice> + <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:interceptFrom"/> + <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:interceptSendToEndpoint"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="routesDefinition"> <xs:complexContent> <xs:extension base="tns:optionalIdentifiedDefinition"> diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java index 8544303..896a753 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java @@ -58,6 +58,7 @@ import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.RouteDefinitionHelper; import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplatesDefinition; +import org.apache.camel.model.RoutesConfigurationDefinition; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.language.ExpressionDefinition; @@ -287,6 +288,27 @@ public class DefaultCamelContext extends SimpleCamelContext implements ModelCame } @Override + public void addRoutesConfiguration(RoutesConfigurationDefinition routesConfiguration) { + if (model == null && isLightweight()) { + throw new IllegalStateException("Access to model not supported in lightweight mode"); + } + model.addRoutesConfiguration(routesConfiguration); + } + + @Override + public void addRoutesConfigurations(List<RoutesConfigurationDefinition> routesConfigurations) { + if (model == null && isLightweight()) { + throw new IllegalStateException("Access to model not supported in lightweight mode"); + } + model.addRoutesConfigurations(routesConfigurations); + } + + @Override + public List<RoutesConfigurationDefinition> getRoutesConfigurationDefinition() { + return model.getRoutesConfigurationDefinition(); + } + + @Override public List<RouteDefinition> getRouteDefinitions() { if (model == null && isLightweight()) { throw new IllegalStateException("Access to model not supported in lightweight mode"); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java index 5802e61..e70d4ea 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java @@ -52,6 +52,7 @@ import org.apache.camel.model.RouteFilters; import org.apache.camel.model.RouteTemplateBeanDefinition; import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplateParameterDefinition; +import org.apache.camel.model.RoutesConfigurationDefinition; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.transformer.TransformerDefinition; @@ -79,6 +80,7 @@ public class DefaultModel implements Model { private ModelReifierFactory modelReifierFactory = new DefaultModelReifierFactory(); private final List<ModelLifecycleStrategy> modelLifecycleStrategies = new ArrayList<>(); + private final List<RoutesConfigurationDefinition> routesConfigurations = new ArrayList<>(); private final List<RouteDefinition> routeDefinitions = new ArrayList<>(); private final List<RouteTemplateDefinition> routeTemplateDefinitions = new ArrayList<>(); private final List<RestDefinition> restDefinitions = new ArrayList<>(); @@ -114,6 +116,27 @@ public class DefaultModel implements Model { } @Override + public void addRoutesConfiguration(RoutesConfigurationDefinition routesConfiguration) { + if (routesConfiguration == null) { + return; + } + this.routesConfigurations.add(routesConfiguration); + } + + @Override + public void addRoutesConfigurations(List<RoutesConfigurationDefinition> routesConfigurations) { + if (routesConfigurations == null || routesConfigurations.isEmpty()) { + return; + } + this.routesConfigurations.addAll(routesConfigurations); + } + + @Override + public List<RoutesConfigurationDefinition> getRoutesConfigurationDefinition() { + return routesConfigurations; + } + + @Override public synchronized void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception { if (routeDefinitions == null || routeDefinitions.isEmpty()) { return; diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java index 14cd80c..bf5b72e 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java @@ -63,6 +63,7 @@ import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.RouteTemplateDefinition; +import org.apache.camel.model.RoutesConfigurationDefinition; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.rest.RestDefinition; @@ -1687,6 +1688,21 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam } @Override + public void addRoutesConfiguration(RoutesConfigurationDefinition routesConfiguration) { + getModelCamelContext().addRoutesConfiguration(routesConfiguration); + } + + @Override + public void addRoutesConfigurations(List<RoutesConfigurationDefinition> routesConfigurations) { + getModelCamelContext().addRoutesConfigurations(routesConfigurations); + } + + @Override + public List<RoutesConfigurationDefinition> getRoutesConfigurationDefinition() { + return getModelCamelContext().getRoutesConfigurationDefinition(); + } + + @Override public List<RouteDefinition> getRouteDefinitions() { return getModelCamelContext().getRouteDefinitions(); } diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties index 2b03f53..0aa905d 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties +++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties @@ -142,6 +142,7 @@ routeTemplate routeTemplateContextRef routeTemplates routes +routesConfiguration routingSlip rss saga diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index index c134380..c211311 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index @@ -71,6 +71,7 @@ RouteTemplateDefinition RouteTemplateParameterDefinition RouteTemplateScriptDefinition RouteTemplatesDefinition +RoutesConfigurationDefinition RoutesDefinition RoutingSlipDefinition SagaCompletionMode diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfiguration.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfiguration.json new file mode 100644 index 0000000..c4a5307 --- /dev/null +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfiguration.json @@ -0,0 +1,17 @@ +{ + "model": { + "kind": "model", + "name": "routesConfiguration", + "title": "Routes Configuration", + "description": "Global configuration for Camel routes", + "deprecated": false, + "label": "configuration", + "javaType": "org.apache.camel.model.RoutesConfigurationDefinition", + "input": false, + "output": false + }, + "properties": { + "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }, + "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" } + } +} diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java index 5f9c6db..b04ad8a 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java @@ -34,11 +34,13 @@ import org.apache.camel.model.InterceptDefinition; import org.apache.camel.model.InterceptFromDefinition; import org.apache.camel.model.InterceptSendToEndpointDefinition; import org.apache.camel.model.Model; +import org.apache.camel.model.ModelCamelContext; import org.apache.camel.model.OnCompletionDefinition; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplatesDefinition; +import org.apache.camel.model.RoutesConfigurationDefinition; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.rest.RestConfigurationDefinition; import org.apache.camel.model.rest.RestDefinition; @@ -201,6 +203,18 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild } /** + * Global routes configuration + * + * @return the builder + */ + public RoutesConfigurationDefinition routesConfiguration() { + RoutesConfigurationDefinition answer = new RoutesConfigurationDefinition(); + getContext().adapt(ModelCamelContext.class).addRoutesConfiguration(answer); + configureRoutesConfiguration(answer); + return answer; + } + + /** * Creates a new route template * * @return the builder @@ -462,8 +476,8 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild configureRoutes(context); configureRests(context); - // but populate rests before routes, as we want to turn rests into - // routes + // but populate rests before routes, as we want to turn rests into routes + populateRoutesConfiguration(); populateRests(); populateTransformers(); populateValidators(); @@ -551,6 +565,10 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild } } + protected void populateRoutesConfiguration() throws Exception { + // noop + } + protected void populateRouteTemplates() throws Exception { CamelContext camelContext = getContext(); if (camelContext == null) { @@ -673,4 +691,8 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild protected void configureRouteTemplate(RouteTemplateDefinition routeTemplate) { // noop } + + protected void configureRoutesConfiguration(RoutesConfigurationDefinition routesConfiguration) { + // noop + } } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/Model.java b/core/camel-core-model/src/main/java/org/apache/camel/model/Model.java index 041881b..10ff07e 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/Model.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/Model.java @@ -49,6 +49,13 @@ public interface Model { */ List<ModelLifecycleStrategy> getModelLifecycleStrategies(); + // TODO: better names + void addRoutesConfigurations(List<RoutesConfigurationDefinition> routesConfigurations); + + void addRoutesConfiguration(RoutesConfigurationDefinition routesConfiguration); + + List<RoutesConfigurationDefinition> getRoutesConfigurationDefinition(); + /** * Returns a list of the current route definitions * diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationDefinition.java new file mode 100644 index 0000000..56b7372 --- /dev/null +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationDefinition.java @@ -0,0 +1,138 @@ +/* + * 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.model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.camel.spi.Metadata; + +/** + * Global configuration for Camel routes + */ +@Metadata(label = "configuration") +@XmlRootElement(name = "routesConfiguration") +@XmlAccessorType(XmlAccessType.FIELD) +public class RoutesConfigurationDefinition extends OptionalIdentifiedDefinition<RoutesDefinition> { + + // TODO: Model for ErrorHandler + + @XmlElementRef + private List<OnExceptionDefinition> onExceptions = new ArrayList<>(); + @XmlElementRef + private List<OnCompletionDefinition> onCompletions = new ArrayList<>(); + @XmlElementRef + private List<InterceptDefinition> intercepts = new ArrayList<>(); + @XmlElementRef + private List<InterceptFromDefinition> interceptFroms = new ArrayList<>(); + @XmlElementRef + private List<InterceptSendToEndpointDefinition> interceptSendTos = new ArrayList<>(); + + public RoutesConfigurationDefinition() { + } + + @Override + public String toString() { + return "RoutesConfiguration: " + getId(); + } + + @Override + public String getShortName() { + return "routesConfiguration"; + } + + @Override + public String getLabel() { + return "RoutesConfiguration " + getId(); + } + + public List<OnExceptionDefinition> getOnExceptions() { + return onExceptions; + } + + public void setOnExceptions(List<OnExceptionDefinition> onExceptions) { + this.onExceptions = onExceptions; + } + + public List<OnCompletionDefinition> getOnCompletions() { + return onCompletions; + } + + public void setOnCompletions(List<OnCompletionDefinition> onCompletions) { + this.onCompletions = onCompletions; + } + + public List<InterceptDefinition> getIntercepts() { + return intercepts; + } + + public void setIntercepts(List<InterceptDefinition> intercepts) { + this.intercepts = intercepts; + } + + public List<InterceptFromDefinition> getInterceptFroms() { + return interceptFroms; + } + + public void setInterceptFroms(List<InterceptFromDefinition> interceptFroms) { + this.interceptFroms = interceptFroms; + } + + public List<InterceptSendToEndpointDefinition> getInterceptSendTos() { + return interceptSendTos; + } + + public void setInterceptSendTos(List<InterceptSendToEndpointDefinition> interceptSendTos) { + this.interceptSendTos = interceptSendTos; + } + + // Fluent API + // ------------------------------------------------------------------------- + + /** + * <a href="http://camel.apache.org/exception-clause.html">Exception clause</a> for catching certain exceptions and + * handling them. + * + * @param exceptionType the exception to catch + * @return the exception builder to configure + */ + public OnExceptionDefinition onException(Class<? extends Throwable> exceptionType) { + OnExceptionDefinition answer = new OnExceptionDefinition(exceptionType); + onExceptions.add(answer); + return answer; + } + + /** + * <a href="http://camel.apache.org/exception-clause.html">Exception clause</a> for catching certain exceptions and + * handling them. + * + * @param exceptions list of exceptions to catch + * @return the exception builder to configure + */ + public OnExceptionDefinition onException(Class<? extends Throwable>... exceptions) { + OnExceptionDefinition answer = new OnExceptionDefinition(Arrays.asList(exceptions)); + onExceptions.add(answer); + return answer; + } + +} 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 b62df39..6f18e08 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 @@ -41,6 +41,7 @@ import org.apache.camel.spi.Metadata; public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinition> implements RouteContainer { @XmlElementRef private List<RouteDefinition> routes = new ArrayList<>(); + // TODO: Use RoutesConfigurationDefinition instead @XmlTransient private List<InterceptDefinition> intercepts = new ArrayList<>(); @XmlTransient @@ -202,9 +203,28 @@ public class RoutesDefinition extends OptionalIdentifiedDefinition<RoutesDefinit route.setErrorHandlerFactoryIfNull(handler); } + // merge global and route scoped together + List<OnExceptionDefinition> oe = new ArrayList<>(onExceptions); + List<InterceptDefinition> icp = new ArrayList<>(intercepts); + List<InterceptFromDefinition> ifrom = new ArrayList<>(interceptFroms); + List<InterceptSendToEndpointDefinition> ito = new ArrayList<>(interceptSendTos); + List<OnCompletionDefinition> oc = new ArrayList<>(onCompletions); + if (getCamelContext() != null) { + List<RoutesConfigurationDefinition> globalConfigurations + = getCamelContext().adapt(ModelCamelContext.class).getRoutesConfigurationDefinition(); + if (globalConfigurations != null) { + globalConfigurations.forEach(g -> { + oe.addAll(g.getOnExceptions()); + icp.addAll(g.getIntercepts()); + ifrom.addAll(g.getInterceptFroms()); + ito.addAll(g.getInterceptSendTos()); + oc.addAll(g.getOnCompletions()); + }); + } + } + // must prepare the route before we can add it to the routes list - RouteDefinitionHelper.prepareRoute(getCamelContext(), route, getOnExceptions(), getIntercepts(), getInterceptFroms(), - getInterceptSendTos(), getOnCompletions()); + RouteDefinitionHelper.prepareRoute(getCamelContext(), route, oe, icp, ifrom, ito, oc); getRoutes().add(route); // mark this route as prepared diff --git a/core/camel-core/src/test/java/org/apache/camel/model/RoutesConfigurationMultipleRouteBuilderTest.java b/core/camel-core/src/test/java/org/apache/camel/model/RoutesConfigurationMultipleRouteBuilderTest.java new file mode 100644 index 0000000..875db74 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/model/RoutesConfigurationMultipleRouteBuilderTest.java @@ -0,0 +1,65 @@ +/* + * 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.model; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class RoutesConfigurationMultipleRouteBuilderTest extends ContextTestSupport { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testRoutesConfiguration() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + // global routes configuration + routesConfiguration().onException(Exception.class).handled(true).to("mock:error"); + } + }); + + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .throwException(new IllegalArgumentException("Foo")); + } + }); + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start2") + .throwException(new IllegalArgumentException("Foo2")); + } + }); + + context.start(); + + getMockEndpoint("mock:error").expectedBodiesReceived("Hello World", "Bye World"); + + template.sendBody("direct:start", "Hello World"); + template.sendBody("direct:start2", "Bye World"); + + assertMockEndpointsSatisfied(); + } + +} diff --git a/core/camel-core/src/test/java/org/apache/camel/model/RoutesConfigurationTest.java b/core/camel-core/src/test/java/org/apache/camel/model/RoutesConfigurationTest.java new file mode 100644 index 0000000..8977c55 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/model/RoutesConfigurationTest.java @@ -0,0 +1,51 @@ +/* + * 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.model; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class RoutesConfigurationTest extends ContextTestSupport { + + @Test + public void testRoutesConfiguration() throws Exception { + getMockEndpoint("mock:error").expectedBodiesReceived("Hello World", "Bye World"); + + template.sendBody("direct:start", "Hello World"); + template.sendBody("direct:start2", "Bye World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // global routes configuration + routesConfiguration().onException(Exception.class).handled(true).to("mock:error"); + + from("direct:start") + .throwException(new IllegalArgumentException("Foo")); + + from("direct:start2") + .throwException(new IllegalArgumentException("Foo2")); + } + }; + } +} diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java index d444e5e..72895e0 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java @@ -1112,6 +1112,20 @@ public class ModelParser extends BaseParser { return optionalIdentifiedDefinitionElementHandler().accept(def, key); }, noValueHandler()); } + protected RoutesConfigurationDefinition doParseRoutesConfigurationDefinition() throws IOException, XmlPullParserException { + return doParse(new RoutesConfigurationDefinition(), + optionalIdentifiedDefinitionAttributeHandler(), (def, key) -> { + switch (key) { + case "interceptFrom": doAdd(doParseInterceptFromDefinition(), def.getIntercepts(), def::setIntercepts); break; + case "interceptSendToEndpoint": doAdd(doParseInterceptSendToEndpointDefinition(), def.getInterceptSendTos(), def::setInterceptSendTos); break; + case "intercept": doAdd(doParseInterceptDefinition(), def.getIntercepts(), def::setIntercepts); break; + case "onCompletion": doAdd(doParseOnCompletionDefinition(), def.getOnCompletions(), def::setOnCompletions); break; + case "onException": doAdd(doParseOnExceptionDefinition(), def.getOnExceptions(), def::setOnExceptions); break; + default: return optionalIdentifiedDefinitionElementHandler().accept(def, key); + } + return true; + }, noValueHandler()); + } public Optional<RoutesDefinition> parseRoutesDefinition() throws IOException, XmlPullParserException { String tag = getNextTag("routes", "route"); 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 56ecd7b..666b14d 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,6 +73,7 @@ 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; @@ -12880,6 +12881,75 @@ 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 965e470..f525761 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,6 +304,8 @@ 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/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json index 39f7343..031f947 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 @@ -2150,6 +2150,41 @@ } } ] }, + "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" + } + } + } + }, "org.apache.camel.model.RoutingSlipDefinition" : { "oneOf" : [ { "type" : "string"
