From 1fc3cf86f75ffb9727b6112375f945a3d5296134 Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Sun, 10 Jul 2022 00:00:48 -0300 Subject: [PATCH 1/7] CAMEL-18262 - Fixing the Template issue Signed-off-by: Rhuan Rocha --- .../java/org/apache/camel/model/RouteTemplateDefinition.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java index f700c69242f7a..d9fbfe9ee7335 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java @@ -418,6 +418,7 @@ public RouteDefinition asRouteDefinition() { copy.setDescription(getDescription()); } copy.setPrecondition(route.getPrecondition()); + copy.setRouteConfigurationId(route.getRouteConfigurationId()); return copy; } From 2d49ab65286b22acdbb2f70326cbbebf9e83e43c Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Tue, 12 Jul 2022 15:21:36 -0300 Subject: [PATCH 2/7] CAMEL-18262 - Adding unit test Signed-off-by: Rhuan Rocha --- .../RouteConfigurationOnExceptionTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java diff --git a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java new file mode 100644 index 0000000000000..a44c89eea01a6 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java @@ -0,0 +1,89 @@ +package org.apache.camel.model; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.LoggingLevel; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.builder.RouteConfigurationBuilder; +import org.apache.camel.builder.TemplatedRouteBuilder; +import org.apache.camel.component.direct.DirectConsumerNotAvailableException; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.Test; + +import java.net.ConnectException; + +public class RouteConfigurationOnExceptionTest extends ContextTestSupport { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testGlobal() throws Exception { + context.addRoutes(new RouteConfigurationBuilder() { + @Override + public void configuration() throws Exception { + routeConfiguration("my-error-handler").onException(Exception.class) + .handled(true) + .log(LoggingLevel.ERROR, log, "--> Exception: ${exception.message}, Delivery was NOT rolled back"); + } + }); + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + routeTemplate("route-template-1") + .templateParameter("route_url-1") + .templateParameter("route_url-2") + .templateParameter("route-id-param-id") + + .from("direct:{{route_url-1}}") + .routeConfigurationId("my-error-handler") + .end() + + .log(LoggingLevel.INFO, log, "--> Executing") + .to("direct:{{route_url-2}}") + .id("{{route-id-param-id}}") + .log(LoggingLevel.INFO, log, "--> Executed!"); + } + }); + + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + + from("direct:start2") + .to("mock:result2"); + } + }); + + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + final String routeId = TemplatedRouteBuilder.builder(context, "route-template-1") + .routeId("my-test-file-route") + .parameter("route_url-1", "start") + .parameter("route_url-2", "startWrong") + .parameter("route-id-param-id", "my-internal-route-id") + .add(); + } + }); + + MockEndpoint mockEndpoint = getMockEndpoint("mock:endpointMock"); + AdviceWith.adviceWith(context, "my-test-file-route", routeBuilder -> { + routeBuilder.replaceFromWith("direct:start"); + routeBuilder.weaveAddLast().to(mockEndpoint); + routeBuilder.setLogRouteAsXml(false); + }); + + context.start(); + + final String testMsg = "{ test msg }"; + + mockEndpoint.expectedMessageCount(0); + //mockEndpoint.expectedBodiesReceived(testMsg); + template.sendBody("direct:start", testMsg); + mockEndpoint.assertIsSatisfied(); + + } +} From 455ae49c0abf9e37d4da440c822304bd28c76e59 Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Tue, 12 Jul 2022 19:29:59 -0300 Subject: [PATCH 3/7] CAMEL-18262 - Removing comments. Signed-off-by: Rhuan Rocha --- .../apache/camel/model/RouteConfigurationOnExceptionTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java index a44c89eea01a6..7a85d0d39d344 100644 --- a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java @@ -6,12 +6,9 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.builder.RouteConfigurationBuilder; import org.apache.camel.builder.TemplatedRouteBuilder; -import org.apache.camel.component.direct.DirectConsumerNotAvailableException; import org.apache.camel.component.mock.MockEndpoint; import org.junit.jupiter.api.Test; -import java.net.ConnectException; - public class RouteConfigurationOnExceptionTest extends ContextTestSupport { @Override @@ -81,7 +78,6 @@ public void configure() throws Exception { final String testMsg = "{ test msg }"; mockEndpoint.expectedMessageCount(0); - //mockEndpoint.expectedBodiesReceived(testMsg); template.sendBody("direct:start", testMsg); mockEndpoint.assertIsSatisfied(); From e04d1ff568b87fab41b779e5b1b234568157991d Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Tue, 12 Jul 2022 19:32:33 -0300 Subject: [PATCH 4/7] CAMEL-18262 - Fixing the format issue. Signed-off-by: Rhuan Rocha --- .../RouteConfigurationOnExceptionTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java index 7a85d0d39d344..0ea9cede0b6a1 100644 --- a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java @@ -1,3 +1,20 @@ +/* + * 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; From 26a2c0375f7ccf8a2b3b052f8779f53fa0adbb89 Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Wed, 13 Jul 2022 13:11:39 -0300 Subject: [PATCH 5/7] CAMEL-18262 - Fixing the template routeDefinition prepare Signed-off-by: Rhuan Rocha --- .../org/apache/camel/impl/DefaultModel.java | 32 ++--- .../RouteConfigurationOnExceptionTest.java | 113 ++++++++---------- 2 files changed, 55 insertions(+), 90 deletions(-) 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 816aac85b7371..9bb23e01e8423 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 @@ -36,26 +36,7 @@ import org.apache.camel.NoSuchBeanException; import org.apache.camel.PropertyBindingException; import org.apache.camel.RouteTemplateContext; -import org.apache.camel.model.BeanFactoryDefinition; -import org.apache.camel.model.DataFormatDefinition; -import org.apache.camel.model.DefaultRouteTemplateContext; -import org.apache.camel.model.FaultToleranceConfigurationDefinition; -import org.apache.camel.model.Model; -import org.apache.camel.model.ModelCamelContext; -import org.apache.camel.model.ModelLifecycleStrategy; -import org.apache.camel.model.ProcessorDefinition; -import org.apache.camel.model.ProcessorDefinitionHelper; -import org.apache.camel.model.Resilience4jConfigurationDefinition; -import org.apache.camel.model.RouteConfigurationDefinition; -import org.apache.camel.model.RouteDefinition; -import org.apache.camel.model.RouteDefinitionHelper; -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.TemplatedRouteBeanDefinition; -import org.apache.camel.model.TemplatedRouteDefinition; -import org.apache.camel.model.TemplatedRouteParameterDefinition; +import org.apache.camel.model.*; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.transformer.TransformerDefinition; @@ -67,11 +48,7 @@ import org.apache.camel.spi.RouteTemplateLoaderListener; import org.apache.camel.spi.RouteTemplateParameterSource; import org.apache.camel.spi.ScriptingLanguage; -import org.apache.camel.support.CamelContextHelper; -import org.apache.camel.support.PatternHelper; -import org.apache.camel.support.PropertyBindingSupport; -import org.apache.camel.support.RouteTemplateHelper; -import org.apache.camel.support.ScriptHelper; +import org.apache.camel.support.*; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.AntPathMatcher; import org.apache.camel.util.ObjectHelper; @@ -96,6 +73,7 @@ public class DefaultModel implements Model { private final Map resilience4jConfigurations = new ConcurrentHashMap<>(); private final Map faultToleranceConfigurations = new ConcurrentHashMap<>(); private Function routeFilter; + private RoutesDefinition routeCollection = new RoutesDefinition(); public DefaultModel(CamelContext camelContext) { this.camelContext = camelContext; @@ -415,7 +393,11 @@ public String addRouteFromTemplate(String routeId, String routeTemplateId, Route routeId, routeTemplateId, "duplicate id detected: " + duplicate + ". Please correct ids to be unique among all your routes."); } + addRouteDefinition(def); + routeCollection.setCamelContext(camelContext); + routeCollection.setRoutes(getRouteDefinitions()); + routeCollection.prepareRoute(def); return def.getId(); } diff --git a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java index 0ea9cede0b6a1..bbaebbe98db37 100644 --- a/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/model/RouteConfigurationOnExceptionTest.java @@ -23,80 +23,63 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.builder.RouteConfigurationBuilder; import org.apache.camel.builder.TemplatedRouteBuilder; -import org.apache.camel.component.mock.MockEndpoint; import org.junit.jupiter.api.Test; public class RouteConfigurationOnExceptionTest extends ContextTestSupport { @Override - public boolean isUseRouteBuilder() { - return false; + protected RouteBuilder[] createRouteBuilders() { + return new RouteBuilder[] { + new RouteBuilder() { + @Override + public void configure() { + routeTemplate("route-template") + .from("direct:start-template") + .routeConfigurationId("my-error-handler") + .throwException(RuntimeException.class, "Expected Error"); + } + }, + new RouteBuilder() { + @Override + public void configure() { + TemplatedRouteBuilder.builder(context, "route-template") + .routeId("my-test-file-route") + .add(); + } + }, + new RouteBuilder() { + @Override + public void configure() { + from("direct:start-normal") + .routeConfigurationId("my-error-handler") + .throwException(RuntimeException.class, "Expected Error"); + } + }, + new RouteConfigurationBuilder() { + @Override + public void configuration() { + routeConfiguration("my-error-handler").onException(Exception.class).handled(true) + .transform(constant("Error Received")) + .to("mock:result"); + } + } + }; } @Test - public void testGlobal() throws Exception { - context.addRoutes(new RouteConfigurationBuilder() { - @Override - public void configuration() throws Exception { - routeConfiguration("my-error-handler").onException(Exception.class) - .handled(true) - .log(LoggingLevel.ERROR, log, "--> Exception: ${exception.message}, Delivery was NOT rolled back"); - } - }); - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - routeTemplate("route-template-1") - .templateParameter("route_url-1") - .templateParameter("route_url-2") - .templateParameter("route-id-param-id") + void testRouteTemplateCanSupportRouteConfiguration() throws Exception { - .from("direct:{{route_url-1}}") - .routeConfigurationId("my-error-handler") - .end() - - .log(LoggingLevel.INFO, log, "--> Executing") - .to("direct:{{route_url-2}}") - .id("{{route-id-param-id}}") - .log(LoggingLevel.INFO, log, "--> Executed!"); - } - }); - - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - - from("direct:start2") - .to("mock:result2"); - } - }); - - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - final String routeId = TemplatedRouteBuilder.builder(context, "route-template-1") - .routeId("my-test-file-route") - .parameter("route_url-1", "start") - .parameter("route_url-2", "startWrong") - .parameter("route-id-param-id", "my-internal-route-id") - .add(); - } - }); - - MockEndpoint mockEndpoint = getMockEndpoint("mock:endpointMock"); - AdviceWith.adviceWith(context, "my-test-file-route", routeBuilder -> { - routeBuilder.replaceFromWith("direct:start"); - routeBuilder.weaveAddLast().to(mockEndpoint); - routeBuilder.setLogRouteAsXml(false); - }); - - context.start(); - - final String testMsg = "{ test msg }"; - - mockEndpoint.expectedMessageCount(0); - template.sendBody("direct:start", testMsg); - mockEndpoint.assertIsSatisfied(); + getMockEndpoint("mock:result").expectedMessageCount(1); + getMockEndpoint("mock:result").expectedBodiesReceived("Error Received"); + template.sendBody("direct:start-template", "foo"); + assertMockEndpointsSatisfied(); + } + @Test + void testNormalRouteCanSupportRouteConfiguration() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(1); + getMockEndpoint("mock:result").expectedBodiesReceived("Error Received"); + template.sendBody("direct:start-normal", "foo"); + assertMockEndpointsSatisfied(); } } From a9dfcd1682bc8437cdb430dc887553c25321c551 Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Wed, 13 Jul 2022 13:30:06 -0300 Subject: [PATCH 6/7] CAMEL-18262 - Fixing the format issue. Signed-off-by: Rhuan Rocha --- .../org/apache/camel/impl/DefaultModel.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) 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 9bb23e01e8423..c9eafca0e2ec2 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 @@ -36,7 +36,27 @@ import org.apache.camel.NoSuchBeanException; import org.apache.camel.PropertyBindingException; import org.apache.camel.RouteTemplateContext; -import org.apache.camel.model.*; +import org.apache.camel.model.BeanFactoryDefinition; +import org.apache.camel.model.DataFormatDefinition; +import org.apache.camel.model.DefaultRouteTemplateContext; +import org.apache.camel.model.FaultToleranceConfigurationDefinition; +import org.apache.camel.model.Model; +import org.apache.camel.model.ModelCamelContext; +import org.apache.camel.model.ModelLifecycleStrategy; +import org.apache.camel.model.ProcessorDefinition; +import org.apache.camel.model.ProcessorDefinitionHelper; +import org.apache.camel.model.Resilience4jConfigurationDefinition; +import org.apache.camel.model.RouteConfigurationDefinition; +import org.apache.camel.model.RouteDefinition; +import org.apache.camel.model.RouteDefinitionHelper; +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.RoutesDefinition; +import org.apache.camel.model.TemplatedRouteBeanDefinition; +import org.apache.camel.model.TemplatedRouteDefinition; +import org.apache.camel.model.TemplatedRouteParameterDefinition; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.transformer.TransformerDefinition; @@ -48,7 +68,11 @@ import org.apache.camel.spi.RouteTemplateLoaderListener; import org.apache.camel.spi.RouteTemplateParameterSource; import org.apache.camel.spi.ScriptingLanguage; -import org.apache.camel.support.*; +import org.apache.camel.support.CamelContextHelper; +import org.apache.camel.support.PatternHelper; +import org.apache.camel.support.PropertyBindingSupport; +import org.apache.camel.support.RouteTemplateHelper; +import org.apache.camel.support.ScriptHelper; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.AntPathMatcher; import org.apache.camel.util.ObjectHelper; From 9c79b05689d64e90a3e315e6358c2f4e25a01a2c Mon Sep 17 00:00:00 2001 From: Rhuan Rocha Date: Wed, 13 Jul 2022 13:37:08 -0300 Subject: [PATCH 7/7] CAMEL-18262 - Creating one RoutesDefinition per call Signed-off-by: Rhuan Rocha --- .../src/main/java/org/apache/camel/impl/DefaultModel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 c9eafca0e2ec2..793c29fa05b51 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 @@ -97,7 +97,6 @@ public class DefaultModel implements Model { private final Map resilience4jConfigurations = new ConcurrentHashMap<>(); private final Map faultToleranceConfigurations = new ConcurrentHashMap<>(); private Function routeFilter; - private RoutesDefinition routeCollection = new RoutesDefinition(); public DefaultModel(CamelContext camelContext) { this.camelContext = camelContext; @@ -419,6 +418,8 @@ public String addRouteFromTemplate(String routeId, String routeTemplateId, Route } addRouteDefinition(def); + + RoutesDefinition routeCollection = new RoutesDefinition(); routeCollection.setCamelContext(camelContext); routeCollection.setRoutes(getRouteDefinitions()); routeCollection.prepareRoute(def);