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 8f94c0888383dd8a6a9714e5f6c8e54728ae7112 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Jul 7 13:10:25 2021 +0200 CAMEL-16757: camel-core - Global error handling, interceptor in all DSL --- .../camel/impl/lw/LightweightCamelContext.java | 6 ++ .../impl/lw/LightweightRuntimeCamelContext.java | 6 ++ .../services/org/apache/camel/model.properties | 1 + .../resources/org/apache/camel/model/jaxb.index | 1 + .../apache/camel/model/routesConfigurations.json | 17 +++++ .../model/RoutesConfigurationsDefinition.java | 77 ++++++++++++++++++++++ .../java/org/apache/camel/xml/in/ModelParser.java | 33 ++++++++++ .../camel/dsl/xml/io/XmlRoutesBuilderLoader.java | 19 ++++++ .../dsl/yaml/deserializers/ModelDeserializers.java | 44 +++++++++++++ .../deserializers/ModelDeserializersResolver.java | 2 + .../src/generated/resources/camel-yaml-dsl.json | 11 ++++ .../camel/dsl/yaml/YamlRoutesBuilderLoader.java | 11 ++++ .../packaging/ModelXmlParserGeneratorMojo.java | 4 +- 13 files changed, 231 insertions(+), 1 deletion(-) 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 bf5b72e..8701f68 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 @@ -43,6 +43,7 @@ import org.apache.camel.ProducerTemplate; import org.apache.camel.Route; import org.apache.camel.RouteTemplateContext; import org.apache.camel.RoutesBuilder; +import org.apache.camel.RoutesConfigurationsBuilder; import org.apache.camel.Service; import org.apache.camel.ServiceStatus; import org.apache.camel.ShutdownRoute; @@ -553,6 +554,11 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam } @Override + public void addRoutesConfigurations(RoutesConfigurationsBuilder builder) throws Exception { + delegate.addRoutesConfigurations(builder); + } + + @Override public boolean removeRoute(String routeId) throws Exception { return delegate.removeRoute(routeId); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java index e807148..d7351ee 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java @@ -51,6 +51,7 @@ import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.Route; import org.apache.camel.RouteTemplateContext; import org.apache.camel.RoutesBuilder; +import org.apache.camel.RoutesConfigurationsBuilder; import org.apache.camel.RuntimeCamelException; import org.apache.camel.Service; import org.apache.camel.ServiceStatus; @@ -1863,6 +1864,11 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat } @Override + public void addRoutesConfigurations(RoutesConfigurationsBuilder builder) throws Exception { + throw new UnsupportedOperationException(); + } + + @Override public boolean removeRoute(String routeId) throws Exception { throw new UnsupportedOperationException(); } 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 0aa905d..9a55b3e 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 @@ -143,6 +143,7 @@ routeTemplateContextRef routeTemplates routes routesConfiguration +routesConfigurations 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 c211311..9ac2703 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 @@ -72,6 +72,7 @@ RouteTemplateParameterDefinition RouteTemplateScriptDefinition RouteTemplatesDefinition RoutesConfigurationDefinition +RoutesConfigurationsDefinition RoutesDefinition RoutingSlipDefinition SagaCompletionMode diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfigurations.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfigurations.json new file mode 100644 index 0000000..8bd9060 --- /dev/null +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfigurations.json @@ -0,0 +1,17 @@ +{ + "model": { + "kind": "model", + "name": "routesConfigurations", + "title": "Routes Configurations", + "description": "A series of global configuration for Camel routes", + "deprecated": false, + "label": "configuration", + "javaType": "org.apache.camel.model.RoutesConfigurationsDefinition", + "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/model/RoutesConfigurationsDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationsDefinition.java new file mode 100644 index 0000000..55a708f --- /dev/null +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationsDefinition.java @@ -0,0 +1,77 @@ +/* + * 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.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 javax.xml.bind.annotation.XmlTransient; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.Metadata; + +/** + * A series of global configuration for Camel routes + */ +@Metadata(label = "configuration") +@XmlRootElement(name = "routesConfigurations") +@XmlAccessorType(XmlAccessType.FIELD) +public class RoutesConfigurationsDefinition extends OptionalIdentifiedDefinition<RoutesDefinition> { + + @XmlElementRef + private List<RoutesConfigurationDefinition> routesConfigurations = new ArrayList<>(); + @XmlTransient + private CamelContext camelContext; + + public RoutesConfigurationsDefinition() { + } + + @Override + public String toString() { + return "RoutesConfigurations: " + getId(); + } + + @Override + public String getShortName() { + return "routesConfigurations"; + } + + @Override + public String getLabel() { + return "RoutesConfigurations " + getId(); + } + + public List<RoutesConfigurationDefinition> getRoutesConfigurations() { + return routesConfigurations; + } + + public void setRoutesConfigurations(List<RoutesConfigurationDefinition> routesConfigurations) { + this.routesConfigurations = routesConfigurations; + } + + public CamelContext getCamelContext() { + return camelContext; + } + + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } +} 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 72895e0..3d5ccff 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 @@ -1126,6 +1126,39 @@ public class ModelParser extends BaseParser { return true; }, noValueHandler()); } + public Optional<RoutesConfigurationsDefinition> parseRoutesConfigurationsDefinition() + throws IOException, XmlPullParserException { + String tag = getNextTag("routesConfigurations", "routesConfiguration"); + if (tag != null) { + switch (tag) { + case "routesConfigurations" : return Optional.of(doParseRoutesConfigurationsDefinition()); + case "routesConfiguration" : return parseSingleRoutesConfigurationsDefinition(); + } + } + return Optional.empty(); + } + private Optional<RoutesConfigurationsDefinition> parseSingleRoutesConfigurationsDefinition() + throws IOException, XmlPullParserException { + Optional<RoutesConfigurationDefinition> single = Optional.of(doParseRoutesConfigurationDefinition()); + if (single.isPresent()) { + List<RoutesConfigurationDefinition> list = new ArrayList<>(); + list.add(single.get()); + RoutesConfigurationsDefinition def = new RoutesConfigurationsDefinition(); + def.setRoutesConfigurations(list); + return Optional.of(def); + } + return Optional.empty(); + } + protected RoutesConfigurationsDefinition doParseRoutesConfigurationsDefinition() throws IOException, XmlPullParserException { + return doParse(new RoutesConfigurationsDefinition(), + optionalIdentifiedDefinitionAttributeHandler(), (def, key) -> { + if ("routesConfiguration".equals(key)) { + doAdd(doParseRoutesConfigurationDefinition(), def.getRoutesConfigurations(), def::setRoutesConfigurations); + return true; + } + return optionalIdentifiedDefinitionElementHandler().accept(def, key); + }, noValueHandler()); + } public Optional<RoutesDefinition> parseRoutesDefinition() throws IOException, XmlPullParserException { String tag = getNextTag("routes", "route"); diff --git a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java index 59abcfd..8565107 100644 --- a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java +++ b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java @@ -22,7 +22,10 @@ import org.apache.camel.CamelContextAware; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.dsl.support.RouteBuilderLoaderSupport; +import org.apache.camel.model.ModelCamelContext; import org.apache.camel.model.RouteDefinition; +import org.apache.camel.model.RoutesConfigurationDefinition; +import org.apache.camel.model.RoutesConfigurationsDefinition; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.spi.Resource; import org.apache.camel.spi.annotations.RoutesLoader; @@ -76,6 +79,15 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { } } + @Override + public void configuration() throws Exception { + try (InputStream is = resource.getInputStream()) { + new ModelParser(is) + .parseRoutesConfigurationsDefinition() + .ifPresent(this::addConfigurations); + } + } + private void addRoutes(RoutesDefinition routes) { CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext()); @@ -85,6 +97,13 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { getRouteCollection().route(route); } } + + private void addConfigurations(RoutesConfigurationsDefinition configurations) { + CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext()); + for (RoutesConfigurationDefinition config : configurations.getRoutesConfigurations()) { + getCamelContext().adapt(ModelCamelContext.class).addRoutesConfiguration(config); + } + } }; } } 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..2fa29b6 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.RoutesConfigurationsDefinition; import org.apache.camel.model.RoutingSlipDefinition; import org.apache.camel.model.SagaActionUriDefinition; import org.apache.camel.model.SagaDefinition; @@ -12880,6 +12881,49 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @YamlType( + types = org.apache.camel.model.RoutesConfigurationsDefinition.class, + order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, + nodes = "routes-configurations", + properties = @YamlProperty(name = "routes-configuration", type = "array:org.apache.camel.model.RoutesConfigurationDefinition") + ) + public static class RoutesConfigurationsDefinitionDeserializer extends YamlDeserializerBase<RoutesConfigurationsDefinition> { + public RoutesConfigurationsDefinitionDeserializer() { + super(RoutesConfigurationsDefinition.class); + } + + @Override + protected RoutesConfigurationsDefinition newInstance() { + return new RoutesConfigurationsDefinition(); + } + + @Override + protected boolean setProperty(RoutesConfigurationsDefinition target, String propertyKey, + String propertyName, Node node) { + switch(propertyKey) { + case "routes-configuration": { + java.util.List<org.apache.camel.model.RoutesConfigurationDefinition> val = asFlatList(node, org.apache.camel.model.RoutesConfigurationDefinition.class); + target.setRoutesConfigurations(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..197bfda 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-configurations": return new ModelDeserializers.RoutesConfigurationsDefinitionDeserializer(); + case "org.apache.camel.model.RoutesConfigurationsDefinition": return new ModelDeserializers.RoutesConfigurationsDefinitionDeserializer(); 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 3708e2f..e58c408 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 @@ -2189,6 +2189,17 @@ } } ] }, + "org.apache.camel.model.RoutesConfigurationsDefinition" : { + "type" : "object", + "properties" : { + "routes-configuration" : { + "type" : "array", + "items" : { + "$ref" : "#/items/definitions/org.apache.camel.model.RoutesConfigurationDefinition" + } + } + } + }, "org.apache.camel.model.RoutingSlipDefinition" : { "oneOf" : [ { "type" : "string" 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 15a4057..48a5e92 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 @@ -96,6 +96,17 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { } } } + + @Override + public void configuration() throws Exception { + for (Node node : asSequenceNode(root).getValue()) { + Object item = getDeserializationContext().mandatoryResolve(node).construct(node); + if (item instanceof RoutesConfigurationDefinition) { + getContext().adapt(ModelCamelContext.class) + .addRoutesConfiguration((RoutesConfigurationDefinition) item); + } + } + } }; } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java index bfc4cece..3f9f1bb 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java @@ -101,6 +101,7 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo { private Class<?> outputDefinitionClass; private Class<?> expressionDefinitionClass; private Class<?> routesDefinitionClass; + private Class<?> routesConfigurationsDefinitionClass; private Class<?> routeTemplatesDefinitionClass; private Class<?> restsDefinitionClass; private Class<?> processorDefinitionClass; @@ -134,6 +135,7 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo { outputDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".OutputDefinition"); routesDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".RoutesDefinition"); + routesConfigurationsDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".RoutesConfigurationsDefinition"); routeTemplatesDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".RouteTemplatesDefinition"); dataFormatDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".DataFormatDefinition"); processorDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".ProcessorDefinition"); @@ -476,7 +478,7 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo { } return " noValueHandler()"; }); - if (clazz == routesDefinitionClass || clazz == routeTemplatesDefinitionClass || clazz == restsDefinitionClass) { + if (clazz == routesDefinitionClass || clazz == routeTemplatesDefinitionClass || clazz == restsDefinitionClass || clazz == routesConfigurationsDefinitionClass) { // for routes/rests/routeTemplates we want to support single-mode as well, this means // we check that the tag name is either plural or singular and parse accordingly
