From c2b99878c54c899330fedb90503dcdc8c98dcffd Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Wed, 31 Aug 2022 16:39:29 +0200 Subject: [PATCH] BAEL-5237 - Apache Camel Conditional Routing (#12675) * BAEL-4706 - Spring Boot with Spring Batch * BAEL-3948 - Fix test(s) in spring-batch which leaves repository.sqlite changed * BAEL-4736 - Convert JSONArray to List of Object using camel-jackson * BAEL-4756 - Mockito MockSettings * BAEL-4756 - Mockito MockSettings - fix spelling * BAEL-2674 - Upgrade the Okhttp article * BAEL-4204 - Adding Interceptors in OkHTTP * BAEL-4836 - Mocking Static Methods with Mockito * BAEL-4205 - A Guide to Events in OkHTTP * BAEL-5408 - Update Camel version in spring-boot-camel module * BAEL-5234 - Apache Camel Routes Testing in Spring Boot * BAEL-5234 - Apache Camel Routes Testing in Spring Boot * BAEL-5237 - Apache Camel Conditional Routing Co-authored-by: Jonathan Cook --- .../conditional/ConditionalBeanRouter.java | 23 ++++++++++++++ .../conditional/ConditionalBodyRouter.java | 24 +++++++++++++++ .../conditional/ConditionalHeaderRouter.java | 23 ++++++++++++++ .../ConditionalRoutingSpringApplication.java | 13 ++++++++ .../baeldung/camel/conditional/FruitBean.java | 15 ++++++++++ .../ConditionalBeanRouterUnitTest.java | 30 +++++++++++++++++++ .../ConditionalBodyRouterUnitTest.java | 30 +++++++++++++++++++ .../ConditionalHeaderRouterUnitTest.java | 29 ++++++++++++++++++ 8 files changed, 187 insertions(+) create mode 100644 spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java create mode 100644 spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java create mode 100644 spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java create mode 100644 spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java create mode 100644 spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java create mode 100644 spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java create mode 100644 spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java create mode 100644 spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java new file mode 100644 index 0000000000..8a03f6ef18 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java @@ -0,0 +1,23 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class ConditionalBeanRouter extends RouteBuilder { + + @Override + public void configure() throws Exception { + + from("direct:start-conditional-bean") + .routeId("conditional-bean-route") + .choice() + .when(method(FruitBean.class, "isApple")) + .setHeader("favourite", simple("Apples")) + .to("mock:result") + .otherwise() + .setHeader("favourite", header("fruit")) + .to("mock:result") + .end(); + } +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java new file mode 100644 index 0000000000..99d23c747b --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java @@ -0,0 +1,24 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class ConditionalBodyRouter extends RouteBuilder { + + @Override + public void configure() throws Exception { + + from("direct:start-conditional") + .routeId("conditional-body-route") + .choice() + .when(body().contains("Baeldung")) + .setBody(simple("Goodbye, Baeldung!")) + .to("mock:result-body") + .otherwise() + .to("mock:result-body") + .end(); + + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java new file mode 100644 index 0000000000..e723f97ef1 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java @@ -0,0 +1,23 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class ConditionalHeaderRouter extends RouteBuilder { + + @Override + public void configure() throws Exception { + + from("direct:start-conditional-header") + .routeId("conditional-header-route") + .choice() + .when(header("fruit").isEqualTo("Apple")) + .setHeader("favourite", simple("Apples")) + .to("mock:result") + .otherwise() + .setHeader("favourite", header("fruit")) + .to("mock:result") + .end(); + } +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java new file mode 100644 index 0000000000..f20d23068a --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.camel.conditional; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ConditionalRoutingSpringApplication { + + public static void main(String[] args) { + SpringApplication.run(ConditionalRoutingSpringApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java new file mode 100644 index 0000000000..080e3393b6 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java @@ -0,0 +1,15 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.Exchange; + +public class FruitBean { + + private FruitBean() { + } + + public static boolean isApple(Exchange exchange) { + return "Apple".equals(exchange.getIn() + .getHeader("fruit")); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java new file mode 100644 index 0000000000..bba1f21392 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@CamelSpringBootTest +class ConditionalBeanRouterUnitTest { + + @Autowired + private ProducerTemplate template; + + @EndpointInject("mock:result") + private MockEndpoint mock; + + @Test + void whenSendBodyWithFruit_thenFavouriteHeaderReceivedSuccessfully() throws InterruptedException { + mock.expectedHeaderReceived("favourite", "Apples"); + + template.sendBodyAndHeader("direct:start-conditional-bean", null, "fruit", "Apple"); + + mock.assertIsSatisfied(); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java new file mode 100644 index 0000000000..22c12a741f --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@CamelSpringBootTest +class ConditionalBodyRouterUnitTest { + + @Autowired + private ProducerTemplate template; + + @EndpointInject("mock:result-body") + private MockEndpoint mock; + + @Test + void whenSendBodyWithBaeldung_thenGoodbyeMessageReceivedSuccessfully() throws InterruptedException { + mock.expectedBodiesReceived("Goodbye, Baeldung!"); + + template.sendBody("direct:start-conditional", "Hello Baeldung Readers!"); + + mock.assertIsSatisfied(); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java new file mode 100644 index 0000000000..63fbf6682a --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.camel.conditional; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@CamelSpringBootTest +class ConditionalHeaderRouterUnitTest { + + @Autowired + private ProducerTemplate template; + + @EndpointInject("mock:result") + private MockEndpoint mock; + + @Test + void whenSendBodyWithFruit_thenFavouriteHeaderReceivedSuccessfully() throws InterruptedException { + mock.expectedHeaderReceived("favourite", "Banana"); + + template.sendBodyAndHeader("direct:start-conditional-header", null, "fruit", "Banana"); + + mock.assertIsSatisfied(); + } +}