From ef8e084d6d540d2d01a73c15394e238f49c73589 Mon Sep 17 00:00:00 2001 From: Mladen Savic Date: Fri, 1 Oct 2021 13:04:07 +0200 Subject: [PATCH 01/10] Parallel Test Execution for JUnit 5 --- junit5/README.md | 6 +++ junit5/pom.xml | 36 +++++++++++++++ .../java/com/baeldung/junit5/A_UnitTest.java | 21 +++++++++ .../java/com/baeldung/junit5/B_UnitTest.java | 23 ++++++++++ .../java/com/baeldung/junit5/C_UnitTest.java | 45 +++++++++++++++++++ .../test/resources/junit-platform.properties | 4 ++ pom.xml | 1 + 7 files changed, 136 insertions(+) create mode 100644 junit5/README.md create mode 100644 junit5/pom.xml create mode 100644 junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java create mode 100644 junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java create mode 100644 junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java create mode 100644 junit5/src/test/resources/junit-platform.properties diff --git a/junit5/README.md b/junit5/README.md new file mode 100644 index 0000000000..ad16ad164d --- /dev/null +++ b/junit5/README.md @@ -0,0 +1,6 @@ +## JUnit5 + +This module contains articles about the JUnit 5 + +### Relevant Articles: + diff --git a/junit5/pom.xml b/junit5/pom.xml new file mode 100644 index 0000000000..b9804408a2 --- /dev/null +++ b/junit5/pom.xml @@ -0,0 +1,36 @@ + + + + 4.0.0 + junit5 + junit5 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + 8 + 8 + + + + + org.junit.jupiter + junit-jupiter-api + 5.8.1 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.8.1 + test + + + + \ No newline at end of file diff --git a/junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java b/junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java new file mode 100644 index 0000000000..e4ba59b22d --- /dev/null +++ b/junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.junit5; + +import org.junit.jupiter.api.Test; + +public class A_UnitTest { + + @Test + public void first() throws Exception{ + System.out.println("Test A first() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("Test A first() end => " + Thread.currentThread().getName()); + } + + @Test + public void second() throws Exception{ + System.out.println("Test A second() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("Test A second() end => " + Thread.currentThread().getName()); + } + +} diff --git a/junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java b/junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java new file mode 100644 index 0000000000..2b195d2551 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.junit5; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; + +public class B_UnitTest { + + @Test + public void first() throws Exception{ + System.out.println("Test B first() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("Test B first() end => " + Thread.currentThread().getName()); + } + + @Test + public void second() throws Exception{ + System.out.println("Test B second() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("Test B second() end => " + Thread.currentThread().getName()); + } + +} diff --git a/junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java b/junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java new file mode 100644 index 0000000000..ce545f6bee --- /dev/null +++ b/junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.junit5; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.ResourceLock; + +import java.util.ArrayList; +import java.util.List; + +public class C_UnitTest { + + private List resources; + + @BeforeEach + void before() { + resources = new ArrayList<>(); + resources.add("test"); + } + + @AfterEach + void after() { + resources.clear(); + } + + @Test + @ResourceLock(value = "resources") + public void first() throws Exception { + System.out.println("Test C first() start => " + Thread.currentThread().getName()); + resources.add("first"); + System.out.println(resources); + Thread.sleep(500); + System.out.println("Test C first() end => " + Thread.currentThread().getName()); + } + + @Test + @ResourceLock(value = "resources") + public void second() throws Exception { + System.out.println("Test C second() start => " + Thread.currentThread().getName()); + resources.add("second"); + System.out.println(resources); + Thread.sleep(500); + System.out.println("Test C second() end => " + Thread.currentThread().getName()); + } +} diff --git a/junit5/src/test/resources/junit-platform.properties b/junit5/src/test/resources/junit-platform.properties new file mode 100644 index 0000000000..42100f85da --- /dev/null +++ b/junit5/src/test/resources/junit-platform.properties @@ -0,0 +1,4 @@ +junit.jupiter.execution.parallel.enabled = true +junit.jupiter.execution.parallel.config.strategy=dynamic +junit.jupiter.execution.parallel.mode.default = concurrent +junit.jupiter.execution.parallel.mode.classes.default = concurrent diff --git a/pom.xml b/pom.xml index f5ac14a009..8d28669313 100644 --- a/pom.xml +++ b/pom.xml @@ -472,6 +472,7 @@ json-path jsoup jta + junit5 kubernetes ksqldb From 1afa3bfcea5becd3fc0f7c4d26027c2975ad9508 Mon Sep 17 00:00:00 2001 From: Ashish Gupta <30566001+gupta-ashu01@users.noreply.github.com> Date: Fri, 15 Oct 2021 12:24:11 +0530 Subject: [PATCH 02/10] BAEL-5126 --- .../src/main/resources/application.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml new file mode 100644 index 0000000000..96f59859a4 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml @@ -0,0 +1,17 @@ +spring: + h2: + console: + enabled: true + path: /h2-console + datasource: + url: jdbc:h2:mem:mydb + username: sa + password: + driverClassName: org.h2.Driver + jpa: + defer-datasource-initialization: true + show-sql: true + hibernate: + format_sql: true + validator.apply_to_ddl: false + ddl-auto: create-drop \ No newline at end of file From 6ada7ea8618d8b606a860af6d0877fa45f612130 Mon Sep 17 00:00:00 2001 From: Ashish Gupta <30566001+gupta-ashu01@users.noreply.github.com> Date: Mon, 18 Oct 2021 10:33:43 +0530 Subject: [PATCH 03/10] Update application.yaml --- .../src/main/resources/application.yaml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml index 96f59859a4..0ad77cc3cb 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml @@ -1,17 +1,14 @@ spring: h2: console: - enabled: true - path: /h2-console + enabled:true + path:/h2-console + console.settings.trace:false + spring.h2.console.settings.web-allow-others:false datasource: - url: jdbc:h2:mem:mydb - username: sa - password: + url:jdbc:h2:mem:mydb + username:sa + password:password driverClassName: org.h2.Driver jpa: - defer-datasource-initialization: true - show-sql: true - hibernate: - format_sql: true - validator.apply_to_ddl: false - ddl-auto: create-drop \ No newline at end of file + spring.jpa.database-platform:org.hibernate.dialect.H2Dialect From faf9c9e3eee649c64cde590ca92f720a6d1d5e23 Mon Sep 17 00:00:00 2001 From: Ashish Gupta <30566001+gupta-ashu01@users.noreply.github.com> Date: Mon, 18 Oct 2021 10:39:18 +0530 Subject: [PATCH 04/10] Update application.yaml --- .../src/main/resources/application.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml index 0ad77cc3cb..aeb33f797a 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml @@ -1,14 +1,14 @@ spring: h2: console: - enabled:true - path:/h2-console - console.settings.trace:false - spring.h2.console.settings.web-allow-others:false + enabled: true + path: /h2-console + console.settings.trace: false + spring.h2.console.settings.web-allow-others: false datasource: - url:jdbc:h2:mem:mydb - username:sa - password:password + url: jdbc:h2:mem:mydb + username: sa + password: password driverClassName: org.h2.Driver jpa: - spring.jpa.database-platform:org.hibernate.dialect.H2Dialect + spring.jpa.database-platform: org.hibernate.dialect.H2Dialect From 4d072e5e090c688e1e419904df96057b39c75dd9 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 18 Oct 2021 13:30:21 +0200 Subject: [PATCH 05/10] JAVA-7578: Fix xstream tests --- .../initializer/SimpleXstreamInitializer.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xstream/src/main/java/com/baeldung/initializer/SimpleXstreamInitializer.java b/xstream/src/main/java/com/baeldung/initializer/SimpleXstreamInitializer.java index c631726eb3..a391b0dca0 100644 --- a/xstream/src/main/java/com/baeldung/initializer/SimpleXstreamInitializer.java +++ b/xstream/src/main/java/com/baeldung/initializer/SimpleXstreamInitializer.java @@ -15,10 +15,18 @@ public class SimpleXstreamInitializer { } public XStream getXstreamJettisonMappedInstance() { - return new XStream(new JettisonMappedXmlDriver()); + XStream xstream = new XStream(new JettisonMappedXmlDriver()); + xstream.allowTypesByWildcard(new String[]{ + "com.baeldung.**" + }); + return xstream; } public XStream getXstreamJsonHierarchicalInstance() { - return new XStream(new JsonHierarchicalStreamDriver()); + XStream xstream = new XStream(new JsonHierarchicalStreamDriver()); + xstream.allowTypesByWildcard(new String[]{ + "com.baeldung.**" + }); + return xstream; } } \ No newline at end of file From b2c4765cc3b305b6044176f0be8be0f0374fbe2d Mon Sep 17 00:00:00 2001 From: Mladen Savic Date: Mon, 18 Oct 2021 18:44:47 +0200 Subject: [PATCH 06/10] Parallel Test Execution for JUnit 5 - refactoring --- junit5/README.md | 6 ---- junit5/pom.xml | 36 ------------------- .../java/com/baeldung/junit5/A_UnitTest.java | 21 ----------- .../java/com/baeldung/junit5/B_UnitTest.java | 23 ------------ .../parallel/FirstParallelUnitTest.java | 21 +++++++++++ .../ParallelResourceLockUnitTest.java | 12 +++---- .../parallel/SecondParallelUnitTest.java | 21 +++++++++++ .../test/resources/junit-platform.properties | 0 8 files changed, 48 insertions(+), 92 deletions(-) delete mode 100644 junit5/README.md delete mode 100644 junit5/pom.xml delete mode 100644 junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java delete mode 100644 junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java create mode 100644 testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/FirstParallelUnitTest.java rename junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java => testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/ParallelResourceLockUnitTest.java (61%) create mode 100644 testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/SecondParallelUnitTest.java rename {junit5 => testing-modules/junit-5-advanced}/src/test/resources/junit-platform.properties (100%) diff --git a/junit5/README.md b/junit5/README.md deleted file mode 100644 index ad16ad164d..0000000000 --- a/junit5/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## JUnit5 - -This module contains articles about the JUnit 5 - -### Relevant Articles: - diff --git a/junit5/pom.xml b/junit5/pom.xml deleted file mode 100644 index b9804408a2..0000000000 --- a/junit5/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - 4.0.0 - junit5 - junit5 - - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - - - - 8 - 8 - - - - - org.junit.jupiter - junit-jupiter-api - 5.8.1 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.8.1 - test - - - - \ No newline at end of file diff --git a/junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java b/junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java deleted file mode 100644 index e4ba59b22d..0000000000 --- a/junit5/src/test/java/com/baeldung/junit5/A_UnitTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.junit5; - -import org.junit.jupiter.api.Test; - -public class A_UnitTest { - - @Test - public void first() throws Exception{ - System.out.println("Test A first() start => " + Thread.currentThread().getName()); - Thread.sleep(500); - System.out.println("Test A first() end => " + Thread.currentThread().getName()); - } - - @Test - public void second() throws Exception{ - System.out.println("Test A second() start => " + Thread.currentThread().getName()); - Thread.sleep(500); - System.out.println("Test A second() end => " + Thread.currentThread().getName()); - } - -} diff --git a/junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java b/junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java deleted file mode 100644 index 2b195d2551..0000000000 --- a/junit5/src/test/java/com/baeldung/junit5/B_UnitTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.junit5; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.parallel.Execution; -import org.junit.jupiter.api.parallel.ExecutionMode; - -public class B_UnitTest { - - @Test - public void first() throws Exception{ - System.out.println("Test B first() start => " + Thread.currentThread().getName()); - Thread.sleep(500); - System.out.println("Test B first() end => " + Thread.currentThread().getName()); - } - - @Test - public void second() throws Exception{ - System.out.println("Test B second() start => " + Thread.currentThread().getName()); - Thread.sleep(500); - System.out.println("Test B second() end => " + Thread.currentThread().getName()); - } - -} diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/FirstParallelUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/FirstParallelUnitTest.java new file mode 100644 index 0000000000..8ac8a161ba --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/FirstParallelUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.parallel; + +import org.junit.jupiter.api.Test; + +public class FirstParallelUnitTest { + + @Test + public void first() throws Exception{ + System.out.println("FirstParallelUnitTest first() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("FirstParallelUnitTest first() end => " + Thread.currentThread().getName()); + } + + @Test + public void second() throws Exception{ + System.out.println("FirstParallelUnitTest second() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("FirstParallelUnitTest second() end => " + Thread.currentThread().getName()); + } + +} diff --git a/junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/ParallelResourceLockUnitTest.java similarity index 61% rename from junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/ParallelResourceLockUnitTest.java index ce545f6bee..ba607b2654 100644 --- a/junit5/src/test/java/com/baeldung/junit5/C_UnitTest.java +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/ParallelResourceLockUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit5; +package com.baeldung.parallel; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -8,7 +8,7 @@ import org.junit.jupiter.api.parallel.ResourceLock; import java.util.ArrayList; import java.util.List; -public class C_UnitTest { +public class ParallelResourceLockUnitTest { private List resources; @@ -26,20 +26,20 @@ public class C_UnitTest { @Test @ResourceLock(value = "resources") public void first() throws Exception { - System.out.println("Test C first() start => " + Thread.currentThread().getName()); + System.out.println("ParallelResourceLockUnitTest first() start => " + Thread.currentThread().getName()); resources.add("first"); System.out.println(resources); Thread.sleep(500); - System.out.println("Test C first() end => " + Thread.currentThread().getName()); + System.out.println("ParallelResourceLockUnitTest first() end => " + Thread.currentThread().getName()); } @Test @ResourceLock(value = "resources") public void second() throws Exception { - System.out.println("Test C second() start => " + Thread.currentThread().getName()); + System.out.println("ParallelResourceLockUnitTest second() start => " + Thread.currentThread().getName()); resources.add("second"); System.out.println(resources); Thread.sleep(500); - System.out.println("Test C second() end => " + Thread.currentThread().getName()); + System.out.println("ParallelResourceLockUnitTest second() end => " + Thread.currentThread().getName()); } } diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/SecondParallelUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/SecondParallelUnitTest.java new file mode 100644 index 0000000000..6a6a83fbd8 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/parallel/SecondParallelUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.parallel; + +import org.junit.jupiter.api.Test; + +public class SecondParallelUnitTest { + + @Test + public void first() throws Exception{ + System.out.println("SecondParallelUnitTest first() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("SecondParallelUnitTest first() end => " + Thread.currentThread().getName()); + } + + @Test + public void second() throws Exception{ + System.out.println("SecondParallelUnitTest second() start => " + Thread.currentThread().getName()); + Thread.sleep(500); + System.out.println("SecondParallelUnitTest second() end => " + Thread.currentThread().getName()); + } + +} diff --git a/junit5/src/test/resources/junit-platform.properties b/testing-modules/junit-5-advanced/src/test/resources/junit-platform.properties similarity index 100% rename from junit5/src/test/resources/junit-platform.properties rename to testing-modules/junit-5-advanced/src/test/resources/junit-platform.properties From 3a2eee308c0259169ab0762bb29cecc42cddb054 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 18 Oct 2021 18:48:13 +0200 Subject: [PATCH 07/10] BAEL-5095 Dockerfile strategies for Git (#11348) Co-authored-by: majewsk6 --- docker/dockerfile-with-git/.gitmodules | 4 ++++ docker/dockerfile-with-git/Dockerfile | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 docker/dockerfile-with-git/.gitmodules create mode 100644 docker/dockerfile-with-git/Dockerfile diff --git a/docker/dockerfile-with-git/.gitmodules b/docker/dockerfile-with-git/.gitmodules new file mode 100644 index 0000000000..aa3911dfc3 --- /dev/null +++ b/docker/dockerfile-with-git/.gitmodules @@ -0,0 +1,4 @@ +[submodule "project"] + path = project + url = https://github.com/eugenp/tutorials.git + branch = master \ No newline at end of file diff --git a/docker/dockerfile-with-git/Dockerfile b/docker/dockerfile-with-git/Dockerfile new file mode 100644 index 0000000000..91dfee3bc6 --- /dev/null +++ b/docker/dockerfile-with-git/Dockerfile @@ -0,0 +1,13 @@ +ADD . /project/ +ADD /build/ /project/ +ADD /output/project.jar /project/ + +ADD ssh-private-key /root/.ssh/id_rsa +RUN git clone git@github.com:eugenp/tutorials.git + +ARG username=$GIT_USERNAME +ARG password=$GIT_PASSWORD +RUN git clone https://username:password@github.com:eugenp/tutorials.git + +VOLUME /build/ /project/ + From 5f20ca1a780625961a56d353901aea06431f4e32 Mon Sep 17 00:00:00 2001 From: Mladen Savic Date: Mon, 18 Oct 2021 21:40:50 +0200 Subject: [PATCH 08/10] Parallel Test Execution for JUnit 5 - fixed module issue --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index fccee8823f..1e26d09906 100644 --- a/pom.xml +++ b/pom.xml @@ -472,7 +472,6 @@ json-path jsoup jta - junit5 kubernetes ksqldb From 025afb1f7d348d3ef8027aa9f3eb7bf9584e713a Mon Sep 17 00:00:00 2001 From: Andrey Bichkevski <1533091+andbi@users.noreply.github.com> Date: Mon, 18 Oct 2021 20:22:37 -0500 Subject: [PATCH 09/10] BAEL-5143 (#11273) * BAEL-5143 * Modified as per PR comments * The List<> type for session data is changed to a more generic Collection<> * Version upgrade Co-authored-by: 0swald --- rule-engines/evrete/pom.xml | 35 ++++++++ .../evrete/introduction/IntroductionAJR.java | 47 ++++++++++ .../introduction/IntroductionInline.java | 58 ++++++++++++ .../evrete/introduction/model/Customer.java | 26 ++++++ .../evrete/introduction/model/Invoice.java | 19 ++++ .../evrete/src/main/resources/logback.xml | 13 +++ .../main/resources/rules/SalesRuleset.java | 20 +++++ .../introduction/IntroductionAJRUnitTest.java | 80 +++++++++++++++++ .../IntroductionInlineUnitTest.java | 90 +++++++++++++++++++ rule-engines/pom.xml | 1 + 10 files changed, 389 insertions(+) create mode 100644 rule-engines/evrete/pom.xml create mode 100644 rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionAJR.java create mode 100644 rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionInline.java create mode 100644 rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Customer.java create mode 100644 rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Invoice.java create mode 100644 rule-engines/evrete/src/main/resources/logback.xml create mode 100644 rule-engines/evrete/src/main/resources/rules/SalesRuleset.java create mode 100644 rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionAJRUnitTest.java create mode 100644 rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionInlineUnitTest.java diff --git a/rule-engines/evrete/pom.xml b/rule-engines/evrete/pom.xml new file mode 100644 index 0000000000..819a912c43 --- /dev/null +++ b/rule-engines/evrete/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + com.baeldung.evrete + evrete + 1.0 + evrete + + + 2.1.04 + + + + com.baeldung + rule-engines + 1.0.0-SNAPSHOT + + + + + + org.evrete + evrete-core + ${evrete.version} + + + + org.evrete + evrete-dsl-java + ${evrete.version} + + + \ No newline at end of file diff --git a/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionAJR.java b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionAJR.java new file mode 100644 index 0000000000..287d083311 --- /dev/null +++ b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionAJR.java @@ -0,0 +1,47 @@ +package com.baeldung.evrete.introduction; + +import com.baeldung.evrete.introduction.model.Customer; +import com.baeldung.evrete.introduction.model.Invoice; +import org.evrete.KnowledgeService; +import org.evrete.api.Knowledge; + +import java.io.IOException; +import java.net.URL; +import java.util.*; + +public class IntroductionAJR { + public static void main(String[] args) throws IOException { + ClassLoader classLoader = IntroductionAJR.class.getClassLoader(); + KnowledgeService service = new KnowledgeService(); + URL rulesetUrl = classLoader.getResource("rules/SalesRuleset.java"); + Knowledge knowledge = service.newKnowledge( + "JAVA-SOURCE", + rulesetUrl + ); + + List customers = Arrays.asList( + new Customer("Customer A"), + new Customer("Customer B"), + new Customer("Customer C") + ); + + Random random = new Random(); + Collection sessionData = new LinkedList<>(customers); + for (int i = 0; i < 100_000; i++) { + Customer randomCustomer = customers.get(random.nextInt(customers.size())); + Invoice invoice = new Invoice(randomCustomer, 100 * random.nextDouble()); + sessionData.add(invoice); + } + + knowledge + .newStatelessSession() + .insert(sessionData) + .fire(); + + for (Customer c : customers) { + System.out.printf("%s:\t$%,.2f%n", c.getName(), c.getTotal()); + } + + service.shutdown(); + } +} diff --git a/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionInline.java b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionInline.java new file mode 100644 index 0000000000..8867a72d23 --- /dev/null +++ b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/IntroductionInline.java @@ -0,0 +1,58 @@ +package com.baeldung.evrete.introduction; + +import org.evrete.KnowledgeService; +import org.evrete.api.Knowledge; +import com.baeldung.evrete.introduction.model.*; + +import java.util.*; + +public class IntroductionInline { + public static void main(String[] args) { + KnowledgeService service = new KnowledgeService(); + Knowledge knowledge = service + .newKnowledge() + .newRule("Clear total sales") + .forEach("$c", Customer.class) + .execute(ctx -> { + Customer c = ctx.get("$c"); + c.setTotal(0.0); + }) + .newRule("Compute totals") + .forEach( + "$c", Customer.class, + "$i", Invoice.class + ) + .where("$i.customer == $c") + .execute(ctx -> { + Customer c = ctx.get("$c"); + Invoice i = ctx.get("$i"); + c.addToTotal(i.getAmount()); + }); + + + List customers = Arrays.asList( + new Customer("Customer A"), + new Customer("Customer B"), + new Customer("Customer C") + ); + + Random random = new Random(); + Collection sessionData = new LinkedList<>(customers); + for (int i = 0; i < 100_000; i++) { + Customer randomCustomer = customers.get(random.nextInt(customers.size())); + Invoice invoice = new Invoice(randomCustomer, 100 * random.nextDouble()); + sessionData.add(invoice); + } + + knowledge + .newStatelessSession() + .insert(sessionData) + .fire(); + + for (Customer c : customers) { + System.out.printf("%s:\t$%,.2f%n", c.getName(), c.getTotal()); + } + + service.shutdown(); + } +} diff --git a/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Customer.java b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Customer.java new file mode 100644 index 0000000000..9a60850d7c --- /dev/null +++ b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Customer.java @@ -0,0 +1,26 @@ +package com.baeldung.evrete.introduction.model; + +public class Customer { + private double total = 0.0; + private final String name; + + public Customer(String name) { + this.name = name; + } + + public void addToTotal(double amount) { + this.total += amount; + } + + public String getName() { + return name; + } + + public double getTotal() { + return total; + } + + public void setTotal(double total) { + this.total = total; + } +} diff --git a/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Invoice.java b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Invoice.java new file mode 100644 index 0000000000..3be4fd2908 --- /dev/null +++ b/rule-engines/evrete/src/main/java/com/baeldung/evrete/introduction/model/Invoice.java @@ -0,0 +1,19 @@ +package com.baeldung.evrete.introduction.model; + +public class Invoice { + private final Customer customer; + private final double amount; + + public Invoice(Customer customer, double amount) { + this.customer = customer; + this.amount = amount; + } + + public Customer getCustomer() { + return customer; + } + + public double getAmount() { + return amount; + } +} diff --git a/rule-engines/evrete/src/main/resources/logback.xml b/rule-engines/evrete/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/rule-engines/evrete/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/rule-engines/evrete/src/main/resources/rules/SalesRuleset.java b/rule-engines/evrete/src/main/resources/rules/SalesRuleset.java new file mode 100644 index 0000000000..d36aca9c4d --- /dev/null +++ b/rule-engines/evrete/src/main/resources/rules/SalesRuleset.java @@ -0,0 +1,20 @@ +package org.abc.author1; + +import com.baeldung.evrete.introduction.model.Customer; +import com.baeldung.evrete.introduction.model.Invoice; +import org.evrete.dsl.annotation.Rule; +import org.evrete.dsl.annotation.Where; + +public class SalesRuleset { + + @Rule + public void rule1(Customer $c) { + $c.setTotal(0.0); + } + + @Rule + @Where("$i.customer == $c") + public void rule2(Customer $c, Invoice $i) { + $c.addToTotal($i.getAmount()); + } +} \ No newline at end of file diff --git a/rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionAJRUnitTest.java b/rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionAJRUnitTest.java new file mode 100644 index 0000000000..955dbb2fe1 --- /dev/null +++ b/rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionAJRUnitTest.java @@ -0,0 +1,80 @@ +package com.baeldung.evrete.introduction; + +import com.baeldung.evrete.introduction.model.Customer; +import com.baeldung.evrete.introduction.model.Invoice; +import org.evrete.KnowledgeService; +import org.evrete.api.Knowledge; +import org.evrete.api.RuleSession; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.io.IOException; +import java.util.*; + +class IntroductionAJRUnitTest { + private static KnowledgeService service; + + @BeforeAll + static void setUpClass() { + service = new KnowledgeService(); + } + + @AfterAll + static void shutDownClass() { + service.shutdown(); + } + + /** + * This test makes sure that each customer's actual total sales is equal to the amount + * computed by the rule engine + */ + @ParameterizedTest + @ValueSource(strings = {"true", "false"}) + void sessionTotalsTest(String type) throws IOException { + boolean stateful = Boolean.parseBoolean(type); + ClassLoader classLoader = IntroductionAJR.class.getClassLoader(); + KnowledgeService service = new KnowledgeService(); + Knowledge knowledge = service + .newKnowledge( + "JAVA-SOURCE", + classLoader.getResource("rules/SalesRuleset.java") + ); + + + List customers = Arrays.asList( + new Customer("Customer A"), + new Customer("Customer B"), + new Customer("Customer C") + ); + Collection sessionData = new LinkedList<>(customers); + + HashMap actualTotals = new HashMap<>(); + Random random = new Random(); + for (int i = 0; i < 1_000; i++) { + Customer randomCustomer = customers.get(random.nextInt(customers.size())); + Invoice invoice = new Invoice(randomCustomer, random.nextInt(100)); + sessionData.add(invoice); + + Double d = actualTotals.get(randomCustomer); + if(d == null) { + d = 0.0; + } + d = d + invoice.getAmount(); + actualTotals.put(randomCustomer, d); + } + + RuleSession session = stateful ? knowledge.newStatefulSession() : knowledge.newStatelessSession(); + session + .insert(sessionData) + .fire(); + + for(Customer c : customers) { + double d1 = c.getTotal(); + double d2 = actualTotals.get(c); + assert d1 == d2; + } + + } +} \ No newline at end of file diff --git a/rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionInlineUnitTest.java b/rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionInlineUnitTest.java new file mode 100644 index 0000000000..0a6aac83bd --- /dev/null +++ b/rule-engines/evrete/src/test/java/com/baeldung/evrete/introduction/IntroductionInlineUnitTest.java @@ -0,0 +1,90 @@ +package com.baeldung.evrete.introduction; + +import com.baeldung.evrete.introduction.model.Customer; +import com.baeldung.evrete.introduction.model.Invoice; +import org.evrete.KnowledgeService; +import org.evrete.api.Knowledge; +import org.evrete.api.RuleSession; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.*; + +class IntroductionInlineUnitTest { + private static KnowledgeService service; + + @BeforeAll + static void setUpClass() { + service = new KnowledgeService(); + } + + @AfterAll + static void shutDownClass() { + service.shutdown(); + } + + /** + * This test makes sure that each customer's actual total sales is equal to the amount + * computed by the rule engine + */ + @ParameterizedTest + @ValueSource(strings = {"true", "false"}) + void sessionTotalsTest(String type) { + boolean stateful = Boolean.parseBoolean(type); + Knowledge knowledge = service + .newKnowledge() + .newRule("Clear customer's total sales") + .forEach("$c", Customer.class) + .execute(ctx -> { + Customer c = ctx.get("$c"); + c.setTotal(0.0); + }) + .newRule("Compute totals") + .forEach( + "$c", Customer.class, + "$i", Invoice.class + ) + .where("$i.customer == $c") + .execute(ctx -> { + Customer c = ctx.get("$c"); + Invoice i = ctx.get("$i"); + c.addToTotal(i.getAmount()); + }); + + + List customers = Arrays.asList( + new Customer("Customer A"), + new Customer("Customer B"), + new Customer("Customer C") + ); + Collection sessionData = new LinkedList<>(customers); + + HashMap actualTotals = new HashMap<>(); + Random random = new Random(); + for (int i = 0; i < 1_000; i++) { + Customer randomCustomer = customers.get(random.nextInt(customers.size())); + Invoice invoice = new Invoice(randomCustomer, random.nextInt(100)); + sessionData.add(invoice); + + Double d = actualTotals.get(randomCustomer); + if(d == null) { + d = 0.0; + } + d = d + invoice.getAmount(); + actualTotals.put(randomCustomer, d); + } + + RuleSession session = stateful ? knowledge.newStatefulSession() : knowledge.newStatelessSession(); + session + .insert(sessionData) + .fire(); + + for(Customer c : customers) { + double d1 = c.getTotal(); + double d2 = actualTotals.get(c); + assert d1 == d2; + } + } +} \ No newline at end of file diff --git a/rule-engines/pom.xml b/rule-engines/pom.xml index db6b2e47ef..6d8a014128 100644 --- a/rule-engines/pom.xml +++ b/rule-engines/pom.xml @@ -15,6 +15,7 @@ easy-rules + evrete openl-tablets rulebook From 2dfd2e9e273a27c74c43033d80ef786c7ff0ee9c Mon Sep 17 00:00:00 2001 From: kwoyke Date: Tue, 19 Oct 2021 10:37:14 +0200 Subject: [PATCH 10/10] BAEL-5219: Fix spring-mvc-webflow and spring-mvc-xml poms (#11350) --- spring-web-modules/spring-mvc-webflow/pom.xml | 4 ++-- spring-web-modules/spring-mvc-xml/pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-web-modules/spring-mvc-webflow/pom.xml b/spring-web-modules/spring-mvc-webflow/pom.xml index 2e150e2d01..49037e7186 100644 --- a/spring-web-modules/spring-mvc-webflow/pom.xml +++ b/spring-web-modules/spring-mvc-webflow/pom.xml @@ -10,8 +10,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + spring-web-modules + 0.0.1-SNAPSHOT diff --git a/spring-web-modules/spring-mvc-xml/pom.xml b/spring-web-modules/spring-mvc-xml/pom.xml index 354d652095..e67052e0cd 100644 --- a/spring-web-modules/spring-mvc-xml/pom.xml +++ b/spring-web-modules/spring-mvc-xml/pom.xml @@ -10,8 +10,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + spring-web-modules + 0.0.1-SNAPSHOT