From 6762557f1ec4e0731aa8291d02b8e93ce91b966a Mon Sep 17 00:00:00 2001
From: fejera <attila@javadev.hu>
Date: Sun, 17 Nov 2019 15:04:03 +0100
Subject: [PATCH 001/404] added live-all profile to root pom

---
 pom.xml | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/pom.xml b/pom.xml
index bc4c38f386..63561cb65e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1671,6 +1671,39 @@
             </modules>
 
         </profile>
+        
+        <profile>
+            <id>live-all</id>
+
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <excludes>
+                                <exclude>**/SpringContextTest.java</exclude>
+                                <exclude>**/*UnitTest.java</exclude>
+                                <exclude>**/*IntegrationTest.java</exclude>
+                                <exclude>**/*IntTest.java</exclude>
+                                <exclude>**/*LongRunningUnitTest.java</exclude>
+                                <exclude>**/*ManualTest.java</exclude>
+                                <exclude>**/*JdbcTest.java</exclude>
+                            </excludes>
+                            <includes>
+                                <include>**/*LiveTest.java</include>
+                            </includes>
+                        </configuration>
+                    </plugin>
+                    
+                </plugins>
+            </build>
+            
+            <!-- <modules> -->
+                <!-- <module>persistence-modules</module> -->
+            <!-- </modules> -->
+
+        </profile>
 
 
     </profiles>

From ae8ef36227de957b2696acf94bb782941dcefe1a Mon Sep 17 00:00:00 2001
From: fejera <attila@javadev.hu>
Date: Sun, 17 Nov 2019 15:05:58 +0100
Subject: [PATCH 002/404] added live-test resources

---
 persistence-modules/spring-data-mongodb/live-test.sh  | 11 +++++++++++
 .../spring-data-mongodb/live-test/Dockerfile          |  8 ++++++++
 .../spring-data-mongodb/live-test/init-session.js     |  1 +
 3 files changed, 20 insertions(+)
 create mode 100755 persistence-modules/spring-data-mongodb/live-test.sh
 create mode 100644 persistence-modules/spring-data-mongodb/live-test/Dockerfile
 create mode 100644 persistence-modules/spring-data-mongodb/live-test/init-session.js

diff --git a/persistence-modules/spring-data-mongodb/live-test.sh b/persistence-modules/spring-data-mongodb/live-test.sh
new file mode 100755
index 0000000000..bb513a90bb
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/live-test.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+docker image build -t spring-data-mongodb:live-test live-test/
+
+docker run -p 27017:27017 --name spring-data-mongodb-live-test -it spring-data-mongodb:live-test
+#wait
+
+mvn clean compile test -P live-all
+
+docker stop spring-data-mongodb-live-test
+docker rm spring-data-mongodb-live-test
diff --git a/persistence-modules/spring-data-mongodb/live-test/Dockerfile b/persistence-modules/spring-data-mongodb/live-test/Dockerfile
new file mode 100644
index 0000000000..9e3634feb0
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/live-test/Dockerfile
@@ -0,0 +1,8 @@
+FROM mongo:4.2.1
+
+COPY init-session.js /docker-entrypoint-initdb.d/
+
+EXPOSE 27017
+
+HEALTHCHECK --interval=5s --timeout=3s --start-period=10s CMD mongo db.stats()
+CMD ["mongod", "--replSet", "rs0"]
diff --git a/persistence-modules/spring-data-mongodb/live-test/init-session.js b/persistence-modules/spring-data-mongodb/live-test/init-session.js
new file mode 100644
index 0000000000..2e968884cc
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/live-test/init-session.js
@@ -0,0 +1 @@
+rs.initiate();

From 23fb4ae451fef29cb5a81d486542e32cb4d5b979 Mon Sep 17 00:00:00 2001
From: fejera <attila@javadev.hu>
Date: Sun, 24 Nov 2019 12:42:59 +0100
Subject: [PATCH 003/404] cleaned up and documented live testing script usage

---
 persistence-modules/spring-data-mongodb/LIVE-TEST.md     | 9 +++++++++
 .../spring-data-mongodb/live-test-setup.sh               | 5 +++++
 .../spring-data-mongodb/live-test-teardown.sh            | 4 ++++
 persistence-modules/spring-data-mongodb/live-test.sh     | 8 --------
 4 files changed, 18 insertions(+), 8 deletions(-)
 create mode 100644 persistence-modules/spring-data-mongodb/LIVE-TEST.md
 create mode 100644 persistence-modules/spring-data-mongodb/live-test-setup.sh
 create mode 100644 persistence-modules/spring-data-mongodb/live-test-teardown.sh

diff --git a/persistence-modules/spring-data-mongodb/LIVE-TEST.md b/persistence-modules/spring-data-mongodb/LIVE-TEST.md
new file mode 100644
index 0000000000..9da1ea249e
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/LIVE-TEST.md
@@ -0,0 +1,9 @@
+=========
+
+## Spring Data MongoDB Live Testing
+
+
+There are 3 scripts to simplify running live tests:
+1. `live-test-setup.sh` builds a docker image with the necessary setup and runs it. The environment is ready, when the log stops - it takes approximately 30 seconds.
+2. `live-test.sh` runs the live tests (but no other tests).
+3. `live-test-setup.sh` stops and removes the docker image.
diff --git a/persistence-modules/spring-data-mongodb/live-test-setup.sh b/persistence-modules/spring-data-mongodb/live-test-setup.sh
new file mode 100644
index 0000000000..37e6c48dbd
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/live-test-setup.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+docker image build -t spring-data-mongodb:live-test live-test/
+
+docker run -p 27017:27017 --name spring-data-mongodb-live-test spring-data-mongodb:live-test
diff --git a/persistence-modules/spring-data-mongodb/live-test-teardown.sh b/persistence-modules/spring-data-mongodb/live-test-teardown.sh
new file mode 100644
index 0000000000..a29163bc7a
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/live-test-teardown.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+docker stop spring-data-mongodb-live-test
+docker rm spring-data-mongodb-live-test
diff --git a/persistence-modules/spring-data-mongodb/live-test.sh b/persistence-modules/spring-data-mongodb/live-test.sh
index bb513a90bb..5a079bdac8 100755
--- a/persistence-modules/spring-data-mongodb/live-test.sh
+++ b/persistence-modules/spring-data-mongodb/live-test.sh
@@ -1,11 +1,3 @@
 #!/bin/bash
 
-docker image build -t spring-data-mongodb:live-test live-test/
-
-docker run -p 27017:27017 --name spring-data-mongodb-live-test -it spring-data-mongodb:live-test
-#wait
-
 mvn clean compile test -P live-all
-
-docker stop spring-data-mongodb-live-test
-docker rm spring-data-mongodb-live-test

From 1afd7a40e20ba55edd147e2f95c873f46c3b8539 Mon Sep 17 00:00:00 2001
From: fejera <attila@javadev.hu>
Date: Mon, 2 Dec 2019 10:18:42 +0100
Subject: [PATCH 004/404] moved live test resources to src/live-test/resources

---
 persistence-modules/spring-data-mongodb/live-test-setup.sh      | 2 +-
 .../{live-test => src/live-test/resources}/Dockerfile           | 0
 .../{live-test => src/live-test/resources}/init-session.js      | 0
 3 files changed, 1 insertion(+), 1 deletion(-)
 rename persistence-modules/spring-data-mongodb/{live-test => src/live-test/resources}/Dockerfile (100%)
 rename persistence-modules/spring-data-mongodb/{live-test => src/live-test/resources}/init-session.js (100%)

diff --git a/persistence-modules/spring-data-mongodb/live-test-setup.sh b/persistence-modules/spring-data-mongodb/live-test-setup.sh
index 37e6c48dbd..e8e0437083 100644
--- a/persistence-modules/spring-data-mongodb/live-test-setup.sh
+++ b/persistence-modules/spring-data-mongodb/live-test-setup.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
 
-docker image build -t spring-data-mongodb:live-test live-test/
+docker image build -t spring-data-mongodb:live-test src/live-test/resources/
 
 docker run -p 27017:27017 --name spring-data-mongodb-live-test spring-data-mongodb:live-test
diff --git a/persistence-modules/spring-data-mongodb/live-test/Dockerfile b/persistence-modules/spring-data-mongodb/src/live-test/resources/Dockerfile
similarity index 100%
rename from persistence-modules/spring-data-mongodb/live-test/Dockerfile
rename to persistence-modules/spring-data-mongodb/src/live-test/resources/Dockerfile
diff --git a/persistence-modules/spring-data-mongodb/live-test/init-session.js b/persistence-modules/spring-data-mongodb/src/live-test/resources/init-session.js
similarity index 100%
rename from persistence-modules/spring-data-mongodb/live-test/init-session.js
rename to persistence-modules/spring-data-mongodb/src/live-test/resources/init-session.js

From 421d15b1324cde53a91abc359d5a88ab93b99a1a Mon Sep 17 00:00:00 2001
From: mrsoto <mrsoto@users.noreply.github.com>
Date: Sat, 14 Dec 2019 22:03:27 -0300
Subject: [PATCH 005/404] Cleanup and function references

---
 .../convertlisttomap/ConvertListToMapService.java    |  3 ++-
 .../CollectionToArrayListUnitTest.java               | 12 ++++++------
 .../ConvertIteratorToListServiceUnitTest.java        |  6 +++---
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
index 6527d35742..57579e948f 100644
--- a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
+++ b/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
@@ -6,6 +6,7 @@ import org.apache.commons.collections4.MapUtils;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 public class ConvertListToMapService {
@@ -21,7 +22,7 @@ public class ConvertListToMapService {
     }
 
     public Map<Integer, Animal> convertListAfterJava8(List<Animal> list) {
-        Map<Integer, Animal> map = list.stream().collect(Collectors.toMap(Animal::getId, animal -> animal));
+        Map<Integer, Animal> map = list.stream().collect(Collectors.toMap(Animal::getId, Function.identity()));
         return map;
     }
 
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
index ad2ab2a756..15960c300d 100644
--- a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
@@ -53,14 +53,14 @@ public class CollectionToArrayListUnitTest {
 
         verifyShallowCopy(srcCollection, newList);
     }
-    
+
     /**
      * Section 5. Deep Copy
      */
     @Test
     public void whenUsingDeepCopy_thenVerifyDeepCopy() {
         ArrayList<Foo> newList = srcCollection.stream()
-          .map(foo -> foo.deepCopy())
+          .map(Foo::deepCopy)
           .collect(toCollection(ArrayList::new));
 
         verifyDeepCopy(srcCollection, newList);
@@ -83,13 +83,13 @@ public class CollectionToArrayListUnitTest {
      * @param a
      * @param b 
      */
-    private void verifyShallowCopy(Collection a, Collection b) {
+    private void verifyShallowCopy(Collection<Foo> a, Collection<Foo> b) {
         assertEquals("Collections have different lengths", a.size(), b.size());
         Iterator<Foo> iterA = a.iterator();
         Iterator<Foo> iterB = b.iterator();
         while (iterA.hasNext()) {
             // use '==' to test instance identity
-            assertTrue("Foo instances differ!", iterA.next() == iterB.next());
+            assertSame("Foo instances differ!", iterA.next(), iterB.next());
         }
     }
     
@@ -98,7 +98,7 @@ public class CollectionToArrayListUnitTest {
      * @param a
      * @param b 
      */
-    private void verifyDeepCopy(Collection a, Collection b) {
+    private void verifyDeepCopy(Collection<Foo> a, Collection<Foo> b) {
         assertEquals("Collections have different lengths", a.size(), b.size());
         Iterator<Foo> iterA = a.iterator();
         Iterator<Foo> iterB = b.iterator();
@@ -106,7 +106,7 @@ public class CollectionToArrayListUnitTest {
             Foo nextA = iterA.next();
             Foo nextB = iterB.next();
             // should not be same instance
-            assertFalse("Foo instances are the same!", nextA == nextB);
+            assertNotSame("Foo instances are the same!", nextA, nextB);
             // but should have same content
             assertFalse("Foo instances have different content!", fooDiff(nextA, nextB));
         }
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
index 4d6cba7d27..7d94f88d21 100644
--- a/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
@@ -23,7 +23,7 @@ public class ConvertIteratorToListServiceUnitTest {
     Iterator<Integer> iterator;
 
     @Before
-    public void setUp() throws Exception {
+    public void setUp() {
         iterator = Arrays.asList(1, 2, 3)
             .iterator();
     }
@@ -31,7 +31,7 @@ public class ConvertIteratorToListServiceUnitTest {
     @Test
     public void givenAnIterator_whenConvertIteratorToListUsingWhileLoop_thenReturnAList() {
 
-        List<Integer> actualList = new ArrayList<Integer>();
+        List<Integer> actualList = new ArrayList<>();
 
         // Convert Iterator to List using while loop dsf
         while (iterator.hasNext()) {
@@ -44,7 +44,7 @@ public class ConvertIteratorToListServiceUnitTest {
 
     @Test
     public void givenAnIterator_whenConvertIteratorToListAfterJava8_thenReturnAList() {
-        List<Integer> actualList = new ArrayList<Integer>();
+        List<Integer> actualList = new ArrayList<>();
 
         // Convert Iterator to List using Java 8
         iterator.forEachRemaining(actualList::add);

From 84c71c639906885edb1b343d7425a872081cc55c Mon Sep 17 00:00:00 2001
From: cxmshine <13724591964@163.com>
Date: Thu, 9 Jan 2020 23:45:10 +0800
Subject: [PATCH 006/404] update AddressMapper.java

---
 .../main/java/com/baeldung/mybatis/mapper/AddressMapper.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java b/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java
index e96a4837db..c79ef667bd 100644
--- a/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java
+++ b/mybatis/src/main/java/com/baeldung/mybatis/mapper/AddressMapper.java
@@ -14,8 +14,8 @@ public interface AddressMapper {
 	@Results(value = { @Result(property = "addressId", column = "addressId"),
 			@Result(property = "streetAddress", column = "streetAddress"),
 			@Result(property = "person", column = "personId", javaType = Person.class, one = @One(select = "getPerson")) })
-	Address getAddresses(Integer addressID);
+	Address getAddresses(Integer addressId);
 
 	@Select("SELECT personId FROM address WHERE addressId = #{addressId})")
-	Person getPerson(Integer personId);
+	Person getPerson(Integer addressId);
 }

From eb4e462b36f2e486e7b51865ea6e9a62c161d928 Mon Sep 17 00:00:00 2001
From: crist <cristi.rosu4@gmail.com>
Date: Tue, 4 Feb 2020 18:20:00 +0200
Subject: [PATCH 007/404] [BAEL-3750] Breaking YAML Strings Over Multiple Lines

---
 yaml/README.md                                |  7 ++
 yaml/pom.xml                                  | 29 ++++++
 .../multiline/MultiLineStringsUnitTest.java   | 90 +++++++++++++++++++
 .../src/test/resources/multi-line/folded.yaml |  4 +
 .../test/resources/multi-line/folded2.yaml    |  9 ++
 .../resources/multi-line/folded_keep.yaml     |  6 ++
 .../resources/multi-line/folded_strip.yaml    |  7 ++
 .../test/resources/multi-line/literal.yaml    |  4 +
 .../test/resources/multi-line/literal2.yaml   | 10 +++
 .../resources/multi-line/literal_keep.yaml    |  5 ++
 .../resources/multi-line/literal_strip.yaml   |  5 ++
 .../multi-line/plain_double_quotes.yaml       |  1 +
 .../multi-line/plain_single_quotes.yaml       |  3 +
 13 files changed, 180 insertions(+)
 create mode 100644 yaml/README.md
 create mode 100644 yaml/pom.xml
 create mode 100644 yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
 create mode 100644 yaml/src/test/resources/multi-line/folded.yaml
 create mode 100644 yaml/src/test/resources/multi-line/folded2.yaml
 create mode 100644 yaml/src/test/resources/multi-line/folded_keep.yaml
 create mode 100644 yaml/src/test/resources/multi-line/folded_strip.yaml
 create mode 100644 yaml/src/test/resources/multi-line/literal.yaml
 create mode 100644 yaml/src/test/resources/multi-line/literal2.yaml
 create mode 100644 yaml/src/test/resources/multi-line/literal_keep.yaml
 create mode 100644 yaml/src/test/resources/multi-line/literal_strip.yaml
 create mode 100644 yaml/src/test/resources/multi-line/plain_double_quotes.yaml
 create mode 100644 yaml/src/test/resources/multi-line/plain_single_quotes.yaml

diff --git a/yaml/README.md b/yaml/README.md
new file mode 100644
index 0000000000..ebf403eb57
--- /dev/null
+++ b/yaml/README.md
@@ -0,0 +1,7 @@
+## YAML
+
+This module contains articles about YAML
+
+### Relevant articles
+
+
diff --git a/yaml/pom.xml b/yaml/pom.xml
new file mode 100644
index 0000000000..c801505c6a
--- /dev/null
+++ b/yaml/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>yaml</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-modules</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>1.21</version>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <snakeyaml.version>1.21</snakeyaml.version>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java b/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
new file mode 100644
index 0000000000..c97faa355a
--- /dev/null
+++ b/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.multiline;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class MultiLineStringsUnitTest {
+
+    private Yaml yaml;
+
+    @Before
+    public void setup() {
+        yaml = new Yaml();
+    }
+
+    @Test
+    public void whenLiteral_ThenLineBreaksArePresent() {
+        String key = parseYamlKey("literal.yaml");
+        assertEquals("Line1\nLine2\nLine3", key);
+    }
+
+    @Test
+    public void whenLiteral_ThenEndingBreaksAreReducedToOne() {
+        String key = parseYamlKey("literal2.yaml");
+        assertEquals("\n\nLine1\n\nLine2\n\nLine3\n", key);
+    }
+
+    @Test
+    public void whenFolded_ThenLineBreaksAreReplaced() {
+        String key = parseYamlKey("folded.yaml");
+        assertEquals("Line1 Line2 Line3", key);
+    }
+
+    @Test
+    public void whenFolded_ThenEmptyLinesAreReducedToOne() {
+        String key = parseYamlKey("folded2.yaml");
+        assertEquals("Line1\nLine2\n\nLine3\n", key);
+    }
+
+    @Test
+    public void whenLiteralKeep_ThenLastEmptyLinesArePresent() {
+        String key = parseYamlKey("literal_keep.yaml");
+        assertEquals("Line1\nLine2\nLine3\n\n", key);
+    }
+
+    @Test
+    public void whenLiteralStrip_ThenLastEmptyLinesAreRemoved() {
+        String key = parseYamlKey("literal_strip.yaml");
+        assertEquals("Line1\nLine2\nLine3", key);
+    }
+
+    @Test
+    public void whenFoldedKeep_ThenLastEmptyLinesArePresent() {
+        String key = parseYamlKey("folded_keep.yaml");
+        assertEquals("Line1 Line2 Line3\n\n\n", key);
+    }
+
+    @Test
+    public void whenFoldedStrip_ThenLastEmptyLinesAreRemoved() {
+        String key = parseYamlKey("folded_strip.yaml");
+        assertEquals("Line1 Line2 Line3", key);
+    }
+
+    @Test
+    public void whenDoubleQuotes_ThenExplicitBreaksArePreserved() {
+        String key = parseYamlKey("plain_double_quotes.yaml");
+        assertEquals("Line1\nLine2\nLine3", key);
+    }
+
+    @Test
+    public void whenSingleQuotes_ThenExplicitBreaksAreIgnored() {
+        String key = parseYamlKey("plain_single_quotes.yaml");
+        assertEquals("Line1\\nLine2\nLine3", key);
+    }
+
+    private String parseYamlKey(String fileName) {
+        InputStream inputStream = this.getClass()
+                .getClassLoader()
+                .getResourceAsStream("multi-line" + File.separator + fileName);
+        Map<String, String> parsed = yaml.load(inputStream);
+        return parsed.get("key");
+    }
+
+}
diff --git a/yaml/src/test/resources/multi-line/folded.yaml b/yaml/src/test/resources/multi-line/folded.yaml
new file mode 100644
index 0000000000..c5fa743a08
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/folded.yaml
@@ -0,0 +1,4 @@
+key: >
+  Line1
+  Line2
+  Line3
\ No newline at end of file
diff --git a/yaml/src/test/resources/multi-line/folded2.yaml b/yaml/src/test/resources/multi-line/folded2.yaml
new file mode 100644
index 0000000000..a7f244994a
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/folded2.yaml
@@ -0,0 +1,9 @@
+key: >
+  Line1
+
+  Line2
+
+
+  Line3
+
+
diff --git a/yaml/src/test/resources/multi-line/folded_keep.yaml b/yaml/src/test/resources/multi-line/folded_keep.yaml
new file mode 100644
index 0000000000..555291fd26
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/folded_keep.yaml
@@ -0,0 +1,6 @@
+key: >+
+  Line1
+  Line2
+  Line3
+
+
diff --git a/yaml/src/test/resources/multi-line/folded_strip.yaml b/yaml/src/test/resources/multi-line/folded_strip.yaml
new file mode 100644
index 0000000000..0a3a246dc2
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/folded_strip.yaml
@@ -0,0 +1,7 @@
+key: >-
+  Line1
+  Line2
+  Line3
+
+
+
diff --git a/yaml/src/test/resources/multi-line/literal.yaml b/yaml/src/test/resources/multi-line/literal.yaml
new file mode 100644
index 0000000000..7e02501a33
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/literal.yaml
@@ -0,0 +1,4 @@
+key: |
+  Line1
+  Line2
+  Line3
\ No newline at end of file
diff --git a/yaml/src/test/resources/multi-line/literal2.yaml b/yaml/src/test/resources/multi-line/literal2.yaml
new file mode 100644
index 0000000000..7c7fed0163
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/literal2.yaml
@@ -0,0 +1,10 @@
+key: |
+
+
+  Line1
+
+  Line2
+
+  Line3
+
+
diff --git a/yaml/src/test/resources/multi-line/literal_keep.yaml b/yaml/src/test/resources/multi-line/literal_keep.yaml
new file mode 100644
index 0000000000..37f22684dd
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/literal_keep.yaml
@@ -0,0 +1,5 @@
+key: |+
+  Line1
+  Line2
+  Line3
+
diff --git a/yaml/src/test/resources/multi-line/literal_strip.yaml b/yaml/src/test/resources/multi-line/literal_strip.yaml
new file mode 100644
index 0000000000..0791e13d5d
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/literal_strip.yaml
@@ -0,0 +1,5 @@
+key: |-
+  Line1
+  Line2
+  Line3
+
diff --git a/yaml/src/test/resources/multi-line/plain_double_quotes.yaml b/yaml/src/test/resources/multi-line/plain_double_quotes.yaml
new file mode 100644
index 0000000000..ccab040a27
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/plain_double_quotes.yaml
@@ -0,0 +1 @@
+key: "Line1\nLine2\nLine3"
\ No newline at end of file
diff --git a/yaml/src/test/resources/multi-line/plain_single_quotes.yaml b/yaml/src/test/resources/multi-line/plain_single_quotes.yaml
new file mode 100644
index 0000000000..acbf35a462
--- /dev/null
+++ b/yaml/src/test/resources/multi-line/plain_single_quotes.yaml
@@ -0,0 +1,3 @@
+key: 'Line1\nLine2
+
+  Line3'
\ No newline at end of file

From a1d246f2e1c6849abd0bdca347f910d3ee9f183b Mon Sep 17 00:00:00 2001
From: crist <cristi.rosu4@gmail.com>
Date: Tue, 4 Feb 2020 18:22:20 +0200
Subject: [PATCH 008/404] Added yamo module to appropriate profiles

---
 pom.xml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pom.xml b/pom.xml
index 2a0ae0d8d8..379c741648 100644
--- a/pom.xml
+++ b/pom.xml
@@ -781,6 +781,7 @@
                 <module>wildfly</module>
                 <module>xml</module>
                 <module>xstream</module>
+                <module>yaml</module>
             </modules>
 
         </profile>
@@ -1304,6 +1305,7 @@
                 <module>wildfly</module>
                 <module>xml</module>
                 <module>xstream</module>
+                <module>yaml</module>
             </modules>
 
         </profile>

From e2de2a78d19dd74eb4f66b212693644c5448bbf5 Mon Sep 17 00:00:00 2001
From: crist <cristi.rosu4@gmail.com>
Date: Thu, 6 Feb 2020 02:32:40 +0200
Subject: [PATCH 009/404] Article improvements

---
 .../multiline/MultiLineStringsUnitTest.java   | 26 +++++++++----------
 .../test/resources/multi-line/folded2.yaml    |  2 +-
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java b/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
index c97faa355a..a99de63a47 100644
--- a/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
+++ b/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
@@ -21,70 +21,70 @@ public class MultiLineStringsUnitTest {
 
     @Test
     public void whenLiteral_ThenLineBreaksArePresent() {
-        String key = parseYamlKey("literal.yaml");
+        String key = parseYamlKey("literal.yaml", "key");
         assertEquals("Line1\nLine2\nLine3", key);
     }
 
     @Test
     public void whenLiteral_ThenEndingBreaksAreReducedToOne() {
-        String key = parseYamlKey("literal2.yaml");
+        String key = parseYamlKey("literal2.yaml", "key");
         assertEquals("\n\nLine1\n\nLine2\n\nLine3\n", key);
     }
 
     @Test
     public void whenFolded_ThenLineBreaksAreReplaced() {
-        String key = parseYamlKey("folded.yaml");
+        String key = parseYamlKey("folded.yaml", "key");
         assertEquals("Line1 Line2 Line3", key);
     }
 
     @Test
     public void whenFolded_ThenEmptyLinesAreReducedToOne() {
-        String key = parseYamlKey("folded2.yaml");
-        assertEquals("Line1\nLine2\n\nLine3\n", key);
+        String key = parseYamlKey("folded2.yaml", "key");
+        assertEquals("Line1 Line2\n\nLine3\n", key);
     }
 
     @Test
     public void whenLiteralKeep_ThenLastEmptyLinesArePresent() {
-        String key = parseYamlKey("literal_keep.yaml");
+        String key = parseYamlKey("literal_keep.yaml", "key");
         assertEquals("Line1\nLine2\nLine3\n\n", key);
     }
 
     @Test
     public void whenLiteralStrip_ThenLastEmptyLinesAreRemoved() {
-        String key = parseYamlKey("literal_strip.yaml");
+        String key = parseYamlKey("literal_strip.yaml", "key");
         assertEquals("Line1\nLine2\nLine3", key);
     }
 
     @Test
     public void whenFoldedKeep_ThenLastEmptyLinesArePresent() {
-        String key = parseYamlKey("folded_keep.yaml");
+        String key = parseYamlKey("folded_keep.yaml", "key");
         assertEquals("Line1 Line2 Line3\n\n\n", key);
     }
 
     @Test
     public void whenFoldedStrip_ThenLastEmptyLinesAreRemoved() {
-        String key = parseYamlKey("folded_strip.yaml");
+        String key = parseYamlKey("folded_strip.yaml", "key");
         assertEquals("Line1 Line2 Line3", key);
     }
 
     @Test
     public void whenDoubleQuotes_ThenExplicitBreaksArePreserved() {
-        String key = parseYamlKey("plain_double_quotes.yaml");
+        String key = parseYamlKey("plain_double_quotes.yaml", "key");
         assertEquals("Line1\nLine2\nLine3", key);
     }
 
     @Test
     public void whenSingleQuotes_ThenExplicitBreaksAreIgnored() {
-        String key = parseYamlKey("plain_single_quotes.yaml");
+        String key = parseYamlKey("plain_single_quotes.yaml", "key");
         assertEquals("Line1\\nLine2\nLine3", key);
     }
 
-    private String parseYamlKey(String fileName) {
+    String parseYamlKey(String fileName, String key) {
         InputStream inputStream = this.getClass()
                 .getClassLoader()
                 .getResourceAsStream("multi-line" + File.separator + fileName);
         Map<String, String> parsed = yaml.load(inputStream);
-        return parsed.get("key");
+        return parsed.get(key);
     }
 
 }
diff --git a/yaml/src/test/resources/multi-line/folded2.yaml b/yaml/src/test/resources/multi-line/folded2.yaml
index a7f244994a..5c55ef62f2 100644
--- a/yaml/src/test/resources/multi-line/folded2.yaml
+++ b/yaml/src/test/resources/multi-line/folded2.yaml
@@ -1,9 +1,9 @@
 key: >
   Line1
-
   Line2
 
 
   Line3
 
 
+...
\ No newline at end of file

From 845f66ee2e21265beedbc78eaeaeaf1a02e90cf3 Mon Sep 17 00:00:00 2001
From: crist <cristi.rosu4@gmail.com>
Date: Thu, 6 Feb 2020 02:37:44 +0200
Subject: [PATCH 010/404] Fix

---
 yaml/src/test/resources/multi-line/folded2.yaml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/yaml/src/test/resources/multi-line/folded2.yaml b/yaml/src/test/resources/multi-line/folded2.yaml
index 5c55ef62f2..735abf9b2f 100644
--- a/yaml/src/test/resources/multi-line/folded2.yaml
+++ b/yaml/src/test/resources/multi-line/folded2.yaml
@@ -6,4 +6,3 @@ key: >
   Line3
 
 
-...
\ No newline at end of file

From 2b51ce0ebcfda726fc43dbf3439a216cf209a483 Mon Sep 17 00:00:00 2001
From: crist <cristi.rosu4@gmail.com>
Date: Mon, 10 Feb 2020 15:26:56 +0200
Subject: [PATCH 011/404] [BAEL-3750] Moved multi line yaml files from the yaml
 module to the libraries-data-io folder

---
 .../snakeyaml/MultiLineStringsUnitTest.java   | 90 +++++++++++++++++++
 .../test/resources/yaml/multiline/folded.yaml |  4 +
 .../resources/yaml/multiline/folded2.yaml     |  8 ++
 .../resources/yaml/multiline/folded_keep.yaml |  6 ++
 .../yaml/multiline/folded_strip.yaml          |  7 ++
 .../resources/yaml/multiline/literal.yaml     |  4 +
 .../resources/yaml/multiline/literal2.yaml    | 10 +++
 .../yaml/multiline/literal_keep.yaml          |  5 ++
 .../yaml/multiline/literal_strip.yaml         |  5 ++
 .../yaml/multiline/plain_double_quotes.yaml   |  1 +
 .../yaml/multiline/plain_single_quotes.yaml   |  3 +
 11 files changed, 143 insertions(+)
 create mode 100644 libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/MultiLineStringsUnitTest.java
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/folded.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/folded2.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/folded_keep.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/folded_strip.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/literal.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/literal2.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/literal_keep.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/literal_strip.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/plain_double_quotes.yaml
 create mode 100644 libraries-data-io/src/test/resources/yaml/multiline/plain_single_quotes.yaml

diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/MultiLineStringsUnitTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/MultiLineStringsUnitTest.java
new file mode 100644
index 0000000000..836ac86339
--- /dev/null
+++ b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/MultiLineStringsUnitTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.libraries.snakeyaml;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class MultiLineStringsUnitTest {
+
+    private Yaml yaml;
+
+    @Before
+    public void setup() {
+        yaml = new Yaml();
+    }
+
+    @Test
+    public void whenLiteral_ThenLineBreaksArePresent() {
+        String key = parseYamlKey("literal.yaml", "key");
+        assertEquals("Line1\nLine2\nLine3", key);
+    }
+
+    @Test
+    public void whenLiteral_ThenEndingBreaksAreReducedToOne() {
+        String key = parseYamlKey("literal2.yaml", "key");
+        assertEquals("\n\nLine1\n\nLine2\n\nLine3\n", key);
+    }
+
+    @Test
+    public void whenFolded_ThenLineBreaksAreReplaced() {
+        String key = parseYamlKey("folded.yaml", "key");
+        assertEquals("Line1 Line2 Line3", key);
+    }
+
+    @Test
+    public void whenFolded_ThenEmptyLinesAreReducedToOne() {
+        String key = parseYamlKey("folded2.yaml", "key");
+        assertEquals("Line1 Line2\n\nLine3\n", key);
+    }
+
+    @Test
+    public void whenLiteralKeep_ThenLastEmptyLinesArePresent() {
+        String key = parseYamlKey("literal_keep.yaml", "key");
+        assertEquals("Line1\nLine2\nLine3\n\n", key);
+    }
+
+    @Test
+    public void whenLiteralStrip_ThenLastEmptyLinesAreRemoved() {
+        String key = parseYamlKey("literal_strip.yaml", "key");
+        assertEquals("Line1\nLine2\nLine3", key);
+    }
+
+    @Test
+    public void whenFoldedKeep_ThenLastEmptyLinesArePresent() {
+        String key = parseYamlKey("folded_keep.yaml", "key");
+        assertEquals("Line1 Line2 Line3\n\n\n", key);
+    }
+
+    @Test
+    public void whenFoldedStrip_ThenLastEmptyLinesAreRemoved() {
+        String key = parseYamlKey("folded_strip.yaml", "key");
+        assertEquals("Line1 Line2 Line3", key);
+    }
+
+    @Test
+    public void whenDoubleQuotes_ThenExplicitBreaksArePreserved() {
+        String key = parseYamlKey("plain_double_quotes.yaml", "key");
+        assertEquals("Line1\nLine2\nLine3", key);
+    }
+
+    @Test
+    public void whenSingleQuotes_ThenExplicitBreaksAreIgnored() {
+        String key = parseYamlKey("plain_single_quotes.yaml", "key");
+        assertEquals("Line1\\nLine2\nLine3", key);
+    }
+
+    String parseYamlKey(String fileName, String key) {
+        InputStream inputStream = this.getClass()
+                .getClassLoader()
+                .getResourceAsStream("yaml" + File.separator + "multiline" + File.separator + fileName);
+        Map<String, String> parsed = yaml.load(inputStream);
+        return parsed.get(key);
+    }
+
+}
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/folded.yaml b/libraries-data-io/src/test/resources/yaml/multiline/folded.yaml
new file mode 100644
index 0000000000..c5fa743a08
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/folded.yaml
@@ -0,0 +1,4 @@
+key: >
+  Line1
+  Line2
+  Line3
\ No newline at end of file
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/folded2.yaml b/libraries-data-io/src/test/resources/yaml/multiline/folded2.yaml
new file mode 100644
index 0000000000..735abf9b2f
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/folded2.yaml
@@ -0,0 +1,8 @@
+key: >
+  Line1
+  Line2
+
+
+  Line3
+
+
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/folded_keep.yaml b/libraries-data-io/src/test/resources/yaml/multiline/folded_keep.yaml
new file mode 100644
index 0000000000..555291fd26
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/folded_keep.yaml
@@ -0,0 +1,6 @@
+key: >+
+  Line1
+  Line2
+  Line3
+
+
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/folded_strip.yaml b/libraries-data-io/src/test/resources/yaml/multiline/folded_strip.yaml
new file mode 100644
index 0000000000..0a3a246dc2
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/folded_strip.yaml
@@ -0,0 +1,7 @@
+key: >-
+  Line1
+  Line2
+  Line3
+
+
+
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/literal.yaml b/libraries-data-io/src/test/resources/yaml/multiline/literal.yaml
new file mode 100644
index 0000000000..7e02501a33
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/literal.yaml
@@ -0,0 +1,4 @@
+key: |
+  Line1
+  Line2
+  Line3
\ No newline at end of file
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/literal2.yaml b/libraries-data-io/src/test/resources/yaml/multiline/literal2.yaml
new file mode 100644
index 0000000000..7c7fed0163
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/literal2.yaml
@@ -0,0 +1,10 @@
+key: |
+
+
+  Line1
+
+  Line2
+
+  Line3
+
+
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/literal_keep.yaml b/libraries-data-io/src/test/resources/yaml/multiline/literal_keep.yaml
new file mode 100644
index 0000000000..37f22684dd
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/literal_keep.yaml
@@ -0,0 +1,5 @@
+key: |+
+  Line1
+  Line2
+  Line3
+
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/literal_strip.yaml b/libraries-data-io/src/test/resources/yaml/multiline/literal_strip.yaml
new file mode 100644
index 0000000000..0791e13d5d
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/literal_strip.yaml
@@ -0,0 +1,5 @@
+key: |-
+  Line1
+  Line2
+  Line3
+
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/plain_double_quotes.yaml b/libraries-data-io/src/test/resources/yaml/multiline/plain_double_quotes.yaml
new file mode 100644
index 0000000000..ccab040a27
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/plain_double_quotes.yaml
@@ -0,0 +1 @@
+key: "Line1\nLine2\nLine3"
\ No newline at end of file
diff --git a/libraries-data-io/src/test/resources/yaml/multiline/plain_single_quotes.yaml b/libraries-data-io/src/test/resources/yaml/multiline/plain_single_quotes.yaml
new file mode 100644
index 0000000000..acbf35a462
--- /dev/null
+++ b/libraries-data-io/src/test/resources/yaml/multiline/plain_single_quotes.yaml
@@ -0,0 +1,3 @@
+key: 'Line1\nLine2
+
+  Line3'
\ No newline at end of file

From 7feb9bfb1ec7e9502d482fef57867439f831f6b4 Mon Sep 17 00:00:00 2001
From: crist <cristi.rosu4@gmail.com>
Date: Mon, 10 Feb 2020 15:29:53 +0200
Subject: [PATCH 012/404] [BAEL-3750] deleted the yaml module

---
 pom.xml                                       |  2 -
 yaml/README.md                                |  7 --
 yaml/pom.xml                                  | 29 ------
 .../multiline/MultiLineStringsUnitTest.java   | 90 -------------------
 .../src/test/resources/multi-line/folded.yaml |  4 -
 .../test/resources/multi-line/folded2.yaml    |  8 --
 .../resources/multi-line/folded_keep.yaml     |  6 --
 .../resources/multi-line/folded_strip.yaml    |  7 --
 .../test/resources/multi-line/literal.yaml    |  4 -
 .../test/resources/multi-line/literal2.yaml   | 10 ---
 .../resources/multi-line/literal_keep.yaml    |  5 --
 .../resources/multi-line/literal_strip.yaml   |  5 --
 .../multi-line/plain_double_quotes.yaml       |  1 -
 .../multi-line/plain_single_quotes.yaml       |  3 -
 14 files changed, 181 deletions(-)
 delete mode 100644 yaml/README.md
 delete mode 100644 yaml/pom.xml
 delete mode 100644 yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
 delete mode 100644 yaml/src/test/resources/multi-line/folded.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/folded2.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/folded_keep.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/folded_strip.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/literal.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/literal2.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/literal_keep.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/literal_strip.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/plain_double_quotes.yaml
 delete mode 100644 yaml/src/test/resources/multi-line/plain_single_quotes.yaml

diff --git a/pom.xml b/pom.xml
index b0d3f2297d..0c9896cf35 100644
--- a/pom.xml
+++ b/pom.xml
@@ -782,7 +782,6 @@
                 <module>wildfly</module>
                 <module>xml</module>
                 <module>xstream</module>
-                <module>yaml</module>
             </modules>
 
         </profile>
@@ -1307,7 +1306,6 @@
                 <module>wildfly</module>
                 <module>xml</module>
                 <module>xstream</module>
-                <module>yaml</module>
             </modules>
 
         </profile>
diff --git a/yaml/README.md b/yaml/README.md
deleted file mode 100644
index ebf403eb57..0000000000
--- a/yaml/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## YAML
-
-This module contains articles about YAML
-
-### Relevant articles
-
-
diff --git a/yaml/pom.xml b/yaml/pom.xml
deleted file mode 100644
index c801505c6a..0000000000
--- a/yaml/pom.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>yaml</artifactId>
-    <version>1.0-SNAPSHOT</version>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.yaml</groupId>
-            <artifactId>snakeyaml</artifactId>
-            <version>1.21</version>
-        </dependency>
-    </dependencies>
-
-    <properties>
-        <java.version>1.8</java.version>
-        <snakeyaml.version>1.21</snakeyaml.version>
-    </properties>
-
-</project>
\ No newline at end of file
diff --git a/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java b/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
deleted file mode 100644
index a99de63a47..0000000000
--- a/yaml/src/test/java/com/baeldung/multiline/MultiLineStringsUnitTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.baeldung.multiline;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.yaml.snakeyaml.Yaml;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-
-public class MultiLineStringsUnitTest {
-
-    private Yaml yaml;
-
-    @Before
-    public void setup() {
-        yaml = new Yaml();
-    }
-
-    @Test
-    public void whenLiteral_ThenLineBreaksArePresent() {
-        String key = parseYamlKey("literal.yaml", "key");
-        assertEquals("Line1\nLine2\nLine3", key);
-    }
-
-    @Test
-    public void whenLiteral_ThenEndingBreaksAreReducedToOne() {
-        String key = parseYamlKey("literal2.yaml", "key");
-        assertEquals("\n\nLine1\n\nLine2\n\nLine3\n", key);
-    }
-
-    @Test
-    public void whenFolded_ThenLineBreaksAreReplaced() {
-        String key = parseYamlKey("folded.yaml", "key");
-        assertEquals("Line1 Line2 Line3", key);
-    }
-
-    @Test
-    public void whenFolded_ThenEmptyLinesAreReducedToOne() {
-        String key = parseYamlKey("folded2.yaml", "key");
-        assertEquals("Line1 Line2\n\nLine3\n", key);
-    }
-
-    @Test
-    public void whenLiteralKeep_ThenLastEmptyLinesArePresent() {
-        String key = parseYamlKey("literal_keep.yaml", "key");
-        assertEquals("Line1\nLine2\nLine3\n\n", key);
-    }
-
-    @Test
-    public void whenLiteralStrip_ThenLastEmptyLinesAreRemoved() {
-        String key = parseYamlKey("literal_strip.yaml", "key");
-        assertEquals("Line1\nLine2\nLine3", key);
-    }
-
-    @Test
-    public void whenFoldedKeep_ThenLastEmptyLinesArePresent() {
-        String key = parseYamlKey("folded_keep.yaml", "key");
-        assertEquals("Line1 Line2 Line3\n\n\n", key);
-    }
-
-    @Test
-    public void whenFoldedStrip_ThenLastEmptyLinesAreRemoved() {
-        String key = parseYamlKey("folded_strip.yaml", "key");
-        assertEquals("Line1 Line2 Line3", key);
-    }
-
-    @Test
-    public void whenDoubleQuotes_ThenExplicitBreaksArePreserved() {
-        String key = parseYamlKey("plain_double_quotes.yaml", "key");
-        assertEquals("Line1\nLine2\nLine3", key);
-    }
-
-    @Test
-    public void whenSingleQuotes_ThenExplicitBreaksAreIgnored() {
-        String key = parseYamlKey("plain_single_quotes.yaml", "key");
-        assertEquals("Line1\\nLine2\nLine3", key);
-    }
-
-    String parseYamlKey(String fileName, String key) {
-        InputStream inputStream = this.getClass()
-                .getClassLoader()
-                .getResourceAsStream("multi-line" + File.separator + fileName);
-        Map<String, String> parsed = yaml.load(inputStream);
-        return parsed.get(key);
-    }
-
-}
diff --git a/yaml/src/test/resources/multi-line/folded.yaml b/yaml/src/test/resources/multi-line/folded.yaml
deleted file mode 100644
index c5fa743a08..0000000000
--- a/yaml/src/test/resources/multi-line/folded.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-key: >
-  Line1
-  Line2
-  Line3
\ No newline at end of file
diff --git a/yaml/src/test/resources/multi-line/folded2.yaml b/yaml/src/test/resources/multi-line/folded2.yaml
deleted file mode 100644
index 735abf9b2f..0000000000
--- a/yaml/src/test/resources/multi-line/folded2.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-key: >
-  Line1
-  Line2
-
-
-  Line3
-
-
diff --git a/yaml/src/test/resources/multi-line/folded_keep.yaml b/yaml/src/test/resources/multi-line/folded_keep.yaml
deleted file mode 100644
index 555291fd26..0000000000
--- a/yaml/src/test/resources/multi-line/folded_keep.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-key: >+
-  Line1
-  Line2
-  Line3
-
-
diff --git a/yaml/src/test/resources/multi-line/folded_strip.yaml b/yaml/src/test/resources/multi-line/folded_strip.yaml
deleted file mode 100644
index 0a3a246dc2..0000000000
--- a/yaml/src/test/resources/multi-line/folded_strip.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-key: >-
-  Line1
-  Line2
-  Line3
-
-
-
diff --git a/yaml/src/test/resources/multi-line/literal.yaml b/yaml/src/test/resources/multi-line/literal.yaml
deleted file mode 100644
index 7e02501a33..0000000000
--- a/yaml/src/test/resources/multi-line/literal.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-key: |
-  Line1
-  Line2
-  Line3
\ No newline at end of file
diff --git a/yaml/src/test/resources/multi-line/literal2.yaml b/yaml/src/test/resources/multi-line/literal2.yaml
deleted file mode 100644
index 7c7fed0163..0000000000
--- a/yaml/src/test/resources/multi-line/literal2.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-key: |
-
-
-  Line1
-
-  Line2
-
-  Line3
-
-
diff --git a/yaml/src/test/resources/multi-line/literal_keep.yaml b/yaml/src/test/resources/multi-line/literal_keep.yaml
deleted file mode 100644
index 37f22684dd..0000000000
--- a/yaml/src/test/resources/multi-line/literal_keep.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-key: |+
-  Line1
-  Line2
-  Line3
-
diff --git a/yaml/src/test/resources/multi-line/literal_strip.yaml b/yaml/src/test/resources/multi-line/literal_strip.yaml
deleted file mode 100644
index 0791e13d5d..0000000000
--- a/yaml/src/test/resources/multi-line/literal_strip.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-key: |-
-  Line1
-  Line2
-  Line3
-
diff --git a/yaml/src/test/resources/multi-line/plain_double_quotes.yaml b/yaml/src/test/resources/multi-line/plain_double_quotes.yaml
deleted file mode 100644
index ccab040a27..0000000000
--- a/yaml/src/test/resources/multi-line/plain_double_quotes.yaml
+++ /dev/null
@@ -1 +0,0 @@
-key: "Line1\nLine2\nLine3"
\ No newline at end of file
diff --git a/yaml/src/test/resources/multi-line/plain_single_quotes.yaml b/yaml/src/test/resources/multi-line/plain_single_quotes.yaml
deleted file mode 100644
index acbf35a462..0000000000
--- a/yaml/src/test/resources/multi-line/plain_single_quotes.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-key: 'Line1\nLine2
-
-  Line3'
\ No newline at end of file

From aab469525e014c4a9916bffad20c52dbf0922bc3 Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Sun, 8 Mar 2020 19:58:47 +0200
Subject: [PATCH 013/404] kkaravitis@gmail.com hexagonal architecture in java

---
 .../hexagonal-architecture-example/pom.xml    | 34 ++++++++++++++
 .../adapters/inbound/CommandLineAdapter.java  | 46 +++++++++++++++++++
 .../adapters/outbound/CocktailRepository.java | 23 ++++++++++
 .../example/application/domain/Cocktail.java  | 21 +++++++++
 .../application/ports/in/AddCocktailPort.java | 24 ++++++++++
 .../ports/in/GetCocktailsPort.java            |  9 ++++
 .../service/AddCocktailService.java           | 19 ++++++++
 .../service/GetCocktailsService.java          | 20 ++++++++
 .../infrastructure/CocktailsMenuApp.java      | 43 +++++++++++++++++
 .../application/AddCocktailUnitTest.java      | 42 +++++++++++++++++
 .../application/GetCocktailsUnitTest.java     | 41 +++++++++++++++++
 patterns/pom.xml                              |  1 +
 12 files changed, 323 insertions(+)
 create mode 100644 patterns/hexagonal-architecture-example/pom.xml
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java
 create mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java
 create mode 100644 patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java
 create mode 100644 patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java

diff --git a/patterns/hexagonal-architecture-example/pom.xml b/patterns/hexagonal-architecture-example/pom.xml
new file mode 100644
index 0000000000..e5439bf8f7
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+    <artifactId>hexagonal-architecture-example</artifactId>
+    <version>1.0</version>
+    <packaging>jar</packaging>
+	<parent>
+		<groupId>com.baeldung</groupId>
+		<artifactId>patterns</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+	
+	<build>
+	  <plugins>
+	    <plugin>
+	      <!-- Build an executable JAR -->
+	      <groupId>org.apache.maven.plugins</groupId>
+	      <artifactId>maven-jar-plugin</artifactId>
+	      <version>3.2.0</version>
+	      <configuration>
+	        <archive>
+	          <manifest>
+	            <addClasspath>true</addClasspath>
+	            <classpathPrefix>lib/</classpathPrefix>
+	            <mainClass>com.baeldung.hexagonal.architecture.example.infrastructure.CocktailsMenuApp</mainClass>
+	          </manifest>
+	        </archive>
+	      </configuration>
+	    </plugin>
+	  </plugins>
+</build>
+	
+</project>
\ No newline at end of file
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java
new file mode 100644
index 0000000000..4f85639009
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java
@@ -0,0 +1,46 @@
+package com.baeldung.hexagonal.architecture.example.adapters.inbound;
+
+import java.util.List;
+import java.util.Scanner;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort;
+import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort.AddCocktailCommand;
+import com.baeldung.hexagonal.architecture.example.application.ports.in.GetCocktailsPort;
+
+public class CommandLineAdapter {
+    private AddCocktailPort addCocktailPort;
+    private GetCocktailsPort listCocktailsPort;
+    private Scanner scanner;
+
+    public CommandLineAdapter(Scanner scanner, AddCocktailPort addCocktailPort, GetCocktailsPort listCocktailsPort) {
+        this.addCocktailPort = addCocktailPort;
+        this.listCocktailsPort = listCocktailsPort;
+        this.scanner = scanner;
+    }
+
+    public void addCocktail() {
+        try {
+            System.out.println("Enter the name of the cocktail");
+            scanner.nextLine();
+            String name = scanner.nextLine();
+            System.out.println("Enter the price of the cocktail");
+            double price = scanner.nextDouble();
+            scanner.nextLine();
+            AddCocktailCommand command = new AddCocktailCommand(name, price);
+            addCocktailPort.addCocktail(command);
+        } catch (Exception exception) {
+            System.out.println("Error during adding a new Cocktail");
+        }
+    }
+
+    public void listCocktails() {
+        List<Cocktail> cocktailList = listCocktailsPort.getCocktails();
+        System.out.println("Cocktails menu: \n");
+        cocktailList.stream()
+            .forEach(cocktail -> {
+                System.out.println(cocktail.getName() + "\n" + 
+                    "price: " + cocktail.getPrice() + " $ " + "\n");
+            });
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java
new file mode 100644
index 0000000000..8b8e4d1d54
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java
@@ -0,0 +1,23 @@
+package com.baeldung.hexagonal.architecture.example.adapters.outbound;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+import com.baeldung.hexagonal.architecture.example.application.ports.out.FetchCocktailsPort;
+import com.baeldung.hexagonal.architecture.example.application.ports.out.SaveCocktailPort;
+
+public class CocktailRepository implements FetchCocktailsPort, SaveCocktailPort {
+    
+    private Map<String, Cocktail> store = new HashMap<>();
+
+    public List<Cocktail> fetchCocktails() {
+        return new ArrayList<>(store.values());
+    }
+
+    public void saveCocktail(Cocktail cocktail) {
+        store.put(cocktail.getName(), cocktail);
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java
new file mode 100644
index 0000000000..878d667bf6
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java
@@ -0,0 +1,21 @@
+package com.baeldung.hexagonal.architecture.example.application.domain;
+
+public class Cocktail {
+    
+    private String name;
+    
+    private double price;
+
+    public Cocktail(String name, double price) {
+        this.name = name;
+        this.price = price;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public double getPrice() {
+        return price;
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java
new file mode 100644
index 0000000000..49138a2b34
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java
@@ -0,0 +1,24 @@
+package com.baeldung.hexagonal.architecture.example.application.ports.in;
+
+public interface AddCocktailPort {
+
+    void addCocktail(AddCocktailCommand command);
+
+    class AddCocktailCommand {
+        private String name;
+        private double price;
+
+        public AddCocktailCommand(String name, double price) {
+            this.name = name;
+            this.price = price;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public double getPrice() {
+            return price;
+        }
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java
new file mode 100644
index 0000000000..1d46bbd722
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java
@@ -0,0 +1,9 @@
+package com.baeldung.hexagonal.architecture.example.application.ports.in;
+
+import java.util.List;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+
+public interface GetCocktailsPort {
+    List<Cocktail> getCocktails();
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java
new file mode 100644
index 0000000000..81855853e8
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java
@@ -0,0 +1,19 @@
+package com.baeldung.hexagonal.architecture.example.application.service;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort;
+import com.baeldung.hexagonal.architecture.example.application.ports.out.SaveCocktailPort;
+
+public class AddCocktailService implements AddCocktailPort {
+    private SaveCocktailPort saveCocktailPort;
+
+    public AddCocktailService(SaveCocktailPort saveCocktailPort) {
+        this.saveCocktailPort = saveCocktailPort;
+    }
+
+    @Override
+    public void addCocktail(AddCocktailCommand command) {
+        Cocktail cocktail = new Cocktail(command.getName(), command.getPrice());
+        saveCocktailPort.saveCocktail(cocktail);
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java
new file mode 100644
index 0000000000..a1459f2372
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java
@@ -0,0 +1,20 @@
+package com.baeldung.hexagonal.architecture.example.application.service;
+
+import java.util.List;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+import com.baeldung.hexagonal.architecture.example.application.ports.in.GetCocktailsPort;
+import com.baeldung.hexagonal.architecture.example.application.ports.out.FetchCocktailsPort;
+
+public class GetCocktailsService implements GetCocktailsPort {
+    private FetchCocktailsPort fetchCocktailsPort;
+
+    public GetCocktailsService(FetchCocktailsPort fetchCocktailsPort) {
+        this.fetchCocktailsPort = fetchCocktailsPort;
+    }
+
+    @Override
+    public List<Cocktail> getCocktails() {
+        return fetchCocktailsPort.fetchCocktails();
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java
new file mode 100644
index 0000000000..a808d1f85e
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java
@@ -0,0 +1,43 @@
+package com.baeldung.hexagonal.architecture.example.infrastructure;
+
+import java.util.Scanner;
+
+import com.baeldung.hexagonal.architecture.example.adapters.inbound.CommandLineAdapter;
+import com.baeldung.hexagonal.architecture.example.adapters.outbound.CocktailRepository;
+import com.baeldung.hexagonal.architecture.example.application.service.AddCocktailService;
+import com.baeldung.hexagonal.architecture.example.application.service.GetCocktailsService;
+
+public class CocktailsMenuApp {
+    private static final String ADD = "add";
+    private static final String LIST = "list";
+    private static final String EXIT = "exit";
+    private static final String HELP_TEXT = "Enter command \n" + 
+        ADD + " - add a new Cocktail to the menu \n" + 
+        LIST + " - list cocktails \n" + 
+        EXIT + " - exit \n";
+    private static Scanner SCANNER = new Scanner(System.in);
+
+    public static void main(String[] args) {
+        CocktailRepository cocktailRepository = new CocktailRepository();
+        AddCocktailService addCocktailService = new AddCocktailService(cocktailRepository);
+        GetCocktailsService getCocktailsMenuService = new GetCocktailsService(cocktailRepository);
+        CommandLineAdapter commandLineAdapter = new CommandLineAdapter(SCANNER, addCocktailService, getCocktailsMenuService);
+        runWith(commandLineAdapter);
+    }
+
+    public static void runWith(CommandLineAdapter adapter) {
+        String command = null;
+        while (!EXIT.equalsIgnoreCase(command)) {
+            System.out.println(HELP_TEXT);
+            command = SCANNER.next();
+            switch (command.toLowerCase()) {
+            case ADD:
+                adapter.addCocktail();
+                break;
+            case LIST:
+                adapter.listCocktails();
+                break;
+            }
+        }
+    }
+}
diff --git a/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java b/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java
new file mode 100644
index 0000000000..bff8550464
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.hexagonal.architecture.example.application;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort.AddCocktailCommand;
+import com.baeldung.hexagonal.architecture.example.application.ports.out.SaveCocktailPort;
+import com.baeldung.hexagonal.architecture.example.application.service.AddCocktailService;
+
+class AddCocktailUnitTest {
+    
+    SaveCocktailPort saveCocktailPort;
+    AddCocktailService addCocktailService;
+    
+    @BeforeEach
+    void setup() {
+        saveCocktailPort = mock(SaveCocktailPort.class);
+        addCocktailService = new AddCocktailService(saveCocktailPort); 
+    }
+    
+    @Test
+    void whenAddingACocktail_thenTheCocktailIsSaved() {
+        AddCocktailCommand command = mock(AddCocktailCommand.class);
+        when(command.getName()).thenReturn("mockito");
+        when(command.getPrice()).thenReturn(9.50);
+        ArgumentCaptor<Cocktail> captor = ArgumentCaptor.forClass(Cocktail.class);
+        
+        addCocktailService.addCocktail(command);
+        
+        Mockito.verify(saveCocktailPort).saveCocktail(captor.capture());
+        Cocktail cocktailThatSaved = captor.getValue();
+        assertEquals(command.getName(), cocktailThatSaved.getName());
+        assertEquals(command.getPrice(), cocktailThatSaved.getPrice());
+    }
+
+}
diff --git a/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java b/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java
new file mode 100644
index 0000000000..5933f71895
--- /dev/null
+++ b/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.hexagonal.architecture.example.application;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
+import com.baeldung.hexagonal.architecture.example.application.ports.out.FetchCocktailsPort;
+import com.baeldung.hexagonal.architecture.example.application.service.GetCocktailsService;
+
+class GetCocktailsUnitTest {
+
+    FetchCocktailsPort fetchCocktailsPort;
+    GetCocktailsService getCocktailsService;
+
+    @BeforeEach
+    void setup() {
+        fetchCocktailsPort = mock(FetchCocktailsPort.class);
+        getCocktailsService = new GetCocktailsService(fetchCocktailsPort);
+    }
+
+    @Test
+    void whenGettingCocktails_thenCocktailsFetchedFromPortAndReturned() {
+        Cocktail cocktail = mock(Cocktail.class);
+        when(cocktail.getName()).thenReturn("zombie");
+        when(cocktail.getPrice()).thenReturn(12.00);
+        when(fetchCocktailsPort.fetchCocktails()).thenReturn(List.of(cocktail));
+
+        List<Cocktail> cocktails = getCocktailsService.getCocktails();
+        
+        assertEquals(1, cocktails.size());
+        assertEquals(cocktail.getName(), cocktails.get(0).getName());
+        assertEquals(cocktail.getPrice(), cocktails.get(0).getPrice());
+    }
+
+}
diff --git a/patterns/pom.xml b/patterns/pom.xml
index 4c17055231..7631d8bbb0 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -24,6 +24,7 @@
         <module>front-controller</module>
         <module>intercepting-filter</module>
         <module>solid</module>
+        <module>hexagonal-architecture-example</module>
     </modules>
 
     <dependencyManagement>

From 626c1096358d4561fe20a6930d9d2b3487302121 Mon Sep 17 00:00:00 2001
From: "alex.oreshkevich" <alexander.oreshkevich@gmail.com>
Date: Mon, 16 Mar 2020 19:28:42 +0300
Subject: [PATCH 014/404] Add embedded app server

---
 spring-mvc-webflow/pom.xml | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/spring-mvc-webflow/pom.xml b/spring-mvc-webflow/pom.xml
index 5a6856385c..22ae3c913d 100644
--- a/spring-mvc-webflow/pom.xml
+++ b/spring-mvc-webflow/pom.xml
@@ -72,6 +72,24 @@
             </resource>
         </resources>
         <plugins>
+            <plugin>
+                <groupId>org.apache.tomee.maven</groupId>
+                <artifactId>tomee-maven-plugin</artifactId>
+                <version>8.0.1</version>
+                <configuration>
+                    <tomeeHttpPort>8080</tomeeHttpPort>
+                    <context>spring-mvc-webflow</context>
+                    <reloadOnUpdate>true</reloadOnUpdate>
+                    <tomeeClassifier>plume</tomeeClassifier>
+                    <synchronization>
+                        <extensions>
+                            <extension>.class</extension>
+                        </extensions>
+                    </synchronization>
+                    <args>-Xmx2048m -XX:PermSize=256m -Dtomee.serialization.class.blacklist=- -Dtomee.serialization.class.whitelist=*</args>
+                    <removeDefaultWebapps>true</removeDefaultWebapps>
+                </configuration>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-war-plugin</artifactId>

From 2401a9af7d767d42b37d99e4d1ab6ae356c316bc Mon Sep 17 00:00:00 2001
From: Nacho Verdu <nacho.verdu@manticpoint.com>
Date: Mon, 16 Mar 2020 18:37:46 +0000
Subject: [PATCH 015/404] BAEL-3912: Changes done

---
 .../getweeknumber/GetWeekNumberNewJava.java   | 29 +++++++++++++++
 .../getweeknumber/GetWeekNumberOldJava.java   | 35 +++++++++++++++++++
 2 files changed, 64 insertions(+)
 create mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java
 create mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java

diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java
new file mode 100644
index 0000000000..abe9367fc2
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java
@@ -0,0 +1,29 @@
+package com.baeldung.getweeknumber;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+public class GetWeekNumberNewJava {
+	private LocalDate date;
+
+	public GetWeekNumberNewJava(String day, String dayFormat) {
+		date = LocalDate.parse(day, DateTimeFormatter.ofPattern(dayFormat));
+	}
+	
+	public GetWeekNumberNewJava(int year, int month, int day) {
+		date = LocalDate.of(year, month, day); 
+	}
+	
+	public DayOfWeek getDayOfWeek() {
+		return date.getDayOfWeek();
+	}
+	
+	public static void main(String[] args) {
+		GetWeekNumberNewJava example1 = new GetWeekNumberNewJava(2020, 3, 2);
+		System.out.println(example1.getDayOfWeek());
+
+		GetWeekNumberNewJava example2 = new GetWeekNumberNewJava("20200302", "yyyyMMdd");
+		System.out.println(example2.getDayOfWeek().getValue());
+	}
+}
diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java
new file mode 100644
index 0000000000..6a63d24607
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java
@@ -0,0 +1,35 @@
+package com.baeldung.getweeknumber;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class GetWeekNumberOldJava {
+	private Calendar calendar;
+
+	public GetWeekNumberOldJava(String day, String dayFormat) throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat(dayFormat);
+
+		calendar = Calendar.getInstance();
+		Date date = sdf.parse(day);
+		calendar.setTime(date);
+	}
+
+	public GetWeekNumberOldJava(int year, int month, int day) {
+		calendar = Calendar.getInstance();
+		calendar.set(year, month, day);
+	}
+
+	public int getDayOfWeek() {
+		return calendar.get(Calendar.DAY_OF_WEEK);
+	}
+
+	public static void main(String[] args) throws ParseException {
+		GetWeekNumberOldJava example1 = new GetWeekNumberOldJava(2020, 2, 2);
+		System.out.println(example1.getDayOfWeek());
+
+		GetWeekNumberOldJava example2 = new GetWeekNumberOldJava("20200302", "yyyyMMdd");
+		System.out.println(example2.getDayOfWeek());
+	}
+}

From 0a5fbbe0e7626062cf5810970b07e65c1472bcbe Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Mon, 16 Mar 2020 16:55:14 -0400
Subject: [PATCH 016/404] Moved NullAwayExample.java to libraries-3. Updated
 the libraries-3 README

---
 libraries-3/README.md                                            | 1 +
 .../src/main/java/com/baeldung/nullaway/NullAwayExample.java     | 0
 2 files changed, 1 insertion(+)
 rename {libraries => libraries-3}/src/main/java/com/baeldung/nullaway/NullAwayExample.java (100%)

diff --git a/libraries-3/README.md b/libraries-3/README.md
index 404045e6b1..2692d606f3 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -12,3 +12,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos)
 - [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline)
 - [Introduction to cache2k](https://www.baeldung.com/java-cache2k)
+- [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
diff --git a/libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java b/libraries-3/src/main/java/com/baeldung/nullaway/NullAwayExample.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java
rename to libraries-3/src/main/java/com/baeldung/nullaway/NullAwayExample.java

From f55a86f19f742f20ff139095c7d24994953f2399 Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Tue, 17 Mar 2020 15:55:04 +0200
Subject: [PATCH 017/404] Removed evaluation article code

---
 .../hexagonal-architecture-example/pom.xml    | 34 --------------
 .../adapters/inbound/CommandLineAdapter.java  | 46 -------------------
 .../adapters/outbound/CocktailRepository.java | 23 ----------
 .../example/application/domain/Cocktail.java  | 21 ---------
 .../application/ports/in/AddCocktailPort.java | 24 ----------
 .../ports/in/GetCocktailsPort.java            |  9 ----
 .../service/AddCocktailService.java           | 19 --------
 .../service/GetCocktailsService.java          | 20 --------
 .../infrastructure/CocktailsMenuApp.java      | 43 -----------------
 .../application/AddCocktailUnitTest.java      | 42 -----------------
 .../application/GetCocktailsUnitTest.java     | 41 -----------------
 11 files changed, 322 deletions(-)
 delete mode 100644 patterns/hexagonal-architecture-example/pom.xml
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java
 delete mode 100644 patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java

diff --git a/patterns/hexagonal-architecture-example/pom.xml b/patterns/hexagonal-architecture-example/pom.xml
deleted file mode 100644
index e5439bf8f7..0000000000
--- a/patterns/hexagonal-architecture-example/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-    <artifactId>hexagonal-architecture-example</artifactId>
-    <version>1.0</version>
-    <packaging>jar</packaging>
-	<parent>
-		<groupId>com.baeldung</groupId>
-		<artifactId>patterns</artifactId>
-		<version>1.0.0-SNAPSHOT</version>
-	</parent>
-	
-	<build>
-	  <plugins>
-	    <plugin>
-	      <!-- Build an executable JAR -->
-	      <groupId>org.apache.maven.plugins</groupId>
-	      <artifactId>maven-jar-plugin</artifactId>
-	      <version>3.2.0</version>
-	      <configuration>
-	        <archive>
-	          <manifest>
-	            <addClasspath>true</addClasspath>
-	            <classpathPrefix>lib/</classpathPrefix>
-	            <mainClass>com.baeldung.hexagonal.architecture.example.infrastructure.CocktailsMenuApp</mainClass>
-	          </manifest>
-	        </archive>
-	      </configuration>
-	    </plugin>
-	  </plugins>
-</build>
-	
-</project>
\ No newline at end of file
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java
deleted file mode 100644
index 4f85639009..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/inbound/CommandLineAdapter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.adapters.inbound;
-
-import java.util.List;
-import java.util.Scanner;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort;
-import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort.AddCocktailCommand;
-import com.baeldung.hexagonal.architecture.example.application.ports.in.GetCocktailsPort;
-
-public class CommandLineAdapter {
-    private AddCocktailPort addCocktailPort;
-    private GetCocktailsPort listCocktailsPort;
-    private Scanner scanner;
-
-    public CommandLineAdapter(Scanner scanner, AddCocktailPort addCocktailPort, GetCocktailsPort listCocktailsPort) {
-        this.addCocktailPort = addCocktailPort;
-        this.listCocktailsPort = listCocktailsPort;
-        this.scanner = scanner;
-    }
-
-    public void addCocktail() {
-        try {
-            System.out.println("Enter the name of the cocktail");
-            scanner.nextLine();
-            String name = scanner.nextLine();
-            System.out.println("Enter the price of the cocktail");
-            double price = scanner.nextDouble();
-            scanner.nextLine();
-            AddCocktailCommand command = new AddCocktailCommand(name, price);
-            addCocktailPort.addCocktail(command);
-        } catch (Exception exception) {
-            System.out.println("Error during adding a new Cocktail");
-        }
-    }
-
-    public void listCocktails() {
-        List<Cocktail> cocktailList = listCocktailsPort.getCocktails();
-        System.out.println("Cocktails menu: \n");
-        cocktailList.stream()
-            .forEach(cocktail -> {
-                System.out.println(cocktail.getName() + "\n" + 
-                    "price: " + cocktail.getPrice() + " $ " + "\n");
-            });
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java
deleted file mode 100644
index 8b8e4d1d54..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/adapters/outbound/CocktailRepository.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.adapters.outbound;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-import com.baeldung.hexagonal.architecture.example.application.ports.out.FetchCocktailsPort;
-import com.baeldung.hexagonal.architecture.example.application.ports.out.SaveCocktailPort;
-
-public class CocktailRepository implements FetchCocktailsPort, SaveCocktailPort {
-    
-    private Map<String, Cocktail> store = new HashMap<>();
-
-    public List<Cocktail> fetchCocktails() {
-        return new ArrayList<>(store.values());
-    }
-
-    public void saveCocktail(Cocktail cocktail) {
-        store.put(cocktail.getName(), cocktail);
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java
deleted file mode 100644
index 878d667bf6..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/domain/Cocktail.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application.domain;
-
-public class Cocktail {
-    
-    private String name;
-    
-    private double price;
-
-    public Cocktail(String name, double price) {
-        this.name = name;
-        this.price = price;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public double getPrice() {
-        return price;
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java
deleted file mode 100644
index 49138a2b34..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/AddCocktailPort.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application.ports.in;
-
-public interface AddCocktailPort {
-
-    void addCocktail(AddCocktailCommand command);
-
-    class AddCocktailCommand {
-        private String name;
-        private double price;
-
-        public AddCocktailCommand(String name, double price) {
-            this.name = name;
-            this.price = price;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public double getPrice() {
-            return price;
-        }
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java
deleted file mode 100644
index 1d46bbd722..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/ports/in/GetCocktailsPort.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application.ports.in;
-
-import java.util.List;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-
-public interface GetCocktailsPort {
-    List<Cocktail> getCocktails();
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java
deleted file mode 100644
index 81855853e8..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/AddCocktailService.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application.service;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort;
-import com.baeldung.hexagonal.architecture.example.application.ports.out.SaveCocktailPort;
-
-public class AddCocktailService implements AddCocktailPort {
-    private SaveCocktailPort saveCocktailPort;
-
-    public AddCocktailService(SaveCocktailPort saveCocktailPort) {
-        this.saveCocktailPort = saveCocktailPort;
-    }
-
-    @Override
-    public void addCocktail(AddCocktailCommand command) {
-        Cocktail cocktail = new Cocktail(command.getName(), command.getPrice());
-        saveCocktailPort.saveCocktail(cocktail);
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java
deleted file mode 100644
index a1459f2372..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/application/service/GetCocktailsService.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application.service;
-
-import java.util.List;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-import com.baeldung.hexagonal.architecture.example.application.ports.in.GetCocktailsPort;
-import com.baeldung.hexagonal.architecture.example.application.ports.out.FetchCocktailsPort;
-
-public class GetCocktailsService implements GetCocktailsPort {
-    private FetchCocktailsPort fetchCocktailsPort;
-
-    public GetCocktailsService(FetchCocktailsPort fetchCocktailsPort) {
-        this.fetchCocktailsPort = fetchCocktailsPort;
-    }
-
-    @Override
-    public List<Cocktail> getCocktails() {
-        return fetchCocktailsPort.fetchCocktails();
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java b/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java
deleted file mode 100644
index a808d1f85e..0000000000
--- a/patterns/hexagonal-architecture-example/src/main/java/com/baeldung/hexagonal/architecture/example/infrastructure/CocktailsMenuApp.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.infrastructure;
-
-import java.util.Scanner;
-
-import com.baeldung.hexagonal.architecture.example.adapters.inbound.CommandLineAdapter;
-import com.baeldung.hexagonal.architecture.example.adapters.outbound.CocktailRepository;
-import com.baeldung.hexagonal.architecture.example.application.service.AddCocktailService;
-import com.baeldung.hexagonal.architecture.example.application.service.GetCocktailsService;
-
-public class CocktailsMenuApp {
-    private static final String ADD = "add";
-    private static final String LIST = "list";
-    private static final String EXIT = "exit";
-    private static final String HELP_TEXT = "Enter command \n" + 
-        ADD + " - add a new Cocktail to the menu \n" + 
-        LIST + " - list cocktails \n" + 
-        EXIT + " - exit \n";
-    private static Scanner SCANNER = new Scanner(System.in);
-
-    public static void main(String[] args) {
-        CocktailRepository cocktailRepository = new CocktailRepository();
-        AddCocktailService addCocktailService = new AddCocktailService(cocktailRepository);
-        GetCocktailsService getCocktailsMenuService = new GetCocktailsService(cocktailRepository);
-        CommandLineAdapter commandLineAdapter = new CommandLineAdapter(SCANNER, addCocktailService, getCocktailsMenuService);
-        runWith(commandLineAdapter);
-    }
-
-    public static void runWith(CommandLineAdapter adapter) {
-        String command = null;
-        while (!EXIT.equalsIgnoreCase(command)) {
-            System.out.println(HELP_TEXT);
-            command = SCANNER.next();
-            switch (command.toLowerCase()) {
-            case ADD:
-                adapter.addCocktail();
-                break;
-            case LIST:
-                adapter.listCocktails();
-                break;
-            }
-        }
-    }
-}
diff --git a/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java b/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java
deleted file mode 100644
index bff8550464..0000000000
--- a/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/AddCocktailUnitTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-import com.baeldung.hexagonal.architecture.example.application.ports.in.AddCocktailPort.AddCocktailCommand;
-import com.baeldung.hexagonal.architecture.example.application.ports.out.SaveCocktailPort;
-import com.baeldung.hexagonal.architecture.example.application.service.AddCocktailService;
-
-class AddCocktailUnitTest {
-    
-    SaveCocktailPort saveCocktailPort;
-    AddCocktailService addCocktailService;
-    
-    @BeforeEach
-    void setup() {
-        saveCocktailPort = mock(SaveCocktailPort.class);
-        addCocktailService = new AddCocktailService(saveCocktailPort); 
-    }
-    
-    @Test
-    void whenAddingACocktail_thenTheCocktailIsSaved() {
-        AddCocktailCommand command = mock(AddCocktailCommand.class);
-        when(command.getName()).thenReturn("mockito");
-        when(command.getPrice()).thenReturn(9.50);
-        ArgumentCaptor<Cocktail> captor = ArgumentCaptor.forClass(Cocktail.class);
-        
-        addCocktailService.addCocktail(command);
-        
-        Mockito.verify(saveCocktailPort).saveCocktail(captor.capture());
-        Cocktail cocktailThatSaved = captor.getValue();
-        assertEquals(command.getName(), cocktailThatSaved.getName());
-        assertEquals(command.getPrice(), cocktailThatSaved.getPrice());
-    }
-
-}
diff --git a/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java b/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java
deleted file mode 100644
index 5933f71895..0000000000
--- a/patterns/hexagonal-architecture-example/src/test/java/com/baeldung/hexagonal/architecture/example/application/GetCocktailsUnitTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.baeldung.hexagonal.architecture.example.application;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import com.baeldung.hexagonal.architecture.example.application.domain.Cocktail;
-import com.baeldung.hexagonal.architecture.example.application.ports.out.FetchCocktailsPort;
-import com.baeldung.hexagonal.architecture.example.application.service.GetCocktailsService;
-
-class GetCocktailsUnitTest {
-
-    FetchCocktailsPort fetchCocktailsPort;
-    GetCocktailsService getCocktailsService;
-
-    @BeforeEach
-    void setup() {
-        fetchCocktailsPort = mock(FetchCocktailsPort.class);
-        getCocktailsService = new GetCocktailsService(fetchCocktailsPort);
-    }
-
-    @Test
-    void whenGettingCocktails_thenCocktailsFetchedFromPortAndReturned() {
-        Cocktail cocktail = mock(Cocktail.class);
-        when(cocktail.getName()).thenReturn("zombie");
-        when(cocktail.getPrice()).thenReturn(12.00);
-        when(fetchCocktailsPort.fetchCocktails()).thenReturn(List.of(cocktail));
-
-        List<Cocktail> cocktails = getCocktailsService.getCocktails();
-        
-        assertEquals(1, cocktails.size());
-        assertEquals(cocktail.getName(), cocktails.get(0).getName());
-        assertEquals(cocktail.getPrice(), cocktails.get(0).getPrice());
-    }
-
-}

From 9b5b41a1c6c66d9695e24a497b7b37970f5fae73 Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Tue, 17 Mar 2020 15:57:00 +0200
Subject: [PATCH 018/404] Removed evaluation article code

---
 patterns/pom.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/patterns/pom.xml b/patterns/pom.xml
index 7631d8bbb0..4c17055231 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -24,7 +24,6 @@
         <module>front-controller</module>
         <module>intercepting-filter</module>
         <module>solid</module>
-        <module>hexagonal-architecture-example</module>
     </modules>
 
     <dependencyManagement>

From 159370411205f46ecbe50ad765c9efb586c1d65d Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Tue, 17 Mar 2020 09:58:23 -0400
Subject: [PATCH 019/404] Added dependencies and plugins for NullAway example

---
 libraries-3/pom.xml | 57 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index a438d423e2..dbe6dd194f 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -104,6 +104,23 @@
             <artifactId>velocity-engine-core</artifactId>
             <version>${velocity-engine-core.version}</version>
         </dependency>
+		<dependency>
+		    <groupId>com.uber.nullaway</groupId>
+		    <artifactId>nullaway</artifactId>
+		    <version>0.3.0</version>
+		</dependency>
+		<dependency>
+		    <groupId>org.codehaus.plexus</groupId>
+		    <artifactId>plexus-compiler-javac-errorprone</artifactId>
+		    <version>2.8</version>
+		</dependency>
+		<!-- override plexus-compiler-javac-errorprone's dependency on
+		       Error Prone with the latest version -->
+		<dependency>
+		    <groupId>com.google.errorprone</groupId>
+		    <artifactId>error_prone_core</artifactId>
+		    <version>2.1.3</version>
+		</dependency>
     </dependencies>
 
     <repositories>
@@ -139,6 +156,46 @@
                         <version>${aspectjweaver.version}</version>
                     </dependency>
                 </dependencies>
+            </plugin>
+			
+			<plugin>
+			    <groupId>org.apache.maven.plugins</groupId>
+			    <artifactId>maven-compiler-plugin</artifactId>
+			    <version>3.5</version>
+			    <configuration>
+			        <compilerId>javac-with-errorprone</compilerId>
+			        <forceJavacCompilerUse>true</forceJavacCompilerUse>
+			        <source>1.8</source>
+			        <target>1.8</target>
+			        <showWarnings>true</showWarnings>
+			        <annotationProcessorPaths>
+			            <path>
+			                <groupId>com.uber.nullaway</groupId>
+			                <artifactId>nullaway</artifactId>
+			                <version>0.3.0</version>
+			            </path>
+			        </annotationProcessorPaths>
+			        <compilerArgs>
+			            <!-- NullAway will warn by default, uncomment the next line to make the build fail -->
+			            <!-- <arg>-Xep:NullAway:ERROR</arg> -->
+			            <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*</arg>
+			            <arg>-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway</arg>
+			        </compilerArgs>
+			    </configuration>
+			    <dependencies>
+			        <dependency>
+                        <groupId>org.codehaus.plexus</groupId>
+                        <artifactId>plexus-compiler-javac-errorprone</artifactId>
+                        <version>2.8</version>
+                    </dependency>
+                    <!-- override plexus-compiler-javac-errorprone's dependency on
+                         Error Prone with the latest version -->
+                    <dependency>
+                        <groupId>com.google.errorprone</groupId>
+                        <artifactId>error_prone_core</artifactId>
+                        <version>2.1.3</version>
+                    </dependency>
+                </dependencies>
             </plugin>
         </plugins>
         <resources>

From 5861ebd6337f574226da2fcadb878401d9da4635 Mon Sep 17 00:00:00 2001
From: Greg <greg.l.martin@gmail.com>
Date: Tue, 17 Mar 2020 10:47:54 -0400
Subject: [PATCH 020/404] Update pom.xml

---
 libraries-3/pom.xml | 86 ++++++++++++++++++++++-----------------------
 1 file changed, 43 insertions(+), 43 deletions(-)

diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index dbe6dd194f..fe007dfc4d 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -104,23 +104,23 @@
             <artifactId>velocity-engine-core</artifactId>
             <version>${velocity-engine-core.version}</version>
         </dependency>
-		<dependency>
-		    <groupId>com.uber.nullaway</groupId>
-		    <artifactId>nullaway</artifactId>
-		    <version>0.3.0</version>
-		</dependency>
-		<dependency>
-		    <groupId>org.codehaus.plexus</groupId>
-		    <artifactId>plexus-compiler-javac-errorprone</artifactId>
-		    <version>2.8</version>
-		</dependency>
-		<!-- override plexus-compiler-javac-errorprone's dependency on
-		       Error Prone with the latest version -->
-		<dependency>
-		    <groupId>com.google.errorprone</groupId>
-		    <artifactId>error_prone_core</artifactId>
-		    <version>2.1.3</version>
-		</dependency>
+	<dependency>
+            <groupId>com.uber.nullaway</groupId>
+            <artifactId>nullaway</artifactId>
+            <version>0.3.0</version>
+	</dependency>
+	<dependency>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>plexus-compiler-javac-errorprone</artifactId>
+            <version>2.8</version>
+	</dependency>
+	<!-- override plexus-compiler-javac-errorprone's dependency on
+             Error Prone with the latest version -->
+	<dependency>
+            <groupId>com.google.errorprone</groupId>
+            <artifactId>error_prone_core</artifactId>
+            <version>2.1.3</version>
+	</dependency>
     </dependencies>
 
     <repositories>
@@ -158,32 +158,32 @@
                 </dependencies>
             </plugin>
 			
-			<plugin>
-			    <groupId>org.apache.maven.plugins</groupId>
-			    <artifactId>maven-compiler-plugin</artifactId>
-			    <version>3.5</version>
-			    <configuration>
-			        <compilerId>javac-with-errorprone</compilerId>
-			        <forceJavacCompilerUse>true</forceJavacCompilerUse>
-			        <source>1.8</source>
-			        <target>1.8</target>
-			        <showWarnings>true</showWarnings>
-			        <annotationProcessorPaths>
-			            <path>
-			                <groupId>com.uber.nullaway</groupId>
-			                <artifactId>nullaway</artifactId>
-			                <version>0.3.0</version>
-			            </path>
-			        </annotationProcessorPaths>
-			        <compilerArgs>
-			            <!-- NullAway will warn by default, uncomment the next line to make the build fail -->
-			            <!-- <arg>-Xep:NullAway:ERROR</arg> -->
-			            <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*</arg>
-			            <arg>-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway</arg>
-			        </compilerArgs>
-			    </configuration>
-			    <dependencies>
-			        <dependency>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+		<artifactId>maven-compiler-plugin</artifactId>
+		<version>3.5</version>
+		<configuration>
+                    <compilerId>javac-with-errorprone</compilerId>
+                    <forceJavacCompilerUse>true</forceJavacCompilerUse>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <showWarnings>true</showWarnings>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>com.uber.nullaway</groupId>
+                            <artifactId>nullaway</artifactId>
+                            <version>0.3.0</version>
+                        </path>
+                    </annotationProcessorPaths>
+                    <compilerArgs>
+                        <!-- NullAway will warn by default, uncomment the next line to make the build fail -->
+                        <!-- <arg>-Xep:NullAway:ERROR</arg> -->
+                        <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*</arg>
+                        <arg>-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway</arg>
+                    </compilerArgs>
+                </configuration>
+                <dependencies>
+                    <dependency>
                         <groupId>org.codehaus.plexus</groupId>
                         <artifactId>plexus-compiler-javac-errorprone</artifactId>
                         <version>2.8</version>

From 97885bd06ef5134b7bae19d57f76a7933ef532b7 Mon Sep 17 00:00:00 2001
From: piuserre <giuseppe.pierri@yahoo.com>
Date: Wed, 18 Mar 2020 16:27:58 +0100
Subject: [PATCH 021/404] fix launch run command

---
 spring-jenkins-pipeline/scripted-pipeline-unix-nonunix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix
index b76bb8a81a..871fee4ccb 100644
--- a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix
+++ b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix
@@ -72,7 +72,7 @@ node {
                     if (isUnix()) {
                         sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &'
                     } else {
-                        bat 'start ./mvnw.cmd spring-boot:run -Dserver.port=8989'
+                        bat 'start mvnw.cmd spring-boot:run -Dserver.port=8989'
                     }
                 }
             }

From f95c25d461a4abdb3e303404e7e8f965990d0c02 Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Wed, 18 Mar 2020 16:01:52 -0400
Subject: [PATCH 022/404] Added com.baeldung.distinct.Person to libraries-3

---
 .../java/com/baeldung/distinct/Person.java    | 65 +++++++++++++++++++
 1 file changed, 65 insertions(+)
 create mode 100644 libraries-3/src/main/java/com/baeldung/distinct/Person.java

diff --git a/libraries-3/src/main/java/com/baeldung/distinct/Person.java b/libraries-3/src/main/java/com/baeldung/distinct/Person.java
new file mode 100644
index 0000000000..8a2a5f7a45
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/distinct/Person.java
@@ -0,0 +1,65 @@
+package com.baeldung.distinct;
+
+public class Person {
+    int age;
+    String name;
+    String email;
+
+    public Person(int age, String name, String email) {
+        super();
+        this.age = age;
+        this.name = name;
+        this.email = email;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("Person [age=");
+        builder.append(age);
+        builder.append(", name=");
+        builder.append(name);
+        builder.append(", email=");
+        builder.append(email);
+        builder.append("]");
+        return builder.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((email == null) ? 0 : email.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Person other = (Person) obj;
+        if (email == null) {
+            if (other.email != null)
+                return false;
+        } else if (!email.equals(other.email))
+            return false;
+        return true;
+    }
+
+}

From 4cd3cc23361cc1d9f70a4179a8050c8cb7b49bf6 Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Thu, 19 Mar 2020 07:04:24 -0400
Subject: [PATCH 023/404] Updated error_prone_core version to 2.3.4.

---
 libraries-3/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index fe007dfc4d..5c373b88dc 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -193,7 +193,7 @@
                     <dependency>
                         <groupId>com.google.errorprone</groupId>
                         <artifactId>error_prone_core</artifactId>
-                        <version>2.1.3</version>
+                        <version>2.3.4</version>
                     </dependency>
                 </dependencies>
             </plugin>

From d16ed66dcc3e7e03ad7f5a225f25d5b4f606b6bf Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Thu, 19 Mar 2020 09:18:23 -0400
Subject: [PATCH 024/404] Updated pom to tell errorprone to excluude the jcabi
 directory.

---
 libraries-3/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index 5c373b88dc..8e0a93c982 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -178,7 +178,7 @@
                     <compilerArgs>
                         <!-- NullAway will warn by default, uncomment the next line to make the build fail -->
                         <!-- <arg>-Xep:NullAway:ERROR</arg> -->
-                        <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*</arg>
+                        <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*|(.*)/jcabi/.*</arg>
                         <arg>-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway</arg>
                     </compilerArgs>
                 </configuration>

From d23c8aa41de79a1b06854821e30afc8d0cee8f7d Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Thu, 19 Mar 2020 22:28:55 +0200
Subject: [PATCH 025/404] [BAEL-3913] Initial commit for prevent commandline
 application runner execution during JUnit test article

---
 .../spring-boot-testing/README.md             |  1 +
 .../ApplicationCommandLineRunnerApp.java      | 11 +++++
 .../ApplicationRunnerTaskExecutor.java        | 26 +++++++++++
 .../execution/CommandLineTaskExecutor.java    | 25 +++++++++++
 .../runner/execution/TaskService.java         | 14 ++++++
 .../LoadSpringContextIntegrationTest.java     | 44 +++++++++++++++++++
 .../RunApplicationIntegrationTest.java        | 26 +++++++++++
 ...icationWithTestProfileIntegrationTest.java | 33 ++++++++++++++
 ...tionWithTestPropertiesIntegrationTest.java | 34 ++++++++++++++
 9 files changed, 214 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md
index 0b2533e6bc..b033826541 100644
--- a/spring-boot-modules/spring-boot-testing/README.md
+++ b/spring-boot-modules/spring-boot-testing/README.md
@@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
 - [Exclude Auto-Configuration Classes in Spring Boot Tests](https://www.baeldung.com/spring-boot-exclude-auto-configuration-test)
 - [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level)
 - [Embedded Redis Server with Spring Boot Test](https://www.baeldung.com/spring-embedded-redis)
+- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing]()
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java
new file mode 100644
index 0000000000..76e18dfd2f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java
@@ -0,0 +1,11 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ApplicationCommandLineRunnerApp {
+    public static void main(String[] args) {
+        SpringApplication.run(ApplicationCommandLineRunnerApp.class, args);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java
new file mode 100644
index 0000000000..98d4654d25
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java
@@ -0,0 +1,26 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+@Profile("!test")
+@ConditionalOnProperty(prefix = "application.runner", 
+                       value = "enabled", 
+                       havingValue = "true", 
+                       matchIfMissing = true)
+@Component
+public class ApplicationRunnerTaskExecutor implements ApplicationRunner {
+    private TaskService taskService;
+
+    public ApplicationRunnerTaskExecutor(TaskService taskService) {
+        this.taskService = taskService;
+    }
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        taskService.execute("application runner task");
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java
new file mode 100644
index 0000000000..4a77d78429
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java
@@ -0,0 +1,25 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+@Profile("!test")
+@ConditionalOnProperty(prefix = "command.line.runner", 
+                       value = "enabled", 
+                       havingValue = "true", 
+                       matchIfMissing = true)
+@Component
+public class CommandLineTaskExecutor implements CommandLineRunner {
+    private TaskService taskService;
+
+    public CommandLineTaskExecutor(TaskService taskService) {
+        this.taskService = taskService;
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        taskService.execute("command line runner task");
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java
new file mode 100644
index 0000000000..dac437e72d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java
@@ -0,0 +1,14 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TaskService {
+    private static Logger logger = LoggerFactory.getLogger(TaskService.class);
+
+    public void execute(String task) {
+        logger.info("do " + task);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
new file mode 100644
index 0000000000..911b16615d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer;
+import org.springframework.boot.test.mock.mockito.SpyBean;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import com.baeldung.prevent.commandline.application.runner.execution.ApplicationCommandLineRunnerApp;
+import com.baeldung.prevent.commandline.application.runner.execution.TaskService;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(classes = {ApplicationCommandLineRunnerApp.class},
+        initializers = ConfigFileApplicationContextInitializer.class)
+public class LoadSpringContextIntegrationTest {
+    @SpyBean
+    TaskService taskService;
+
+    @SpyBean
+    CommandLineRunner commandLineRunner;
+
+    @SpyBean
+    ApplicationRunner applicationRunner;
+
+    @Test
+    void whenContextLoads_thenAllBeansAreLoadedButCommandLineAndApplicationRunnerAreNotExecuted() 
+        throws Exception {
+        assertNotNull(taskService);
+        assertNotNull(commandLineRunner);
+        assertNotNull(applicationRunner);
+
+        verify(taskService, times(0)).execute(any());
+        verify(commandLineRunner, times(0)).run(any());
+        verify(applicationRunner, times(0)).run(any());
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java
new file mode 100644
index 0000000000..d732bc5260
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.SpyBean;
+
+import com.baeldung.prevent.commandline.application.runner.execution.ApplicationRunnerTaskExecutor;
+import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+@SpringBootTest
+class RunApplicationIntegrationTest {
+    @SpyBean
+    ApplicationRunnerTaskExecutor applicationRunnerTaskExecutor;
+    @SpyBean
+    CommandLineTaskExecutor commandLineTaskExecutor;
+
+    @Test
+    void whenContextLoads_thenTheCommandLineAndApplicationRunnerAreExecuted() throws Exception {
+        verify(applicationRunnerTaskExecutor, times(1)).run(any());
+        verify(commandLineTaskExecutor, times(1)).run(any());
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java
new file mode 100644
index 0000000000..b5e09077c6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.ActiveProfiles;
+
+import com.baeldung.prevent.commandline.application.runner.execution.ApplicationRunnerTaskExecutor;
+import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor;
+import com.baeldung.prevent.commandline.application.runner.execution.TaskService;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ActiveProfiles("test")
+@SpringBootTest
+class RunApplicationWithTestProfileIntegrationTest {
+    @Autowired
+    private ApplicationContext context;
+
+    @Test
+    void whenContextLoads_thenTheCommandLineAndApplicationRunnerAreNotLoaded() {
+        assertNotNull(context.getBean(TaskService.class));
+        assertThrows(NoSuchBeanDefinitionException.class,
+                () -> context.getBean(CommandLineTaskExecutor.class),
+                "CommandLineRunner should not be loaded during this integration test");
+        assertThrows(NoSuchBeanDefinitionException.class,
+                () -> context.getBean(ApplicationRunnerTaskExecutor.class),
+                "ApplicationRunner should not be loaded during this integration test");
+    }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java
new file mode 100644
index 0000000000..9ab8baec14
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.prevent.commandline.application.runner.execution;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+
+import com.baeldung.prevent.commandline.application.runner.execution.ApplicationRunnerTaskExecutor;
+import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor;
+import com.baeldung.prevent.commandline.application.runner.execution.TaskService;
+
+@SpringBootTest(
+        properties = {
+                "command.line.runner.enabled=false",
+                "application.runner.enabled=false"
+        })
+class RunApplicationWithTestPropertiesIntegrationTest {
+    @Autowired
+    private ApplicationContext context;
+
+    @Test
+    void whenContextLoads_thenTheCommandLineAndApplicationRunnerAreNotLoaded() {
+        assertNotNull(context.getBean(TaskService.class));
+        assertThrows(NoSuchBeanDefinitionException.class,
+                () -> context.getBean(CommandLineTaskExecutor.class),
+                "CommandLineRunner should not be loaded during this integration test");
+        assertThrows(NoSuchBeanDefinitionException.class,
+                () -> context.getBean(ApplicationRunnerTaskExecutor.class),
+                "ApplicationRunner should not be loaded during this integration test");
+    }
+}

From 5f652fb842f247ad7d859921af5e64a93fe32470 Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Sun, 22 Mar 2020 19:14:28 +0100
Subject: [PATCH 026/404] [ BAEL-3751 ] : Initialize CI/CD module with
 application

---
 pom.xml                                       |  2 +
 spring-boot-ci-cd/README.md                   |  1 +
 spring-boot-ci-cd/pom.xml                     | 39 +++++++++++++++++++
 .../com/baeldung/cicd/CiCdApplication.java    | 12 ++++++
 .../main/resources/introduction-config.yml    |  1 +
 5 files changed, 55 insertions(+)
 create mode 100644 spring-boot-ci-cd/README.md
 create mode 100644 spring-boot-ci-cd/pom.xml
 create mode 100644 spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java
 create mode 100644 spring-boot-ci-cd/src/main/resources/introduction-config.yml

diff --git a/pom.xml b/pom.xml
index 15331d8c95..9cf1aa2e92 100644
--- a/pom.xml
+++ b/pom.xml
@@ -638,6 +638,7 @@
 
                 <module>spring-batch</module>
                 <module>spring-bom</module>
+                <module>spring-boot-ci-cd</module>
                 <module>spring-boot-modules</module>
                 <module>spring-boot-rest</module>
 
@@ -1141,6 +1142,7 @@
 
                 <module>spring-batch</module>
                 <module>spring-bom</module>
+                <module>spring-boot-ci-cd</module>
                 <module>spring-boot-modules</module>
                 <module>spring-boot-rest</module>
 
diff --git a/spring-boot-ci-cd/README.md b/spring-boot-ci-cd/README.md
new file mode 100644
index 0000000000..d207cd0fa0
--- /dev/null
+++ b/spring-boot-ci-cd/README.md
@@ -0,0 +1 @@
+# Spring Boot CI/CD
\ No newline at end of file
diff --git a/spring-boot-ci-cd/pom.xml b/spring-boot-ci-cd/pom.xml
new file mode 100644
index 0000000000..070294fdce
--- /dev/null
+++ b/spring-boot-ci-cd/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>spring-boot-ci-cd</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <name>spring-boot-ci-cd</name>
+  <packaging>jar</packaging>
+
+  <parent>
+    <groupId>com.baeldung</groupId>
+    <artifactId>parent-boot-2</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <relativePath>../parent-boot-2</relativePath>
+  </parent>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+<plugin>
+  <groupId>org.springframework.boot</groupId>
+  <artifactId>spring-boot-maven-plugin</artifactId>
+</plugin>
+    </plugins>
+  </build>
+
+</project>
\ No newline at end of file
diff --git a/spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java b/spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java
new file mode 100644
index 0000000000..8451084148
--- /dev/null
+++ b/spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.cicd;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CiCdApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CiCdApplication.class, args);
+    }
+}
diff --git a/spring-boot-ci-cd/src/main/resources/introduction-config.yml b/spring-boot-ci-cd/src/main/resources/introduction-config.yml
new file mode 100644
index 0000000000..02ff36de05
--- /dev/null
+++ b/spring-boot-ci-cd/src/main/resources/introduction-config.yml
@@ -0,0 +1 @@
+defaultSize: 5
\ No newline at end of file

From adf1ee9b0db6593d6480f350a6448994e193da89 Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Sun, 22 Mar 2020 22:06:44 +0200
Subject: [PATCH 027/404] [BAEL-3913] Fixed broken lines format and reduced the
 test method names length

---
 .../ApplicationRunnerTaskExecutor.java        |  9 ++++----
 .../execution/CommandLineTaskExecutor.java    |  9 ++++----
 .../LoadSpringContextIntegrationTest.java     |  7 +++---
 .../RunApplicationIntegrationTest.java        |  2 +-
 ...icationWithTestProfileIntegrationTest.java | 14 ++++++------
 ...tionWithTestPropertiesIntegrationTest.java | 22 +++++++++----------
 6 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java
index 98d4654d25..3bf08491bf 100644
--- a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java
@@ -7,10 +7,11 @@ import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
 @Profile("!test")
-@ConditionalOnProperty(prefix = "application.runner", 
-                       value = "enabled", 
-                       havingValue = "true", 
-                       matchIfMissing = true)
+@ConditionalOnProperty(
+  prefix = "application.runner", 
+  value = "enabled", 
+  havingValue = "true", 
+  matchIfMissing = true)
 @Component
 public class ApplicationRunnerTaskExecutor implements ApplicationRunner {
     private TaskService taskService;
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java
index 4a77d78429..38fd3b9c0a 100644
--- a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java
@@ -6,10 +6,11 @@ import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
 @Profile("!test")
-@ConditionalOnProperty(prefix = "command.line.runner", 
-                       value = "enabled", 
-                       havingValue = "true", 
-                       matchIfMissing = true)
+@ConditionalOnProperty(
+  prefix = "command.line.runner", 
+  value = "enabled", 
+  havingValue = "true", 
+  matchIfMissing = true)
 @Component
 public class CommandLineTaskExecutor implements CommandLineRunner {
     private TaskService taskService;
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
index 911b16615d..c3922536b1 100644
--- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
@@ -18,8 +18,8 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 @ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = {ApplicationCommandLineRunnerApp.class},
-        initializers = ConfigFileApplicationContextInitializer.class)
+@ContextConfiguration(classes = { ApplicationCommandLineRunnerApp.class }, 
+                      initializers = ConfigFileApplicationContextInitializer.class)
 public class LoadSpringContextIntegrationTest {
     @SpyBean
     TaskService taskService;
@@ -31,8 +31,7 @@ public class LoadSpringContextIntegrationTest {
     ApplicationRunner applicationRunner;
 
     @Test
-    void whenContextLoads_thenAllBeansAreLoadedButCommandLineAndApplicationRunnerAreNotExecuted() 
-        throws Exception {
+    void whenContextLoads_thenRunnersDoNotRun() throws Exception {
         assertNotNull(taskService);
         assertNotNull(commandLineRunner);
         assertNotNull(applicationRunner);
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java
index d732bc5260..26a7339f1d 100644
--- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java
@@ -19,7 +19,7 @@ class RunApplicationIntegrationTest {
     CommandLineTaskExecutor commandLineTaskExecutor;
 
     @Test
-    void whenContextLoads_thenTheCommandLineAndApplicationRunnerAreExecuted() throws Exception {
+    void whenContextLoads_thenRunnersRun() throws Exception {
         verify(applicationRunnerTaskExecutor, times(1)).run(any());
         verify(commandLineTaskExecutor, times(1)).run(any());
     }
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java
index b5e09077c6..333cd2ab91 100644
--- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java
@@ -21,13 +21,13 @@ class RunApplicationWithTestProfileIntegrationTest {
     private ApplicationContext context;
 
     @Test
-    void whenContextLoads_thenTheCommandLineAndApplicationRunnerAreNotLoaded() {
+    void whenContextLoads_thenRunnersAreNotLoaded() {
         assertNotNull(context.getBean(TaskService.class));
-        assertThrows(NoSuchBeanDefinitionException.class,
-                () -> context.getBean(CommandLineTaskExecutor.class),
-                "CommandLineRunner should not be loaded during this integration test");
-        assertThrows(NoSuchBeanDefinitionException.class,
-                () -> context.getBean(ApplicationRunnerTaskExecutor.class),
-                "ApplicationRunner should not be loaded during this integration test");
+        assertThrows(NoSuchBeanDefinitionException.class, 
+          () -> context.getBean(CommandLineTaskExecutor.class), 
+          "CommandLineRunner should not be loaded during this integration test");
+        assertThrows(NoSuchBeanDefinitionException.class, 
+          () -> context.getBean(ApplicationRunnerTaskExecutor.class), 
+          "ApplicationRunner should not be loaded during this integration test");
     }
 }
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java
index 9ab8baec14..264a06a41e 100644
--- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java
@@ -12,23 +12,21 @@ import com.baeldung.prevent.commandline.application.runner.execution.Application
 import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor;
 import com.baeldung.prevent.commandline.application.runner.execution.TaskService;
 
-@SpringBootTest(
-        properties = {
-                "command.line.runner.enabled=false",
-                "application.runner.enabled=false"
-        })
+@SpringBootTest(properties = { 
+  "command.line.runner.enabled=false", 
+  "application.runner.enabled=false" })
 class RunApplicationWithTestPropertiesIntegrationTest {
     @Autowired
     private ApplicationContext context;
 
     @Test
-    void whenContextLoads_thenTheCommandLineAndApplicationRunnerAreNotLoaded() {
+    void whenContextLoads_thenRunnersAreNotLoaded() {
         assertNotNull(context.getBean(TaskService.class));
-        assertThrows(NoSuchBeanDefinitionException.class,
-                () -> context.getBean(CommandLineTaskExecutor.class),
-                "CommandLineRunner should not be loaded during this integration test");
-        assertThrows(NoSuchBeanDefinitionException.class,
-                () -> context.getBean(ApplicationRunnerTaskExecutor.class),
-                "ApplicationRunner should not be loaded during this integration test");
+        assertThrows(NoSuchBeanDefinitionException.class, 
+          () -> context.getBean(CommandLineTaskExecutor.class), 
+          "CommandLineRunner should not be loaded during this integration test");
+        assertThrows(NoSuchBeanDefinitionException.class, 
+          () -> context.getBean(ApplicationRunnerTaskExecutor.class), 
+          "ApplicationRunner should not be loaded during this integration test");
     }
 }

From a3d7eb0bf3ab5ce0a101c97a75ae213dccb73f62 Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Sun, 22 Mar 2020 23:55:33 +0200
Subject: [PATCH 028/404] [BAEL-3913] Fixed broken lines format

---
 .../runner/execution/LoadSpringContextIntegrationTest.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
index c3922536b1..6698094550 100644
--- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java
@@ -19,7 +19,7 @@ import static org.mockito.Mockito.verify;
 
 @ExtendWith(SpringExtension.class)
 @ContextConfiguration(classes = { ApplicationCommandLineRunnerApp.class }, 
-                      initializers = ConfigFileApplicationContextInitializer.class)
+  initializers = ConfigFileApplicationContextInitializer.class)
 public class LoadSpringContextIntegrationTest {
     @SpyBean
     TaskService taskService;

From 5249021b680b550922c2fed9a4770601ce38c4a1 Mon Sep 17 00:00:00 2001
From: Nacho Verdu <nacho.verdu@manticpoint.com>
Date: Wed, 18 Mar 2020 18:22:32 +0000
Subject: [PATCH 029/404] BAEL-3912: Changes done for comments

BAEL-3912: Changes done for comments

BAEL-3912: Changes done for comments

BAEL-3912: Changes done for comments

BAEL-3912: Changes done for comments

BAEL-3912: Changes done for comments

BAEL-3912: Changes done for comments
---
 .../getweeknumber/GetWeekNumberNewJava.java   | 29 -----------
 .../getweeknumber/GetWeekNumberOldJava.java   | 35 -------------
 .../weeknumber/WeekNumberUsingCalendar.java   | 41 ++++++++++++++++
 .../weeknumber/WeekNumberUsingLocalDate.java  | 30 ++++++++++++
 .../WeekNumberUsingCalendarUnitTest.java      | 46 +++++++++++++++++
 .../WeekNumberUsingLocalDateUnitTest.java     | 49 +++++++++++++++++++
 6 files changed, 166 insertions(+), 64 deletions(-)
 delete mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java
 delete mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java
 create mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java
 create mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java
 create mode 100644 core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java
 create mode 100644 core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java

diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java
deleted file mode 100644
index abe9367fc2..0000000000
--- a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberNewJava.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.getweeknumber;
-
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-
-public class GetWeekNumberNewJava {
-	private LocalDate date;
-
-	public GetWeekNumberNewJava(String day, String dayFormat) {
-		date = LocalDate.parse(day, DateTimeFormatter.ofPattern(dayFormat));
-	}
-	
-	public GetWeekNumberNewJava(int year, int month, int day) {
-		date = LocalDate.of(year, month, day); 
-	}
-	
-	public DayOfWeek getDayOfWeek() {
-		return date.getDayOfWeek();
-	}
-	
-	public static void main(String[] args) {
-		GetWeekNumberNewJava example1 = new GetWeekNumberNewJava(2020, 3, 2);
-		System.out.println(example1.getDayOfWeek());
-
-		GetWeekNumberNewJava example2 = new GetWeekNumberNewJava("20200302", "yyyyMMdd");
-		System.out.println(example2.getDayOfWeek().getValue());
-	}
-}
diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java
deleted file mode 100644
index 6a63d24607..0000000000
--- a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/getweeknumber/GetWeekNumberOldJava.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.baeldung.getweeknumber;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-
-public class GetWeekNumberOldJava {
-	private Calendar calendar;
-
-	public GetWeekNumberOldJava(String day, String dayFormat) throws ParseException {
-		SimpleDateFormat sdf = new SimpleDateFormat(dayFormat);
-
-		calendar = Calendar.getInstance();
-		Date date = sdf.parse(day);
-		calendar.setTime(date);
-	}
-
-	public GetWeekNumberOldJava(int year, int month, int day) {
-		calendar = Calendar.getInstance();
-		calendar.set(year, month, day);
-	}
-
-	public int getDayOfWeek() {
-		return calendar.get(Calendar.DAY_OF_WEEK);
-	}
-
-	public static void main(String[] args) throws ParseException {
-		GetWeekNumberOldJava example1 = new GetWeekNumberOldJava(2020, 2, 2);
-		System.out.println(example1.getDayOfWeek());
-
-		GetWeekNumberOldJava example2 = new GetWeekNumberOldJava("20200302", "yyyyMMdd");
-		System.out.println(example2.getDayOfWeek());
-	}
-}
diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java
new file mode 100644
index 0000000000..db32421aa4
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingCalendar.java
@@ -0,0 +1,41 @@
+package com.baeldung.weeknumber;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+public class WeekNumberUsingCalendar {
+
+    public int getWeekNumberFrom(String day, String dateFormat, Locale locale) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
+
+        Calendar calendar = Calendar.getInstance(locale);
+        Date date = sdf.parse(day);
+        calendar.setTime(date);
+
+        return calendar.get(Calendar.WEEK_OF_YEAR);
+    }
+
+    public int getWeekNumberFrom(int year, int month, int day, Locale locale) {
+        Calendar calendar = Calendar.getInstance(locale);
+        calendar.set(year, month, day);
+
+        return calendar.get(Calendar.WEEK_OF_YEAR);
+    }
+
+    public int getWeekNumberFrom(int year, int month, int day, int firstDayOfWeek, int minimalDaysInFirstWeek, Locale locale) {
+        Calendar calendar = Calendar.getInstance(locale);
+        calendar.setFirstDayOfWeek(firstDayOfWeek);
+        calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek);
+        calendar.set(year, month, day);
+
+        return calendar.get(Calendar.WEEK_OF_YEAR);
+    }
+
+    public static void main(String[] args) {
+        WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar();
+        System.out.println(calendar.getWeekNumberFrom(2020, 2, 22, Locale.CANADA));
+    }
+}
diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java
new file mode 100644
index 0000000000..4e1b7be3be
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/weeknumber/WeekNumberUsingLocalDate.java
@@ -0,0 +1,30 @@
+package com.baeldung.weeknumber;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoField;
+import java.time.temporal.WeekFields;
+import java.util.Locale;
+
+public class WeekNumberUsingLocalDate {
+
+    public Integer getWeekNumberUsingWeekFiedsFrom(String day, String dayFormat, Locale locale) {
+        LocalDate date = LocalDate.parse(day, DateTimeFormatter.ofPattern(dayFormat));
+
+        return date.get(WeekFields.of(locale)
+            .weekOfYear());
+    }
+
+    public Integer getWeekNumberUsinWeekFieldsFrom(int year, int month, int day, Locale locale) {
+        LocalDate date = LocalDate.of(year, month, day);
+
+        return date.get(WeekFields.of(locale)
+            .weekOfYear());
+    }
+
+    public Integer getWeekNumberUsingChronoFieldFrom(int year, int month, int day) {
+        LocalDate date = LocalDate.of(year, month, day);
+
+        return date.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
+    }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java
new file mode 100644
index 0000000000..587a459277
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingCalendarUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.weeknumber;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class WeekNumberUsingCalendarUnitTest {
+    @Test
+    public void givenDateInStringAndDateFormatUsingLocaleItaly_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() throws ParseException {
+        WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar();
+
+        assertEquals(12, calendar.getWeekNumberFrom("20200322", "yyyyMMdd", Locale.ITALY));
+    }
+
+    @Test
+    public void givenDateInStringAndDateFormatUsingLocaleCanada_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() throws ParseException {
+        WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar();
+
+        assertEquals(13, calendar.getWeekNumberFrom("20200322", "yyyyMMdd", Locale.CANADA));
+    }
+
+    @Test
+    public void givenDateInYearMonthDayNumbersLocaleItaly_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() {
+        WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar();
+
+        assertEquals(12, calendar.getWeekNumberFrom(2020, 2, 22, Locale.ITALY));
+    }
+
+    @Test
+    public void givenDateInYearMonthDayNumbersLocaleItalyChangingWeekCalculationSettings_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() {
+        WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar();
+
+        assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Calendar.SUNDAY, 4, Locale.ITALY));
+    }
+
+    @Test
+    public void givenDateInYearMonthDayNumbersLocaleCanada_thenGettingWeekNumberUsingCalendarIsCorrectlyReturned() {
+        WeekNumberUsingCalendar calendar = new WeekNumberUsingCalendar();
+
+        assertEquals(13, calendar.getWeekNumberFrom(2020, 2, 22, Locale.CANADA));
+    }
+}
diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java
new file mode 100644
index 0000000000..9b98222ece
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/weeknumber/WeekNumberUsingLocalDateUnitTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.weeknumber;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class WeekNumberUsingLocalDateUnitTest {
+    @Test
+    public void givenDateInStringAndDateFormatUsingWeekFieldsWithLocaleItaly_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() {
+        WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate();
+
+        assertEquals(12, localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.ITALY)
+            .longValue());
+    }
+
+    @Test
+    public void givenDateInStringAndDateFormatUsingWeekFieldsWithLocaleCanada_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() {
+        WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate();
+
+        assertEquals(13, localDate.getWeekNumberUsingWeekFiedsFrom("20200322", "yyyyMMdd", Locale.CANADA)
+            .longValue());
+    }
+
+    @Test
+    public void givenDateInStringAndDateFormatUsingChronoFieds_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() {
+        WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate();
+
+        assertEquals(12, localDate.getWeekNumberUsingChronoFieldFrom(2020, 3, 22)
+            .longValue());
+    }
+
+    @Test
+    public void givenDateInYearMonthDayNumbersUsingWeekFieldsWithLocaleItaly_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() {
+        WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate();
+
+        assertEquals(12, localDate.getWeekNumberUsinWeekFieldsFrom(2020, 3, 22, Locale.ITALY)
+            .longValue());
+    }
+
+    @Test
+    public void givenDateInYearMonthDayNumbersUsingWeekFieldsWithLocaleCanada_thenGettingWeekNumberUsingLocalDateIsCorrectlyReturned() {
+        WeekNumberUsingLocalDate localDate = new WeekNumberUsingLocalDate();
+
+        assertEquals(13, localDate.getWeekNumberUsinWeekFieldsFrom(2020, 3, 22, Locale.CANADA)
+            .longValue());
+    }
+}

From 7a9ec696af348adc1c4c82e9de0ed8568de3ce95 Mon Sep 17 00:00:00 2001
From: Tyrell Flurry <tyrellflurry@gmail.com>
Date: Wed, 1 Apr 2020 18:08:39 -0400
Subject: [PATCH 030/404] BAEL-3929: added unused maven dependencies example.

---
 maven-all/maven-unused-dependencies/pom.xml   | 30 +++++++++++++++++++
 .../src/main/java/com/baeldung/Main.java      | 20 +++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 maven-all/maven-unused-dependencies/pom.xml
 create mode 100644 maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java

diff --git a/maven-all/maven-unused-dependencies/pom.xml b/maven-all/maven-unused-dependencies/pom.xml
new file mode 100644
index 0000000000..312f38ed93
--- /dev/null
+++ b/maven-all/maven-unused-dependencies/pom.xml
@@ -0,0 +1,30 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.baeldung</groupId>
+    <artifactId>maven-unused-dependencies</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.25</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.1.1</version>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
new file mode 100644
index 0000000000..8143c7d19f
--- /dev/null
+++ b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
@@ -0,0 +1,20 @@
+package com.baeldung;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.slf4j.LoggerFactory;
+
+public class Main {
+
+    public static void main(String[] args) {
+        Map<String, String> teamMap = new HashMap<>();
+        teamMap.put("Dallas", "Cowboys");
+        teamMap.put("Green Bay", "Packers");
+        teamMap.put("Washington", "Redskins");
+
+        LoggerFactory.getLogger(Main.class)
+            .info("Team Map: {}", teamMap);
+
+    }
+}

From 63dcae64238124c6cfe87a96bea4e08358a6e936 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Wed, 1 Apr 2020 19:18:10 +0200
Subject: [PATCH 031/404] Practical example of Hexagonal architecture - add
 project

---
 .../baeldung/employee/config/AppConfig.java   | 73 +++++++++++++++++++
 .../config/ApplicationInitializer.java        | 29 ++++++++
 .../employee/data/EmployeeDataAdapter.java    |  9 +++
 .../data/EmployeeDataAdapterImpl.java         | 28 +++++++
 .../baeldung/employee/data/EmployeeRepo.java  |  9 +++
 .../baeldung/employee/domain/Employee.java    | 43 +++++++++++
 .../baeldung/employee/dto/EmployeeDTO.java    |  9 +++
 .../employee/service/EmployeeController.java  | 47 ++++++++++++
 .../employee/service/EmployeeService.java     |  8 ++
 .../employee/service/EmployeeServiceImpl.java | 25 +++++++
 EmpServiceApp/src/createEmployeeTable.sql     | 11 +++
 .../web/WEB-INF/applicationContext.xml        | 12 +++
 EmpServiceApp/web/WEB-INF/web.xml             | 25 +++++++
 13 files changed, 328 insertions(+)
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java
 create mode 100644 EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java
 create mode 100644 EmpServiceApp/src/createEmployeeTable.sql
 create mode 100644 EmpServiceApp/web/WEB-INF/applicationContext.xml
 create mode 100644 EmpServiceApp/web/WEB-INF/web.xml

diff --git a/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java b/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
new file mode 100644
index 0000000000..3f6919b8f5
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
@@ -0,0 +1,73 @@
+package com.baeldung.employee.config;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+
+import org.modelmapper.ModelMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.TransactionManager;
+
+@Configuration
+@EnableJpaRepositories(basePackages = "com.baeldung.employee.data", entityManagerFactoryRef = "emf")
+@ComponentScan(basePackages = "com.baeldung.employee")
+public class AppConfig {
+
+    @Bean
+    public DataSource h2DataSource() {
+
+        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
+        EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.H2)
+            .addScript("createEmployeeTable.sql")
+            .build();
+        return db;
+
+    }
+
+    @Bean
+    public ModelMapper mapper() {
+
+        return new ModelMapper();
+    }
+
+    /*    @Bean
+    public ObjectMapper objectMapper() {
+    
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
+    
+        return mapper;
+    }
+    */
+
+    @Bean(name = "emf")
+    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+
+        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+
+        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
+        factory.setJpaVendorAdapter(vendorAdapter);
+        factory.setPackagesToScan("com.baeldung.employee");
+        factory.setDataSource(h2DataSource());
+        // factory.setJpaProperties(jpaProperties());
+
+        return factory;
+    }
+
+    @Bean
+    public TransactionManager jpaTransactionManager(EntityManagerFactory emf) {
+        JpaTransactionManager transactionManager = new JpaTransactionManager();
+        transactionManager.setEntityManagerFactory(emf);
+        return transactionManager;
+    }
+
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java b/EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java
new file mode 100644
index 0000000000..491e97b2c8
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java
@@ -0,0 +1,29 @@
+package com.baeldung.employee.config;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+public class ApplicationInitializer implements WebApplicationInitializer {
+
+    @Override
+    public void onStartup(ServletContext servletContext) throws ServletException {
+
+        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
+        context.register(AppConfig.class);
+
+        servletContext.addListener(new ContextLoaderListener(context));
+
+        // Create DispatcherServlet
+
+        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("EmployeeSpringApp", new DispatcherServlet());
+        dispatcher.setLoadOnStartup(1);
+        dispatcher.addMapping("/app");
+
+    }
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java
new file mode 100644
index 0000000000..da5d5bb1a3
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java
@@ -0,0 +1,9 @@
+package com.baeldung.employee.data;
+
+import com.baeldung.employee.dto.EmployeeDTO;
+
+public interface EmployeeDataAdapter {
+
+    void addEmployee(EmployeeDTO emp);
+
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java
new file mode 100644
index 0000000000..54b3079844
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java
@@ -0,0 +1,28 @@
+package com.baeldung.employee.data;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.modelmapper.ModelMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.employee.domain.Employee;
+import com.baeldung.employee.dto.EmployeeDTO;
+
+@Component
+public class EmployeeDataAdapterImpl implements EmployeeDataAdapter {
+
+    @PersistenceContext
+    private EntityManager em;
+
+    @Autowired
+    private ModelMapper modelMapper;
+
+    @Override
+    public void addEmployee(EmployeeDTO emp) {
+
+        em.persist(modelMapper.map(emp, Employee.class));
+
+    }
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
new file mode 100644
index 0000000000..4d63dc391d
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
@@ -0,0 +1,9 @@
+package com.baeldung.employee.data;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.baeldung.employee.domain.Employee;
+
+public interface EmployeeRepo extends JpaRepository<Employee, Long> {
+
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java b/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
new file mode 100644
index 0000000000..f9cd937c21
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
@@ -0,0 +1,43 @@
+package com.baeldung.employee.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "EMPLOYEE")
+public class Employee {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private int id;
+
+    private String name;
+
+    public Employee() {
+    }
+
+    public Employee(int id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    // Standard constructors, getters and setters
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java b/EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java
new file mode 100644
index 0000000000..3b6b048a9c
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java
@@ -0,0 +1,9 @@
+package com.baeldung.employee.dto;
+
+public class EmployeeDTO {
+
+    private long id;
+    private String name;
+
+    // Standard constructors, getters and setters
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java
new file mode 100644
index 0000000000..b258d11018
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java
@@ -0,0 +1,47 @@
+package com.baeldung.employee.service;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import com.baeldung.employee.domain.Employee;
+
+@RestController
+public class EmployeeController {
+
+    @Autowired
+    private EmployeeService empService;
+
+    @GetMapping(value = "/", produces = MediaType.TEXT_HTML_VALUE)
+    public String home() {
+
+        return "This is employee app page";
+    }
+
+    @PostMapping(path = "/employees", consumes = "application/json", produces = "application/json")
+    public ResponseEntity<Object> addEmployee(@RequestBody Map<String, String> empBody) {
+
+        String id = empBody.get("id");
+        String name = empBody.get("name");
+
+        Employee emp = new Employee(Integer.valueOf(id), name);
+        empService.addEmployee(emp);
+
+        // Create resource uri
+        URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
+            .buildAndExpand(emp.getId())
+            .toUri();
+
+        // Send uri in response
+        return ResponseEntity.created(uri)
+            .build();
+    }
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java
new file mode 100644
index 0000000000..81c7665a50
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java
@@ -0,0 +1,8 @@
+package com.baeldung.employee.service;
+
+import com.baeldung.employee.domain.Employee;
+
+public interface EmployeeService {
+
+    void addEmployee(Employee emp);
+}
diff --git a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java
new file mode 100644
index 0000000000..45aba2898b
--- /dev/null
+++ b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java
@@ -0,0 +1,25 @@
+package com.baeldung.employee.service;
+
+import org.modelmapper.ModelMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.employee.data.EmployeeDataAdapter;
+import com.baeldung.employee.domain.Employee;
+import com.baeldung.employee.dto.EmployeeDTO;
+
+@Service
+public class EmployeeServiceImpl implements EmployeeService {
+
+    @Autowired
+    private EmployeeDataAdapter employeeDataAdapter;
+
+    @Autowired
+    private ModelMapper modelMapper;
+
+    @Override
+    public void addEmployee(Employee emp) {
+        employeeDataAdapter.addEmployee(modelMapper.map(emp, EmployeeDTO.class));
+    }
+
+}
diff --git a/EmpServiceApp/src/createEmployeeTable.sql b/EmpServiceApp/src/createEmployeeTable.sql
new file mode 100644
index 0000000000..14b8347bff
--- /dev/null
+++ b/EmpServiceApp/src/createEmployeeTable.sql
@@ -0,0 +1,11 @@
+DROP TABLE IF EXISTS EMPLOYEE;
+
+CREATE TABLE EMPLOYEE (
+
+  ID IDENTITY PRIMARY KEY,
+  NAME VARCHAR(64) NOT NULL,
+
+);
+
+INSERT INTO EMPLOYEE (ID, NAME) VALUES (10, 'EMP 10');
+INSERT INTO EMPLOYEE (ID, NAME) VALUES (20, 'EMP 20');
diff --git a/EmpServiceApp/web/WEB-INF/applicationContext.xml b/EmpServiceApp/web/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000000..54b3429708
--- /dev/null
+++ b/EmpServiceApp/web/WEB-INF/applicationContext.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
+    http://www.springframework.org/schema/context
+    http://www.springframework.org/schema/context/spring-context-4.1.xsd">
+
+    <context:component-scan base-package="com.baeldung.employee.*"/>
+
+</beans>
\ No newline at end of file
diff --git a/EmpServiceApp/web/WEB-INF/web.xml b/EmpServiceApp/web/WEB-INF/web.xml
new file mode 100644
index 0000000000..7731773f82
--- /dev/null
+++ b/EmpServiceApp/web/WEB-INF/web.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
+         version="4.0">
+    <display-name>Employee Spring App</display-name>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+    <servlet>
+        <servlet-name>EmployeeSpringApp</servlet-name>
+        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <init-param>
+            <param-name>contextConfigLocation</param-name>
+            <param-value>/WEB-INF/applicationContext.xml</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>EmployeeSpringApp</servlet-name>
+        <url-pattern>/*</url-pattern>
+    </servlet-mapping>
+</web-app>
\ No newline at end of file

From ce412e718e223baa73b018c0654a0d83e0a34806 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Thu, 2 Apr 2020 18:53:23 +0200
Subject: [PATCH 032/404] Refactoring domain and config classes

---
 .../src/com/baeldung/employee/config/AppConfig.java  | 12 +-----------
 .../src/com/baeldung/employee/data/EmployeeRepo.java |  2 +-
 .../src/com/baeldung/employee/domain/Employee.java   |  2 +-
 3 files changed, 3 insertions(+), 13 deletions(-)

diff --git a/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java b/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
index 3f6919b8f5..3bde8fceed 100644
--- a/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
+++ b/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
@@ -38,16 +38,6 @@ public class AppConfig {
         return new ModelMapper();
     }
 
-    /*    @Bean
-    public ObjectMapper objectMapper() {
-    
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
-    
-        return mapper;
-    }
-    */
 
     @Bean(name = "emf")
     public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
@@ -58,7 +48,7 @@ public class AppConfig {
         factory.setJpaVendorAdapter(vendorAdapter);
         factory.setPackagesToScan("com.baeldung.employee");
         factory.setDataSource(h2DataSource());
-        // factory.setJpaProperties(jpaProperties());
+
 
         return factory;
     }
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
index 4d63dc391d..0712f7823a 100644
--- a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
+++ b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
@@ -4,6 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
 
 import com.baeldung.employee.domain.Employee;
 
-public interface EmployeeRepo extends JpaRepository<Employee, Long> {
+public interface EmployeeRepo extends JpaRepository<Employee, Integer> {
 
 }
diff --git a/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java b/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
index f9cd937c21..3b93b8a97e 100644
--- a/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
+++ b/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
@@ -7,7 +7,7 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 
 @Entity
-@Table(name = "EMPLOYEE")
+@Table
 public class Employee {
 
     @Id

From 1cca64cc7095c723b96bcfa3c7050a3fe55f8456 Mon Sep 17 00:00:00 2001
From: Atanas Gegov <atanas.gegov.oss@gmail.com>
Date: Sat, 4 Apr 2020 00:57:04 +0300
Subject: [PATCH 033/404] Fix palindrome unit test

One of the test cases was not as described in the test method name. Also corrected formatting in another test case.
---
 .../java/com/baeldung/mutation/PalindromeUnitTest.java    | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java
index cb4830a6fb..207077158e 100644
--- a/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java
+++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java
@@ -11,13 +11,13 @@ public class PalindromeUnitTest {
     @Test
     public void whenEmptyString_thanAccept() {
         Palindrome palindromeTester = new Palindrome();
-        assertTrue(palindromeTester.isPalindrome("noon"));
+        assertTrue(palindromeTester.isPalindrome(""));
     }
 
     @Test
-	public void whenPalindrom_thanAccept() {
-	    Palindrome palindromeTester = new Palindrome();
-	    assertTrue(palindromeTester.isPalindrome("noon"));
+    public void whenPalindrom_thanAccept() {
+        Palindrome palindromeTester = new Palindrome();
+        assertTrue(palindromeTester.isPalindrome("noon"));
     }
     
     @Test

From ca16e787e93e891df3cbb9dd6af642efc72fad11 Mon Sep 17 00:00:00 2001
From: Dhawal Kapil <dhawalkapil@gmail.com>
Date: Sat, 4 Apr 2020 11:42:54 +0530
Subject: [PATCH 034/404] JAVA-991 Week 14 | Do we have any Spring Milestone/RC
 repos defined?

- Removed spring milestone/snapshots repositories from modules
---
 parent-kotlin/pom.xml                         |  7 +----
 spring-boot-modules/spring-boot-mvc-2/pom.xml | 30 +------------------
 2 files changed, 2 insertions(+), 35 deletions(-)

diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml
index 52a753439c..4a54264510 100644
--- a/parent-kotlin/pom.xml
+++ b/parent-kotlin/pom.xml
@@ -28,11 +28,6 @@
             <id>kotlin-eap</id>
             <url>http://dl.bintray.com/kotlin/kotlin-eap</url>
         </repository>
-        <repository>
-            <id>spring-milestone</id>
-            <name>Spring Milestone Repository</name>
-            <url>https://repo.spring.io/milestone</url>
-        </repository>
     </repositories>
 
     <pluginRepositories>
@@ -217,7 +212,7 @@
         <ktor.io.version>0.9.5</ktor.io.version>
         <assertj.version>3.12.0</assertj.version>
         <junit.platform.version>1.3.2</junit.platform.version>
-        <boot.dependencies.version>2.2.0.M4</boot.dependencies.version>
+        <boot.dependencies.version>2.2.6.RELEASE</boot.dependencies.version>
     </properties>
 
 </project>
diff --git a/spring-boot-modules/spring-boot-mvc-2/pom.xml b/spring-boot-modules/spring-boot-mvc-2/pom.xml
index 3c503eb23d..45202d1e4c 100644
--- a/spring-boot-modules/spring-boot-mvc-2/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-2/pom.xml
@@ -87,19 +87,6 @@
     </build>
 
     <repositories>
-        <repository>
-            <id>spring-snapshots</id>
-            <name>Spring Snapshots</name>
-            <url>https://repo.spring.io/snapshot</url>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </repository>
-        <repository>
-            <id>spring-milestones</id>
-            <name>Spring Milestones</name>
-            <url>https://repo.spring.io/milestone</url>
-        </repository>
         <repository>
             <id>jcenter-snapshots</id>
             <name>jcenter</name>
@@ -107,27 +94,12 @@
         </repository>
     </repositories>
 
-    <pluginRepositories>
-        <pluginRepository>
-            <id>spring-snapshots</id>
-            <name>Spring Snapshots</name>
-            <url>https://repo.spring.io/snapshot</url>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </pluginRepository>
-        <pluginRepository>
-            <id>spring-milestones</id>
-            <name>Spring Milestones</name>
-            <url>https://repo.spring.io/milestone</url>
-        </pluginRepository>
-    </pluginRepositories>
 
     <properties>
         <spring.fox.version>3.0.0-SNAPSHOT</spring.fox.version>
         <start-class>com.baeldung.swagger2boot.SpringBootSwaggerApplication</start-class>
         <!-- <start-class>com.baeldung.springbootmvc.SpringBootMvcFnApplication</start-class> -->
-        <spring-boot.version>2.2.0.BUILD-SNAPSHOT</spring-boot.version>
+        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
          <xstream.version>1.4.11.1</xstream.version>
     </properties>
 

From d4e7a4bc9dc1fe6b838a566618e5ca1404f9218a Mon Sep 17 00:00:00 2001
From: Dhawal Kapil <dhawalkapil@gmail.com>
Date: Sat, 4 Apr 2020 17:39:54 +0530
Subject: [PATCH 035/404] JAVA-991 Week 14 | Do we have any Spring Milestone/RC
 repos defined?

- Reverted removal of snapshot repository from parent-kotlin as some of the artifacts are used by child modules
---
 parent-kotlin/pom.xml | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml
index 4a54264510..52a753439c 100644
--- a/parent-kotlin/pom.xml
+++ b/parent-kotlin/pom.xml
@@ -28,6 +28,11 @@
             <id>kotlin-eap</id>
             <url>http://dl.bintray.com/kotlin/kotlin-eap</url>
         </repository>
+        <repository>
+            <id>spring-milestone</id>
+            <name>Spring Milestone Repository</name>
+            <url>https://repo.spring.io/milestone</url>
+        </repository>
     </repositories>
 
     <pluginRepositories>
@@ -212,7 +217,7 @@
         <ktor.io.version>0.9.5</ktor.io.version>
         <assertj.version>3.12.0</assertj.version>
         <junit.platform.version>1.3.2</junit.platform.version>
-        <boot.dependencies.version>2.2.6.RELEASE</boot.dependencies.version>
+        <boot.dependencies.version>2.2.0.M4</boot.dependencies.version>
     </properties>
 
 </project>

From 5a56276893d3f8e1cce2473aed880b2a8982ca97 Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Sun, 5 Apr 2020 00:45:15 +0300
Subject: [PATCH 036/404] [BAEL-3936] Initial commit

---
 persistence-modules/java-jpa-2/pom.xml        |  31 ++-
 .../jpa/unrelated/entities/Cocktail.java      |  84 ++++++++
 .../unrelated/entities/MultipleRecipe.java    |  65 ++++++
 .../jpa/unrelated/entities/Recipe.java        |  48 +++++
 .../main/resources/META-INF/persistence.xml   |  25 ++-
 .../entities/UnrelatedEntitiesUnitTest.java   | 187 ++++++++++++++++++
 6 files changed, 437 insertions(+), 3 deletions(-)
 create mode 100644 persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
 create mode 100644 persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
 create mode 100644 persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java
 create mode 100644 persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java

diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml
index f79f6f1633..b41cdccb07 100644
--- a/persistence-modules/java-jpa-2/pom.xml
+++ b/persistence-modules/java-jpa-2/pom.xml
@@ -48,6 +48,17 @@
             <version>${postgres.version}</version>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+            <version>${querydsl.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-jpa</artifactId>
+            <version>${querydsl.version}</version>
+        </dependency>
 
         <dependency>
             <groupId>org.assertj</groupId>
@@ -101,11 +112,28 @@
                         <configuration>
                             <sources>
                                 <source>target/metamodel</source>
+                                <source>${project.build.directory}/generated-sources/java/</source>
                             </sources>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>target/generated-sources/java</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 
@@ -118,6 +146,7 @@
         <maven-compiler-plugin.version>3.5.1</maven-compiler-plugin.version>
         <maven-processor-plugin.version>3.3.3</maven-processor-plugin.version>
         <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
+        <querydsl.version>4.2.2</querydsl.version>
     </properties>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
new file mode 100644
index 0000000000..b957ec2ed5
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
@@ -0,0 +1,84 @@
+package com.baeldung.jpa.unrelated.entities;
+
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.util.List;
+import java.util.Objects;
+
+@Entity
+@Table(name = "cocktails")
+public class Cocktail {
+    @Id
+    @Column(name="cocktail_name")
+    private String name;
+
+    @Column
+    private double price;
+
+    @Column(name="category")
+    private String category;
+
+    @OneToOne
+    @NotFound(action = NotFoundAction.IGNORE)
+    @JoinColumn(name = "cocktail_name",
+            referencedColumnName = "cocktail",
+            insertable = false,
+            updatable = false,
+            foreignKey = @javax.persistence.ForeignKey(value= ConstraintMode.NO_CONSTRAINT))
+    private Recipe recipe;
+
+    @OneToMany
+    @NotFound(action=NotFoundAction.IGNORE)
+    @JoinColumn(name = "cocktail",
+            referencedColumnName = "cocktail_name",
+            insertable = false,
+            updatable = false,
+            foreignKey = @javax.persistence.ForeignKey(value= ConstraintMode.NO_CONSTRAINT))
+    private List<MultipleRecipe> recipeList;
+
+    public Cocktail() {
+    }
+
+    public Cocktail(String name, double price, String baseIngredient) {
+        this.name = name;
+        this.price = price;
+        this.category = baseIngredient;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public double getPrice() {
+        return price;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public Recipe getRecipe() {
+        return recipe;
+    }
+
+    public List<MultipleRecipe> getRecipeList() {
+        return recipeList;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Cocktail cocktail = (Cocktail) o;
+        return Double.compare(cocktail.price, price) == 0 &&
+                Objects.equals(name, cocktail.name) &&
+                Objects.equals(category, cocktail.category);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, price, category);
+    }
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
new file mode 100644
index 0000000000..e04df150f3
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
@@ -0,0 +1,65 @@
+package com.baeldung.jpa.unrelated.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.util.Objects;
+
+@Entity
+@Table(name="multiple_recipes")
+public class MultipleRecipe {
+    @Id
+    @Column(name="id")
+    private Long id;
+
+    @Column(name="cocktail")
+    private String cocktail;
+
+    @Column(name="instructions")
+    private String instructions;
+
+    @Column(name="base_ingredient")
+    private String baseIngredient;
+
+    public MultipleRecipe() {}
+
+    public MultipleRecipe(Long id, String cocktail, String instructions, String baseIngredient) {
+        this.baseIngredient = baseIngredient;
+        this.cocktail = cocktail;
+        this.id = id;
+        this.instructions = instructions;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getCocktail() {
+        return cocktail;
+    }
+
+    public String getInstructions() {
+        return instructions;
+    }
+
+    public String getBaseIngredient() {
+        return baseIngredient;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        MultipleRecipe that = (MultipleRecipe) o;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(cocktail, that.cocktail) &&
+                Objects.equals(instructions, that.instructions) &&
+                Objects.equals(baseIngredient, that.baseIngredient);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, cocktail, instructions, baseIngredient);
+    }
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java
new file mode 100644
index 0000000000..585c6abec3
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java
@@ -0,0 +1,48 @@
+package com.baeldung.jpa.unrelated.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.util.Objects;
+
+@Entity
+@Table(name="recipes")
+public class Recipe {
+    @Id
+    @Column(name = "cocktail")
+    private String cocktail;
+
+    @Column
+    private String instructions;
+
+    public Recipe() {
+    }
+
+    public Recipe(String cocktail, String instructions) {
+        this.cocktail = cocktail;
+        this.instructions = instructions;
+    }
+
+    public String getCocktail() {
+        return cocktail;
+    }
+
+    public String getInstructions() {
+        return instructions;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Recipe recipe = (Recipe) o;
+        return Objects.equals(cocktail, recipe.cocktail) &&
+                Objects.equals(instructions, recipe.instructions);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(cocktail, instructions);
+    }
+}
diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
index 11e007973f..eec7f7cf6e 100644
--- a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
+++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
@@ -162,5 +162,26 @@
                       value="false" />
         </properties>
     </persistence-unit>
-
-</persistence>
\ No newline at end of file
+    
+    <persistence-unit name="jpa-h2-unrelated-entities">
+        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
+        <class>com.baeldung.jpa.unrelated.entities.Cocktail</class>
+		<class>com.baeldung.jpa.unrelated.entities.Recipe</class>
+		<class>com.baeldung.jpa.unrelated.entities.MultipleRecipe</class>
+        <exclude-unlisted-classes>true</exclude-unlisted-classes>
+        <properties>
+            <property name="javax.persistence.jdbc.driver"
+                      value="org.h2.Driver" />
+            <property name="javax.persistence.jdbc.url"
+                      value="jdbc:h2:mem:test" />
+            <property name="javax.persistence.jdbc.user" value="sa" />
+            <property name="javax.persistence.jdbc.password" value="" />
+            <property name="hibernate.dialect"
+                      value="org.hibernate.dialect.H2Dialect" />
+            <property name="hibernate.hbm2ddl.auto" value="create" />
+            <property name="show_sql" value="true" />
+            <property name="hibernate.temp.use_jdbc_metadata_defaults"
+                      value="false" />
+        </properties>
+    </persistence-unit>
+</persistence>
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
new file mode 100644
index 0000000000..540811c409
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
@@ -0,0 +1,187 @@
+package com.baeldung.jpa.unrelated.entities;
+
+import javax.persistence.*;
+
+import com.querydsl.jpa.impl.JPAQuery;
+import org.junit.jupiter.api.*;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class UnrelatedEntitiesUnitTest {
+    private static EntityManagerFactory entityManagerFactory;
+    private static EntityManager entityManager;
+    private static Cocktail mojito;
+    private static Cocktail ginTonic;
+
+    @BeforeAll
+    public static void setup() {
+        entityManagerFactory = Persistence.createEntityManagerFactory("jpa-h2-unrelated-entities");
+        entityManager = entityManagerFactory.createEntityManager();
+        mojito = new Cocktail("Mojito", 11, "Rum");
+        ginTonic = new Cocktail("Gin tonic", 8.50, "Gin");
+        entityManager.getTransaction().begin();
+        entityManager.persist(mojito);
+        entityManager.persist(ginTonic);
+        entityManager.persist(new Recipe(mojito.getName(), "Some instructions"));
+        entityManager.persist(new MultipleRecipe(1L, mojito.getName(), "some instructions", mojito.getCategory()));
+        entityManager.persist(new MultipleRecipe(2L, mojito.getName(), "some other instructions", mojito.getCategory()));
+        entityManager.getTransaction().commit();
+    }
+
+    @AfterAll
+    public static void closeSession() {
+        entityManager.close();
+    }
+
+    @Test
+    public void whenQueryingForCocktailThatHasRecipe_thenTheExpectedCocktailReturned() {
+        // JPA
+        Cocktail cocktail = entityManager.createQuery(
+                "select c from Cocktail c join c.recipe", Cocktail.class)
+                .getSingleResult();
+        verifyResult(mojito, cocktail);
+
+        cocktail = entityManager.createQuery(
+                "select c from Cocktail c join Recipe r on c.name = r.cocktail", Cocktail.class)
+                .getSingleResult();
+        verifyResult(mojito, cocktail);
+
+        // QueryDSL
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail)
+                .join(QCocktail.cocktail.recipe)
+                .fetchOne();
+        verifyResult(mojito, cocktail);
+
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail)
+                .join(QRecipe.recipe)
+                .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
+                .fetchOne();
+        verifyResult(mojito, cocktail);
+    }
+
+    @Test
+    public void whenQueryingForCocktailThatHasNotARecipe_thenTheExpectedCocktailReturned() {
+        Cocktail cocktail = entityManager
+                .createQuery("select c from Cocktail c left join c.recipe r " +
+                                "where r is null",
+                        Cocktail.class)
+                .getSingleResult();
+        verifyResult(ginTonic, cocktail);
+
+        cocktail = entityManager
+                .createQuery("select c from Cocktail c left join Recipe r " +
+                                "on c.name = r.cocktail " +
+                                "where r is null",
+                        Cocktail.class)
+                .getSingleResult();
+        verifyResult(ginTonic, cocktail);
+
+        QRecipe recipe = new QRecipe("alias");
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail)
+                .leftJoin(QCocktail.cocktail.recipe, recipe)
+                .where(recipe.isNull()).fetchOne();
+        verifyResult(ginTonic, cocktail);
+
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail)
+                .leftJoin(QRecipe.recipe)
+                .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
+                .where(QRecipe.recipe.isNull()).fetchOne();
+        verifyResult(ginTonic, cocktail);
+    }
+
+    @Test
+    public void whenQueringForCocktailThatHasRecipes_thenTheExpectedCocktailReturned() {
+        // JPQL
+        Cocktail cocktail = entityManager
+                .createQuery("select c from Cocktail c join c.recipeList", Cocktail.class)
+                .getSingleResult();
+        verifyResult(mojito, cocktail);
+
+        cocktail = entityManager
+                .createQuery("select c from Cocktail c join MultipleRecipe mr on mr.cocktail = c.name", Cocktail.class)
+                .getSingleResult();
+        verifyResult(mojito, cocktail);
+
+        // QueryDSL
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail).join(QCocktail.cocktail.recipeList).fetchOne();
+        verifyResult(mojito, cocktail);
+
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+                .join(QMultipleRecipe.multipleRecipe)
+                .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
+                .fetchOne();
+        verifyResult(mojito, cocktail);
+    }
+
+    @Test
+    public void whenQueryingForCocktailThatHasNotRecipes_thenTheExpectedCocktailReturned() {
+        // JPQL
+        Cocktail cocktail = entityManager
+                .createQuery("select c from Cocktail c left join c.recipeList r where r is null", Cocktail.class)
+                .getSingleResult();
+        verifyResult(ginTonic, cocktail);
+
+        cocktail = entityManager.createQuery("select c from Cocktail c left join MultipleRecipe r " +
+                "on c.name = r.cocktail where r is null", Cocktail.class)
+                .getSingleResult();
+        verifyResult(ginTonic, cocktail);
+
+        // QueryDSL
+        QMultipleRecipe multipleRecipe = new QMultipleRecipe("alias");
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail)
+                .leftJoin(QCocktail.cocktail.recipeList, multipleRecipe)
+                .where(multipleRecipe.isNull())
+                .fetchOne();
+        verifyResult(ginTonic, cocktail);
+
+        cocktail = new JPAQuery<Cocktail>(entityManager)
+                .from(QCocktail.cocktail).leftJoin(QMultipleRecipe.multipleRecipe)
+                .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
+                .where(QMultipleRecipe.multipleRecipe.isNull()).fetchOne();
+        verifyResult(ginTonic, cocktail);
+    }
+
+    @Test
+    public void whenQueryingForRumCocktailsInMenuRecipes_thenTheExpectedRecipesReturned() {
+        Consumer<List<MultipleRecipe>> verifyResult = recipes -> {
+            assertEquals(2, recipes.size());
+            recipes.forEach(r -> assertEquals(mojito.getName(), r.getCocktail()));
+        };
+
+        // JPQL
+        List<MultipleRecipe> recipes = entityManager
+                .createQuery("select distinct r from MultipleRecipe r join Cocktail c " +
+                                "on r.cocktail = c.name " +
+                                "and " +
+                                "r.baseIngredient = :category",
+                        MultipleRecipe.class)
+                .setParameter("category", mojito.getCategory())
+                .getResultList();
+        verifyResult.accept(recipes);
+
+        // QueryDSL
+        QCocktail cocktail = QCocktail.cocktail;
+        QMultipleRecipe multipleRecipe = QMultipleRecipe.multipleRecipe;
+        recipes = new JPAQuery<MultipleRecipe>(entityManager)
+                .from(multipleRecipe)
+                .join(cocktail)
+                .on(multipleRecipe.cocktail.eq(cocktail.name)
+                        .and(multipleRecipe.baseIngredient.eq(mojito.getCategory())))
+                .fetch();
+        verifyResult.accept(recipes);
+    }
+
+    private void verifyResult(Cocktail expectedCocktail, Cocktail queryResult) {
+        assertNotNull(queryResult);
+        assertEquals(expectedCocktail, queryResult);
+    }
+}

From 9acc69220be5068d997789d8f1e7db7e2a2dd1bf Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Sun, 5 Apr 2020 01:11:49 +0300
Subject: [PATCH 037/404] [BAEL-3936] Formatted code

---
 .../jpa/unrelated/entities/Cocktail.java      |  41 +++--
 .../unrelated/entities/MultipleRecipe.java    |  37 +++--
 .../entities/UnrelatedEntitiesUnitTest.java   | 156 +++++++++---------
 3 files changed, 123 insertions(+), 111 deletions(-)

diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
index b957ec2ed5..7f5ca66570 100644
--- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
@@ -11,31 +11,34 @@ import java.util.Objects;
 @Table(name = "cocktails")
 public class Cocktail {
     @Id
-    @Column(name="cocktail_name")
+    @Column(name = "cocktail_name")
     private String name;
 
     @Column
     private double price;
 
-    @Column(name="category")
+    @Column(name = "category")
     private String category;
 
     @OneToOne
     @NotFound(action = NotFoundAction.IGNORE)
-    @JoinColumn(name = "cocktail_name",
-            referencedColumnName = "cocktail",
-            insertable = false,
-            updatable = false,
-            foreignKey = @javax.persistence.ForeignKey(value= ConstraintMode.NO_CONSTRAINT))
+    @JoinColumn(name = "cocktail_name", 
+        referencedColumnName = "cocktail", 
+        insertable = false, updatable = false, 
+        foreignKey = @javax.persistence
+        .ForeignKey(value = ConstraintMode.NO_CONSTRAINT)
+        )
     private Recipe recipe;
 
     @OneToMany
-    @NotFound(action=NotFoundAction.IGNORE)
-    @JoinColumn(name = "cocktail",
-            referencedColumnName = "cocktail_name",
-            insertable = false,
-            updatable = false,
-            foreignKey = @javax.persistence.ForeignKey(value= ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @JoinColumn(
+        name = "cocktail", 
+        referencedColumnName = "cocktail_name", 
+        insertable = false, 
+        updatable = false, 
+        foreignKey = @javax.persistence
+        .ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private List<MultipleRecipe> recipeList;
 
     public Cocktail() {
@@ -69,12 +72,14 @@ public class Cocktail {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
         Cocktail cocktail = (Cocktail) o;
-        return Double.compare(cocktail.price, price) == 0 &&
-                Objects.equals(name, cocktail.name) &&
-                Objects.equals(category, cocktail.category);
+        return Double.compare(cocktail.price, price) == 0 && 
+            Objects.equals(name, cocktail.name) && 
+            Objects.equals(category, cocktail.category);
     }
 
     @Override
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
index e04df150f3..d628af1eaf 100644
--- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
@@ -7,28 +7,30 @@ import javax.persistence.Table;
 import java.util.Objects;
 
 @Entity
-@Table(name="multiple_recipes")
+@Table(name = "multiple_recipes")
 public class MultipleRecipe {
     @Id
-    @Column(name="id")
+    @Column(name = "id")
     private Long id;
 
-    @Column(name="cocktail")
+    @Column(name = "cocktail")
     private String cocktail;
 
-    @Column(name="instructions")
+    @Column(name = "instructions")
     private String instructions;
 
-    @Column(name="base_ingredient")
+    @Column(name = "base_ingredient")
     private String baseIngredient;
 
-    public MultipleRecipe() {}
+    public MultipleRecipe() {
+    }
 
-    public MultipleRecipe(Long id, String cocktail, String instructions, String baseIngredient) {
-        this.baseIngredient = baseIngredient;
-        this.cocktail = cocktail;
+    public MultipleRecipe(Long id, String cocktail, 
+        String instructions, String baseIngredient) {
         this.id = id;
+        this.cocktail = cocktail;
         this.instructions = instructions;
+        this.baseIngredient = baseIngredient;
     }
 
     public Long getId() {
@@ -49,17 +51,20 @@ public class MultipleRecipe {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
         MultipleRecipe that = (MultipleRecipe) o;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(cocktail, that.cocktail) &&
-                Objects.equals(instructions, that.instructions) &&
-                Objects.equals(baseIngredient, that.baseIngredient);
+        return Objects.equals(id, that.id) && 
+            Objects.equals(cocktail, that.cocktail) && 
+            Objects.equals(instructions, that.instructions) && 
+            Objects.equals(baseIngredient, that.baseIngredient);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, cocktail, instructions, baseIngredient);
+        return Objects.hash(id, cocktail, 
+            instructions, baseIngredient);
     }
 }
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
index 540811c409..12042c2ba6 100644
--- a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
@@ -26,8 +26,10 @@ public class UnrelatedEntitiesUnitTest {
         entityManager.persist(mojito);
         entityManager.persist(ginTonic);
         entityManager.persist(new Recipe(mojito.getName(), "Some instructions"));
-        entityManager.persist(new MultipleRecipe(1L, mojito.getName(), "some instructions", mojito.getCategory()));
-        entityManager.persist(new MultipleRecipe(2L, mojito.getName(), "some other instructions", mojito.getCategory()));
+        entityManager.persist(new MultipleRecipe(1L, mojito.getName(), 
+            "some instructions", mojito.getCategory()));
+        entityManager.persist(new MultipleRecipe(2L, mojito.getName(), 
+            "some other instructions", mojito.getCategory()));
         entityManager.getTransaction().commit();
     }
 
@@ -39,114 +41,116 @@ public class UnrelatedEntitiesUnitTest {
     @Test
     public void whenQueryingForCocktailThatHasRecipe_thenTheExpectedCocktailReturned() {
         // JPA
-        Cocktail cocktail = entityManager.createQuery(
-                "select c from Cocktail c join c.recipe", Cocktail.class)
-                .getSingleResult();
+        Cocktail cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c join c.recipe", Cocktail.class)
+            .getSingleResult();
         verifyResult(mojito, cocktail);
 
-        cocktail = entityManager.createQuery(
-                "select c from Cocktail c join Recipe r on c.name = r.cocktail", Cocktail.class)
-                .getSingleResult();
+        cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c join Recipe r "
+            + "on c.name = r.cocktail", Cocktail.class)
+            .getSingleResult();
         verifyResult(mojito, cocktail);
 
         // QueryDSL
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail)
-                .join(QCocktail.cocktail.recipe)
-                .fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .join(QCocktail.cocktail.recipe)
+            .fetchOne();
         verifyResult(mojito, cocktail);
 
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail)
-                .join(QRecipe.recipe)
-                .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
-                .fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .join(QRecipe.recipe)
+            .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
+            .fetchOne();
         verifyResult(mojito, cocktail);
     }
 
     @Test
     public void whenQueryingForCocktailThatHasNotARecipe_thenTheExpectedCocktailReturned() {
-        Cocktail cocktail = entityManager
-                .createQuery("select c from Cocktail c left join c.recipe r " +
-                                "where r is null",
-                        Cocktail.class)
-                .getSingleResult();
+        Cocktail cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c left join c.recipe r " 
+            + "where r is null", Cocktail.class)
+            .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
-        cocktail = entityManager
-                .createQuery("select c from Cocktail c left join Recipe r " +
-                                "on c.name = r.cocktail " +
-                                "where r is null",
-                        Cocktail.class)
-                .getSingleResult();
+        cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c left join Recipe r " 
+            + "on c.name = r.cocktail " 
+            + "where r is null", Cocktail.class)
+            .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
         QRecipe recipe = new QRecipe("alias");
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail)
-                .leftJoin(QCocktail.cocktail.recipe, recipe)
-                .where(recipe.isNull()).fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .leftJoin(QCocktail.cocktail.recipe, recipe)
+            .where(recipe.isNull())
+            .fetchOne();
         verifyResult(ginTonic, cocktail);
 
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail)
-                .leftJoin(QRecipe.recipe)
-                .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
-                .where(QRecipe.recipe.isNull()).fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .leftJoin(QRecipe.recipe)
+            .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
+            .where(QRecipe.recipe.isNull())
+            .fetchOne();
         verifyResult(ginTonic, cocktail);
     }
 
     @Test
     public void whenQueringForCocktailThatHasRecipes_thenTheExpectedCocktailReturned() {
         // JPQL
-        Cocktail cocktail = entityManager
-                .createQuery("select c from Cocktail c join c.recipeList", Cocktail.class)
-                .getSingleResult();
+        Cocktail cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c join c.recipeList", Cocktail.class)
+            .getSingleResult();
         verifyResult(mojito, cocktail);
 
-        cocktail = entityManager
-                .createQuery("select c from Cocktail c join MultipleRecipe mr on mr.cocktail = c.name", Cocktail.class)
-                .getSingleResult();
+        cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c join MultipleRecipe mr "
+            + "on mr.cocktail = c.name", Cocktail.class)
+            .getSingleResult();
         verifyResult(mojito, cocktail);
 
         // QueryDSL
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail).join(QCocktail.cocktail.recipeList).fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .join(QCocktail.cocktail.recipeList)
+            .fetchOne();
         verifyResult(mojito, cocktail);
 
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-                .join(QMultipleRecipe.multipleRecipe)
-                .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
-                .fetchOne();
+            .join(QMultipleRecipe.multipleRecipe)
+            .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
+            .fetchOne();
         verifyResult(mojito, cocktail);
     }
 
     @Test
     public void whenQueryingForCocktailThatHasNotRecipes_thenTheExpectedCocktailReturned() {
         // JPQL
-        Cocktail cocktail = entityManager
-                .createQuery("select c from Cocktail c left join c.recipeList r where r is null", Cocktail.class)
-                .getSingleResult();
+        Cocktail cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c left join c.recipeList r "
+            + "where r is null", Cocktail.class)
+            .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
-        cocktail = entityManager.createQuery("select c from Cocktail c left join MultipleRecipe r " +
-                "on c.name = r.cocktail where r is null", Cocktail.class)
-                .getSingleResult();
+        cocktail = entityManager.createQuery("select c "
+            + "from Cocktail c left join MultipleRecipe r " 
+            + "on c.name = r.cocktail "
+            + "where r is null", Cocktail.class)
+            .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
         // QueryDSL
         QMultipleRecipe multipleRecipe = new QMultipleRecipe("alias");
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail)
-                .leftJoin(QCocktail.cocktail.recipeList, multipleRecipe)
-                .where(multipleRecipe.isNull())
-                .fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .leftJoin(QCocktail.cocktail.recipeList, multipleRecipe)
+            .where(multipleRecipe.isNull())
+            .fetchOne();
         verifyResult(ginTonic, cocktail);
 
-        cocktail = new JPAQuery<Cocktail>(entityManager)
-                .from(QCocktail.cocktail).leftJoin(QMultipleRecipe.multipleRecipe)
-                .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
-                .where(QMultipleRecipe.multipleRecipe.isNull()).fetchOne();
+        cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
+            .leftJoin(QMultipleRecipe.multipleRecipe)
+            .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
+            .where(QMultipleRecipe.multipleRecipe.isNull())
+            .fetchOne();
         verifyResult(ginTonic, cocktail);
     }
 
@@ -158,25 +162,23 @@ public class UnrelatedEntitiesUnitTest {
         };
 
         // JPQL
-        List<MultipleRecipe> recipes = entityManager
-                .createQuery("select distinct r from MultipleRecipe r join Cocktail c " +
-                                "on r.cocktail = c.name " +
-                                "and " +
-                                "r.baseIngredient = :category",
-                        MultipleRecipe.class)
-                .setParameter("category", mojito.getCategory())
-                .getResultList();
+        List<MultipleRecipe> recipes = entityManager.createQuery("select distinct r "
+            + "from MultipleRecipe r "
+            + "join Cocktail c " 
+            + "on r.cocktail = c.name and r.baseIngredient = :category",
+        MultipleRecipe.class)
+            .setParameter("category", mojito.getCategory())
+            .getResultList();
         verifyResult.accept(recipes);
 
         // QueryDSL
         QCocktail cocktail = QCocktail.cocktail;
         QMultipleRecipe multipleRecipe = QMultipleRecipe.multipleRecipe;
-        recipes = new JPAQuery<MultipleRecipe>(entityManager)
-                .from(multipleRecipe)
-                .join(cocktail)
-                .on(multipleRecipe.cocktail.eq(cocktail.name)
-                        .and(multipleRecipe.baseIngredient.eq(mojito.getCategory())))
-                .fetch();
+        recipes = new JPAQuery<MultipleRecipe>(entityManager).from(multipleRecipe)
+            .join(cocktail)
+            .on(multipleRecipe.cocktail.eq(cocktail.name)
+                .and(multipleRecipe.baseIngredient.eq(mojito.getCategory())))
+            .fetch();
         verifyResult.accept(recipes);
     }
 

From 6677cf74d16bbb163adc8a4f873acc3c89920bc2 Mon Sep 17 00:00:00 2001
From: Kostas Karavitis <kkaravitis@gmail.com>
Date: Wed, 8 Apr 2020 16:12:14 +0300
Subject: [PATCH 038/404] [BAEL-3936] Many to many underlying relationship test

---
 .../jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
index 12042c2ba6..27bf1d8b62 100644
--- a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
@@ -155,7 +155,7 @@ public class UnrelatedEntitiesUnitTest {
     }
 
     @Test
-    public void whenQueryingForRumCocktailsInMenuRecipes_thenTheExpectedRecipesReturned() {
+    public void whenQueryingForMultipleRecipes_thenTheExpectedRecipesReturned() {
         Consumer<List<MultipleRecipe>> verifyResult = recipes -> {
             assertEquals(2, recipes.size());
             recipes.forEach(r -> assertEquals(mojito.getName(), r.getCocktail()));
@@ -165,9 +165,8 @@ public class UnrelatedEntitiesUnitTest {
         List<MultipleRecipe> recipes = entityManager.createQuery("select distinct r "
             + "from MultipleRecipe r "
             + "join Cocktail c " 
-            + "on r.cocktail = c.name and r.baseIngredient = :category",
+            + "on r.baseIngredient = c.category",
         MultipleRecipe.class)
-            .setParameter("category", mojito.getCategory())
             .getResultList();
         verifyResult.accept(recipes);
 
@@ -176,8 +175,7 @@ public class UnrelatedEntitiesUnitTest {
         QMultipleRecipe multipleRecipe = QMultipleRecipe.multipleRecipe;
         recipes = new JPAQuery<MultipleRecipe>(entityManager).from(multipleRecipe)
             .join(cocktail)
-            .on(multipleRecipe.cocktail.eq(cocktail.name)
-                .and(multipleRecipe.baseIngredient.eq(mojito.getCategory())))
+            .on(multipleRecipe.baseIngredient.eq(cocktail.category))
             .fetch();
         verifyResult.accept(recipes);
     }

From 74e02b22165fe8b0046b516e0355e43167e427a4 Mon Sep 17 00:00:00 2001
From: Kostas Karavitis <kkaravitis@gmail.com>
Date: Wed, 8 Apr 2020 18:44:32 +0300
Subject: [PATCH 039/404] [BAEL-3936] Fixed the name of menu table

---
 .../com/baeldung/jpa/unrelated/entities/Cocktail.java     | 8 +++++---
 .../jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java | 1 +
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
index 7f5ca66570..fdccad6bd7 100644
--- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
@@ -1,5 +1,7 @@
 package com.baeldung.jpa.unrelated.entities;
 
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
 import org.hibernate.annotations.NotFound;
 import org.hibernate.annotations.NotFoundAction;
 
@@ -8,7 +10,7 @@ import java.util.List;
 import java.util.Objects;
 
 @Entity
-@Table(name = "cocktails")
+@Table(name = "menu")
 public class Cocktail {
     @Id
     @Column(name = "cocktail_name")
@@ -22,7 +24,7 @@ public class Cocktail {
 
     @OneToOne
     @NotFound(action = NotFoundAction.IGNORE)
-    @JoinColumn(name = "cocktail_name", 
+    @JoinColumn(name = "cocktail_name",
         referencedColumnName = "cocktail", 
         insertable = false, updatable = false, 
         foreignKey = @javax.persistence
@@ -30,7 +32,7 @@ public class Cocktail {
         )
     private Recipe recipe;
 
-    @OneToMany
+    @OneToMany(fetch = FetchType.LAZY)
     @NotFound(action = NotFoundAction.IGNORE)
     @JoinColumn(
         name = "cocktail", 
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
index 27bf1d8b62..8733b3e7da 100644
--- a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
@@ -38,6 +38,7 @@ public class UnrelatedEntitiesUnitTest {
         entityManager.close();
     }
 
+
     @Test
     public void whenQueryingForCocktailThatHasRecipe_thenTheExpectedCocktailReturned() {
         // JPA

From 6205b4965841c366c97fcb62bfe9f2d26ceb17b9 Mon Sep 17 00:00:00 2001
From: Sasa m <sasam0320@gmail.com>
Date: Thu, 9 Apr 2020 20:56:42 +0200
Subject: [PATCH 040/404] Remove unused commit

---
 .../baeldung/employee/config/AppConfig.java   | 63 -------------------
 .../config/ApplicationInitializer.java        | 29 ---------
 .../employee/data/EmployeeDataAdapter.java    |  9 ---
 .../data/EmployeeDataAdapterImpl.java         | 28 ---------
 .../baeldung/employee/data/EmployeeRepo.java  |  9 ---
 .../baeldung/employee/domain/Employee.java    | 43 -------------
 .../baeldung/employee/dto/EmployeeDTO.java    |  9 ---
 .../employee/service/EmployeeController.java  | 47 --------------
 .../employee/service/EmployeeService.java     |  8 ---
 .../employee/service/EmployeeServiceImpl.java | 25 --------
 EmpServiceApp/src/createEmployeeTable.sql     | 11 ----
 .../web/WEB-INF/applicationContext.xml        | 12 ----
 EmpServiceApp/web/WEB-INF/web.xml             | 25 --------
 13 files changed, 318 deletions(-)
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java
 delete mode 100644 EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java
 delete mode 100644 EmpServiceApp/src/createEmployeeTable.sql
 delete mode 100644 EmpServiceApp/web/WEB-INF/applicationContext.xml
 delete mode 100644 EmpServiceApp/web/WEB-INF/web.xml

diff --git a/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java b/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
deleted file mode 100644
index 3bde8fceed..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/config/AppConfig.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.baeldung.employee.config;
-
-import javax.persistence.EntityManagerFactory;
-import javax.sql.DataSource;
-
-import org.modelmapper.ModelMapper;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
-import org.springframework.orm.jpa.JpaTransactionManager;
-import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
-import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
-import org.springframework.transaction.TransactionManager;
-
-@Configuration
-@EnableJpaRepositories(basePackages = "com.baeldung.employee.data", entityManagerFactoryRef = "emf")
-@ComponentScan(basePackages = "com.baeldung.employee")
-public class AppConfig {
-
-    @Bean
-    public DataSource h2DataSource() {
-
-        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
-        EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.H2)
-            .addScript("createEmployeeTable.sql")
-            .build();
-        return db;
-
-    }
-
-    @Bean
-    public ModelMapper mapper() {
-
-        return new ModelMapper();
-    }
-
-
-    @Bean(name = "emf")
-    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
-
-        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
-
-        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
-        factory.setJpaVendorAdapter(vendorAdapter);
-        factory.setPackagesToScan("com.baeldung.employee");
-        factory.setDataSource(h2DataSource());
-
-
-        return factory;
-    }
-
-    @Bean
-    public TransactionManager jpaTransactionManager(EntityManagerFactory emf) {
-        JpaTransactionManager transactionManager = new JpaTransactionManager();
-        transactionManager.setEntityManagerFactory(emf);
-        return transactionManager;
-    }
-
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java b/EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java
deleted file mode 100644
index 491e97b2c8..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/config/ApplicationInitializer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.employee.config;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
-
-import org.springframework.web.WebApplicationInitializer;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
-import org.springframework.web.servlet.DispatcherServlet;
-
-public class ApplicationInitializer implements WebApplicationInitializer {
-
-    @Override
-    public void onStartup(ServletContext servletContext) throws ServletException {
-
-        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
-        context.register(AppConfig.class);
-
-        servletContext.addListener(new ContextLoaderListener(context));
-
-        // Create DispatcherServlet
-
-        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("EmployeeSpringApp", new DispatcherServlet());
-        dispatcher.setLoadOnStartup(1);
-        dispatcher.addMapping("/app");
-
-    }
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java
deleted file mode 100644
index da5d5bb1a3..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapter.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.employee.data;
-
-import com.baeldung.employee.dto.EmployeeDTO;
-
-public interface EmployeeDataAdapter {
-
-    void addEmployee(EmployeeDTO emp);
-
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java
deleted file mode 100644
index 54b3079844..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeDataAdapterImpl.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.employee.data;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-import org.modelmapper.ModelMapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.baeldung.employee.domain.Employee;
-import com.baeldung.employee.dto.EmployeeDTO;
-
-@Component
-public class EmployeeDataAdapterImpl implements EmployeeDataAdapter {
-
-    @PersistenceContext
-    private EntityManager em;
-
-    @Autowired
-    private ModelMapper modelMapper;
-
-    @Override
-    public void addEmployee(EmployeeDTO emp) {
-
-        em.persist(modelMapper.map(emp, Employee.class));
-
-    }
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java b/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
deleted file mode 100644
index 0712f7823a..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/data/EmployeeRepo.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.employee.data;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.baeldung.employee.domain.Employee;
-
-public interface EmployeeRepo extends JpaRepository<Employee, Integer> {
-
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java b/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
deleted file mode 100644
index 3b93b8a97e..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/domain/Employee.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.baeldung.employee.domain;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table
-public class Employee {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)
-    private int id;
-
-    private String name;
-
-    public Employee() {
-    }
-
-    public Employee(int id, String name) {
-        this.id = id;
-        this.name = name;
-    }
-
-    public long getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-    // Standard constructors, getters and setters
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java b/EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java
deleted file mode 100644
index 3b6b048a9c..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/dto/EmployeeDTO.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.employee.dto;
-
-public class EmployeeDTO {
-
-    private long id;
-    private String name;
-
-    // Standard constructors, getters and setters
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java
deleted file mode 100644
index b258d11018..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeController.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.baeldung.employee.service;
-
-import java.net.URI;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
-
-import com.baeldung.employee.domain.Employee;
-
-@RestController
-public class EmployeeController {
-
-    @Autowired
-    private EmployeeService empService;
-
-    @GetMapping(value = "/", produces = MediaType.TEXT_HTML_VALUE)
-    public String home() {
-
-        return "This is employee app page";
-    }
-
-    @PostMapping(path = "/employees", consumes = "application/json", produces = "application/json")
-    public ResponseEntity<Object> addEmployee(@RequestBody Map<String, String> empBody) {
-
-        String id = empBody.get("id");
-        String name = empBody.get("name");
-
-        Employee emp = new Employee(Integer.valueOf(id), name);
-        empService.addEmployee(emp);
-
-        // Create resource uri
-        URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
-            .buildAndExpand(emp.getId())
-            .toUri();
-
-        // Send uri in response
-        return ResponseEntity.created(uri)
-            .build();
-    }
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java
deleted file mode 100644
index 81c7665a50..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.baeldung.employee.service;
-
-import com.baeldung.employee.domain.Employee;
-
-public interface EmployeeService {
-
-    void addEmployee(Employee emp);
-}
diff --git a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java b/EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java
deleted file mode 100644
index 45aba2898b..0000000000
--- a/EmpServiceApp/src/com/baeldung/employee/service/EmployeeServiceImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.employee.service;
-
-import org.modelmapper.ModelMapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.baeldung.employee.data.EmployeeDataAdapter;
-import com.baeldung.employee.domain.Employee;
-import com.baeldung.employee.dto.EmployeeDTO;
-
-@Service
-public class EmployeeServiceImpl implements EmployeeService {
-
-    @Autowired
-    private EmployeeDataAdapter employeeDataAdapter;
-
-    @Autowired
-    private ModelMapper modelMapper;
-
-    @Override
-    public void addEmployee(Employee emp) {
-        employeeDataAdapter.addEmployee(modelMapper.map(emp, EmployeeDTO.class));
-    }
-
-}
diff --git a/EmpServiceApp/src/createEmployeeTable.sql b/EmpServiceApp/src/createEmployeeTable.sql
deleted file mode 100644
index 14b8347bff..0000000000
--- a/EmpServiceApp/src/createEmployeeTable.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-DROP TABLE IF EXISTS EMPLOYEE;
-
-CREATE TABLE EMPLOYEE (
-
-  ID IDENTITY PRIMARY KEY,
-  NAME VARCHAR(64) NOT NULL,
-
-);
-
-INSERT INTO EMPLOYEE (ID, NAME) VALUES (10, 'EMP 10');
-INSERT INTO EMPLOYEE (ID, NAME) VALUES (20, 'EMP 20');
diff --git a/EmpServiceApp/web/WEB-INF/applicationContext.xml b/EmpServiceApp/web/WEB-INF/applicationContext.xml
deleted file mode 100644
index 54b3429708..0000000000
--- a/EmpServiceApp/web/WEB-INF/applicationContext.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns="http://www.springframework.org/schema/beans"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
-    http://www.springframework.org/schema/context
-    http://www.springframework.org/schema/context/spring-context-4.1.xsd">
-
-    <context:component-scan base-package="com.baeldung.employee.*"/>
-
-</beans>
\ No newline at end of file
diff --git a/EmpServiceApp/web/WEB-INF/web.xml b/EmpServiceApp/web/WEB-INF/web.xml
deleted file mode 100644
index 7731773f82..0000000000
--- a/EmpServiceApp/web/WEB-INF/web.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
-         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
-         version="4.0">
-    <display-name>Employee Spring App</display-name>
-
-    <listener>
-        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-    </listener>
-
-    <servlet>
-        <servlet-name>EmployeeSpringApp</servlet-name>
-        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
-        <init-param>
-            <param-name>contextConfigLocation</param-name>
-            <param-value>/WEB-INF/applicationContext.xml</param-value>
-        </init-param>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-    <servlet-mapping>
-        <servlet-name>EmployeeSpringApp</servlet-name>
-        <url-pattern>/*</url-pattern>
-    </servlet-mapping>
-</web-app>
\ No newline at end of file

From 2231a044ea3f24eafad7040ea9854f1cbbf2c87d Mon Sep 17 00:00:00 2001
From: Tyrell Flurry <tyrellflurry@gmail.com>
Date: Thu, 9 Apr 2020 16:52:54 -0400
Subject: [PATCH 041/404] BAEL-3929: modified java.

---
 .../src/main/java/com/baeldung/Main.java             | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
index 8143c7d19f..abf6c7a03d 100644
--- a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
+++ b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
@@ -6,15 +6,13 @@ import java.util.Map;
 import org.slf4j.LoggerFactory;
 
 public class Main {
-
     public static void main(String[] args) {
-        Map<String, String> teamMap = new HashMap<>();
-        teamMap.put("Dallas", "Cowboys");
-        teamMap.put("Green Bay", "Packers");
-        teamMap.put("Washington", "Redskins");
+        Map<String, String> map = new HashMap<>();
+        map.put("Dallas", "Texas");
+        map.put("Green Bay", "Wisconsin");
+        map.put("Seattle", "Washington");
 
         LoggerFactory.getLogger(Main.class)
-            .info("Team Map: {}", teamMap);
-
+            .info("Map: {}", map);
     }
 }

From dcb65ba8bc29dee95c8e338cd710320ca26fdeac Mon Sep 17 00:00:00 2001
From: Tyrell Flurry <tyrellflurry@gmail.com>
Date: Sat, 11 Apr 2020 08:31:06 -0400
Subject: [PATCH 042/404] BAEL-3929: addressed code review comments.

---
 maven-all/maven-unused-dependencies/pom.xml | 23 ++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/maven-all/maven-unused-dependencies/pom.xml b/maven-all/maven-unused-dependencies/pom.xml
index 312f38ed93..19a06fc605 100644
--- a/maven-all/maven-unused-dependencies/pom.xml
+++ b/maven-all/maven-unused-dependencies/pom.xml
@@ -10,21 +10,38 @@
         <dependency>
             <groupId>commons-collections</groupId>
             <artifactId>commons-collections</artifactId>
-            <version>3.2.2</version>
+            <version>${commons-collections.version}</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <version>1.7.25</version>
+            <version>${slf4j-api.version}</version>
         </dependency>
     </dependencies>
 
     <build>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
             <plugin>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.1</version>
+                <version>${maven-dependency-plugin.version}</version>
             </plugin>
         </plugins>
     </build>
+
+    <properties>
+        <commons-collections.version>3.2.2</commons-collections.version>
+        <slf4j-api.version>1.7.25</slf4j-api.version>
+        <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
+        <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
+    </properties>
+
 </project>
\ No newline at end of file

From b14ab5ed7ac5ccaf3dd696f4eec9f97c499a2784 Mon Sep 17 00:00:00 2001
From: Tyrell Flurry <tyrellflurry@gmail.com>
Date: Tue, 14 Apr 2020 17:59:28 -0400
Subject: [PATCH 043/404] BAEL-3929: added another example per code review.

---
 .../src/main/java/com/baeldung/Main.java          |  2 ++
 .../main/java/com/baeldung/ReflectionMain.java    | 15 +++++++++++++++
 2 files changed, 17 insertions(+)
 create mode 100644 maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java

diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
index abf6c7a03d..2626bb30a3 100644
--- a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
+++ b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
@@ -6,6 +6,7 @@ import java.util.Map;
 import org.slf4j.LoggerFactory;
 
 public class Main {
+
     public static void main(String[] args) {
         Map<String, String> map = new HashMap<>();
         map.put("Dallas", "Texas");
@@ -15,4 +16,5 @@ public class Main {
         LoggerFactory.getLogger(Main.class)
             .info("Map: {}", map);
     }
+
 }
diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java
new file mode 100644
index 0000000000..48e42f7c66
--- /dev/null
+++ b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java
@@ -0,0 +1,15 @@
+package com.baeldung;
+
+public class ReflectionMain {
+
+    public static void main(String[] args) {
+        ClassLoader classLoader = Main.class.getClassLoader();
+        try {
+            System.out.println(classLoader.loadClass("org.apache.commons.collections.CollectionUtils")
+                .getSimpleName());
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+}
\ No newline at end of file

From 3daa258c680d13d57b6ff6603e50f766c5effad3 Mon Sep 17 00:00:00 2001
From: cristianvasiliu <cristian.vasiliu@made.com>
Date: Thu, 16 Apr 2020 15:08:40 +0300
Subject: [PATCH 044/404] Updated dependency assertj.version as the old one
 wasn't found

---
 libraries-testing/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml
index ad6c81a3d6..89cb0bd494 100644
--- a/libraries-testing/pom.xml
+++ b/libraries-testing/pom.xml
@@ -195,7 +195,7 @@
         <hoverfly-java.version>0.8.1</hoverfly-java.version>
         <spring.version>4.3.8.RELEASE</spring.version>
         <spring-mock-mvc.version>4.1.1</spring-mock-mvc.version>
-        <assertj.version>3.6.2</assertj.version>
+        <assertj.version>3.14.0</assertj.version>
         <java-hamcrest.version>2.0.0.0</java-hamcrest.version>
         <h2.version>1.4.200</h2.version>
         <dbunit.version>2.7.0</dbunit.version>

From 5b59902cb254becc9521689d8a01c3d184f941b2 Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Thu, 16 Apr 2020 09:55:40 -0400
Subject: [PATCH 045/404] Removed rest of project

---
 aws-app-sync/pom.xml                          | 49 +++++++++++++++++++
 .../awsappsync/AwsAppSyncApplication.java     | 13 +++++
 .../src/main/resources/application.properties |  1 +
 .../AwsAppSyncApplicationTests.java           | 13 +++++
 4 files changed, 76 insertions(+)
 create mode 100644 aws-app-sync/pom.xml
 create mode 100644 aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
 create mode 100644 aws-app-sync/src/main/resources/application.properties
 create mode 100644 aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java

diff --git a/aws-app-sync/pom.xml b/aws-app-sync/pom.xml
new file mode 100644
index 0000000000..af02307e66
--- /dev/null
+++ b/aws-app-sync/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.2.6.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<groupId>com.baeldung</groupId>
+	<artifactId>aws-app-sync</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>aws-app-sync</name>
+	<description>Demo project for Spring Boot using AWS App Sync</description>
+
+	<properties>
+		<java.version>1.8</java.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.junit.vintage</groupId>
+					<artifactId>junit-vintage-engine</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
new file mode 100644
index 0000000000..ae012c91a5
--- /dev/null
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.awsappsync;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AwsAppSyncApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(AwsAppSyncApplication.class, args);
+	}
+
+}
diff --git a/aws-app-sync/src/main/resources/application.properties b/aws-app-sync/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/aws-app-sync/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
new file mode 100644
index 0000000000..7b82393865
--- /dev/null
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -0,0 +1,13 @@
+package com.baeldung.awsappsync;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class AwsAppSyncApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}

From 9105107048c85f7799629e723b5a3bb2f01efad9 Mon Sep 17 00:00:00 2001
From: Suresh Jaganathan <sureshnath@hotmail.com>
Date: Fri, 17 Apr 2020 12:47:32 +0100
Subject: [PATCH 046/404] tested the code with latest testng version 7.1.0

---
 testing-modules/testng/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/testing-modules/testng/pom.xml b/testing-modules/testng/pom.xml
index 601b152144..c4a1284b0e 100644
--- a/testing-modules/testng/pom.xml
+++ b/testing-modules/testng/pom.xml
@@ -42,7 +42,7 @@
 
     <properties>
         <!-- testing -->
-        <testng.version>6.10</testng.version>
+        <testng.version>7.1.0</testng.version>
     </properties>
 
 </project>
\ No newline at end of file

From 36d7572276e4ec5d142f496b92d954911e06951e Mon Sep 17 00:00:00 2001
From: Kostas Karavitis <kkaravitis@gmail.com>
Date: Fri, 17 Apr 2020 19:24:01 +0300
Subject: [PATCH 047/404] [BAEL-3936] Fixed formatting

---
 .../java/com/baeldung/jpa/unrelated/entities/Cocktail.java   | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
index fdccad6bd7..96310c1cc5 100644
--- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Cocktail.java
@@ -28,8 +28,7 @@ public class Cocktail {
         referencedColumnName = "cocktail", 
         insertable = false, updatable = false, 
         foreignKey = @javax.persistence
-        .ForeignKey(value = ConstraintMode.NO_CONSTRAINT)
-        )
+          .ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private Recipe recipe;
 
     @OneToMany(fetch = FetchType.LAZY)
@@ -40,7 +39,7 @@ public class Cocktail {
         insertable = false, 
         updatable = false, 
         foreignKey = @javax.persistence
-        .ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
+          .ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     private List<MultipleRecipe> recipeList;
 
     public Cocktail() {

From 6bf0d97d62bdfe986fde782544d47ebba9cb9705 Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Fri, 17 Apr 2020 19:50:36 -0400
Subject: [PATCH 048/404] Bael-3893 AWS AppSync with Spring Boot

---
 aws-app-sync/pom.xml                          | 15 +++-
 .../src/main/resources/application.properties |  1 -
 .../AwsAppSyncApplicationTests.java           | 90 ++++++++++++++++++-
 3 files changed, 102 insertions(+), 4 deletions(-)
 delete mode 100644 aws-app-sync/src/main/resources/application.properties

diff --git a/aws-app-sync/pom.xml b/aws-app-sync/pom.xml
index af02307e66..d30cfc96a4 100644
--- a/aws-app-sync/pom.xml
+++ b/aws-app-sync/pom.xml
@@ -8,17 +8,26 @@
 		<version>2.2.6.RELEASE</version>
 		<relativePath/> <!-- lookup parent from repository -->
 	</parent>
+
 	<groupId>com.baeldung</groupId>
 	<artifactId>aws-app-sync</artifactId>
 	<version>0.0.1-SNAPSHOT</version>
 	<name>aws-app-sync</name>
-	<description>Demo project for Spring Boot using AWS App Sync</description>
+
+	<description>Spring Boot using AWS App Sync</description>
 
 	<properties>
 		<java.version>1.8</java.version>
 	</properties>
 
 	<dependencies>
+
+		<dependency>
+			<groupId>com.amazonaws</groupId>
+			<artifactId>aws-java-sdk-appsync</artifactId>
+			<version>1.11.762</version>
+		</dependency>
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
@@ -35,6 +44,10 @@
 				</exclusion>
 			</exclusions>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-webflux</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>
diff --git a/aws-app-sync/src/main/resources/application.properties b/aws-app-sync/src/main/resources/application.properties
deleted file mode 100644
index 8b13789179..0000000000
--- a/aws-app-sync/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
index 7b82393865..15bcc6e9c9 100644
--- a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -1,13 +1,99 @@
 package com.baeldung.awsappsync;
 
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 @SpringBootTest
 class AwsAppSyncApplicationTests {
 
-	@Test
-	void contextLoads() {
+	static String apiUrl = "https://m4i3b6icrrb7livfbypfspiifi.appsync-api.us-east-2.amazonaws.com";
+	static String apiKey = "da2-es2s6oj4mzhbxk5yu26ss2ruj4";
+	static String API_KEY_HEADER = "x-api-key";
+
+	static WebClient.RequestBodySpec requestBodySpec;
+
+	@BeforeAll
+	static void setUp() {
+		requestBodySpec = WebClient
+				.builder()
+				.baseUrl(apiUrl)
+				.defaultHeader(API_KEY_HEADER, apiKey)
+				.build()
+				.method(HttpMethod.POST)
+				.uri("/graphql");
 	}
 
+	@Test
+	void testGraphQuery() {
+
+		Map<String, Object> requestBody = new HashMap<>();
+		requestBody.put("query", "query ListEvents {\n" +
+				"  listEvents {\n" +
+				"    items {\n" +
+				"      id\n" +
+				"      name\n" +
+				"      where\n" +
+				"      when\n" +
+				"      description\n" +
+				"    }\n" +
+				"  }\n" +
+				"}");
+		requestBody.put("variables", "");
+		requestBody.put("operationName", "ListEvents");
+
+		WebClient.ResponseSpec response = requestBodySpec
+				.body(BodyInserters.fromValue(requestBody))
+				.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
+				.acceptCharset(StandardCharsets.UTF_8)
+				.retrieve();
+
+		String bodyString = response.bodyToMono(String.class).block();
+
+		assertTrue(bodyString != null && bodyString.contains("My First Event"));
+	}
+
+	@Test
+	void testGraphAdd() {
+
+		String queryString = "mutation add {\n" +
+				"    createEvent(\n" +
+				"        name:\"My added GraphQL event\"\n" +
+				"        where:\"Day 2\"\n" +
+				"        when:\"Saturday night\"\n" +
+				"        description:\"Studying GraphQL\"\n" +
+				"    ){\n" +
+				"        id\n" +
+				"        name\n" +
+				"        where\n" +
+				"        when\n" +
+				"        description\n" +
+				"    }\n" +
+				"}";
+
+
+		Map<String, Object> requestBody = new HashMap<>();
+		requestBody.put("query", queryString);
+		requestBody.put("variables", "");
+		requestBody.put("operationName", "add");
+
+		WebClient.ResponseSpec response = requestBodySpec
+				.body(BodyInserters.fromValue(requestBody))
+				.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
+				.acceptCharset(StandardCharsets.UTF_8)
+				.retrieve();
+
+		String bodyString = response.bodyToMono(String.class).block();
+		assertTrue(bodyString != null && bodyString.contains("Day 2"));
+	}
 }

From 9a1e98598f8c8015dff5dc2edc86446d28f606b6 Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Fri, 17 Apr 2020 19:56:42 -0400
Subject: [PATCH 049/404] Bael-3893 AWS AppSync with Spring Boot

---
 .../awsappsync/AwsAppSyncApplicationTests.java  | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
index 15bcc6e9c9..005d533cbf 100644
--- a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -35,7 +35,7 @@ class AwsAppSyncApplicationTests {
 	}
 
 	@Test
-	void testGraphQuery() {
+	void givenGraphQuery_whenListEvents_thenReturnAllEvents() {
 
 		Map<String, Object> requestBody = new HashMap<>();
 		requestBody.put("query", "query ListEvents {\n" +
@@ -60,11 +60,14 @@ class AwsAppSyncApplicationTests {
 
 		String bodyString = response.bodyToMono(String.class).block();
 
-		assertTrue(bodyString != null && bodyString.contains("My First Event"));
+		assertNotNull(bodyString);
+		assertTrue(bodyString.contains("My First Event"));
+		assertTrue(bodyString.contains("where"));
+		assertTrue(bodyString.contains("when"));
 	}
 
 	@Test
-	void testGraphAdd() {
+	void givenGraphAdd_whenMutation_thenReturnIdNameDesc() {
 
 		String queryString = "mutation add {\n" +
 				"    createEvent(\n" +
@@ -75,8 +78,6 @@ class AwsAppSyncApplicationTests {
 				"    ){\n" +
 				"        id\n" +
 				"        name\n" +
-				"        where\n" +
-				"        when\n" +
 				"        description\n" +
 				"    }\n" +
 				"}";
@@ -94,6 +95,10 @@ class AwsAppSyncApplicationTests {
 				.retrieve();
 
 		String bodyString = response.bodyToMono(String.class).block();
-		assertTrue(bodyString != null && bodyString.contains("Day 2"));
+
+		assertNotNull(bodyString);
+		assertTrue(bodyString.contains("My added GraphQL event"));
+		assertFalse(bodyString.contains("where"));
+		assertFalse(bodyString.contains("when"));
 	}
 }

From 3746a5328554b56ff614d5abf328f104e4b6c727 Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Fri, 17 Apr 2020 20:16:59 -0400
Subject: [PATCH 050/404] Bael 3893 - Added to modules

---
 pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pom.xml b/pom.xml
index 71e5d21b02..22d73f3a9e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1015,6 +1015,7 @@
                 <module>asm</module>
                 <module>atomix</module>
                 <module>aws</module>
+				<module>aws-app-sync</module>
                 <module>aws-lambda</module>
                 <module>axon</module>
                 <module>azure</module>

From 80f5196ecc41226395c27e8b0ccd73763f426e4d Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sat, 18 Apr 2020 23:28:45 +0530
Subject: [PATCH 051/404] renamed project name

---
 .../{entitiymodule => entitymodule}/pom.xml              | 0
 .../src/main/java/com/baeldung/entity/User.java          | 0
 .../src/main/java/module-info.java                       | 0
 .../{mainppmodule => mainappmodule}/pom.xml              | 9 ++++++---
 .../src/main/java/com/baeldung/mainapp/Application.java  | 0
 .../src/main/java/module-info.java                       | 0
 6 files changed, 6 insertions(+), 3 deletions(-)
 rename maven-java-11/multimodule-maven-project/{entitiymodule => entitymodule}/pom.xml (100%)
 rename maven-java-11/multimodule-maven-project/{entitiymodule => entitymodule}/src/main/java/com/baeldung/entity/User.java (100%)
 rename maven-java-11/multimodule-maven-project/{entitiymodule => entitymodule}/src/main/java/module-info.java (100%)
 rename maven-java-11/multimodule-maven-project/{mainppmodule => mainappmodule}/pom.xml (97%)
 rename maven-java-11/multimodule-maven-project/{mainppmodule => mainappmodule}/src/main/java/com/baeldung/mainapp/Application.java (100%)
 rename maven-java-11/multimodule-maven-project/{mainppmodule => mainappmodule}/src/main/java/module-info.java (100%)

diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml b/maven-java-11/multimodule-maven-project/entitymodule/pom.xml
similarity index 100%
rename from maven-java-11/multimodule-maven-project/entitiymodule/pom.xml
rename to maven-java-11/multimodule-maven-project/entitymodule/pom.xml
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java b/maven-java-11/multimodule-maven-project/entitymodule/src/main/java/com/baeldung/entity/User.java
similarity index 100%
rename from maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java
rename to maven-java-11/multimodule-maven-project/entitymodule/src/main/java/com/baeldung/entity/User.java
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/entitymodule/src/main/java/module-info.java
similarity index 100%
rename from maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java
rename to maven-java-11/multimodule-maven-project/entitymodule/src/main/java/module-info.java
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml b/maven-java-11/multimodule-maven-project/mainappmodule/pom.xml
similarity index 97%
rename from maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
rename to maven-java-11/multimodule-maven-project/mainappmodule/pom.xml
index a4a6575906..1f4493c34c 100644
--- a/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
+++ b/maven-java-11/multimodule-maven-project/mainappmodule/pom.xml
@@ -12,9 +12,6 @@
         <groupId>com.baeldung.multimodule-maven-project</groupId>
         <artifactId>multimodule-maven-project</artifactId>
         <version>1.0</version>
-        <entitymodule.version>1.0</entitymodule.version>
-        <daomodule.version>1.0</daomodule.version>
-        <userdaomodule.version>1.0</userdaomodule.version>
     </parent>
 
     <dependencies>
@@ -35,4 +32,10 @@
         </dependency>
     </dependencies>
 
+    <properties>
+        <entitymodule.version>1.0</entitymodule.version>
+        <daomodule.version>1.0</daomodule.version>
+        <userdaomodule.version>1.0</userdaomodule.version>
+    </properties>
+
 </project>
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java b/maven-java-11/multimodule-maven-project/mainappmodule/src/main/java/com/baeldung/mainapp/Application.java
similarity index 100%
rename from maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java
rename to maven-java-11/multimodule-maven-project/mainappmodule/src/main/java/com/baeldung/mainapp/Application.java
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/mainappmodule/src/main/java/module-info.java
similarity index 100%
rename from maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java
rename to maven-java-11/multimodule-maven-project/mainappmodule/src/main/java/module-info.java

From 95578f92ea2e77deca0d76a08be98675943df8db Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 19 Apr 2020 18:09:24 +0530
Subject: [PATCH 052/404] update pom version from RC to GA

---
 core-java-modules/core-java-time-measurements/pom.xml | 2 +-
 jhipster/jhipster-uaa/gateway/pom.xml                 | 2 +-
 jhipster/jhipster-uaa/quotes/pom.xml                  | 2 +-
 jhipster/jhipster-uaa/uaa/pom.xml                     | 2 +-
 persistence-modules/java-jpa-2/pom.xml                | 2 +-
 persistence-modules/java-jpa/pom.xml                  | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml
index 71a012ca2b..b751cc0d74 100644
--- a/core-java-modules/core-java-time-measurements/pom.xml
+++ b/core-java-modules/core-java-time-measurements/pom.xml
@@ -96,7 +96,7 @@
         <!-- testing -->
         <assertj.version>3.6.1</assertj.version>
         <asspectj.version>1.8.9</asspectj.version>
-        <powermock.version>2.0.0-RC.4</powermock.version>
+        <powermock.version>2.0.0</powermock.version>
         <jmockit.version>1.44</jmockit.version>
         <!-- plugins -->
         <maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version>
diff --git a/jhipster/jhipster-uaa/gateway/pom.xml b/jhipster/jhipster-uaa/gateway/pom.xml
index 1b85877a9b..b417bd7b57 100644
--- a/jhipster/jhipster-uaa/gateway/pom.xml
+++ b/jhipster/jhipster-uaa/gateway/pom.xml
@@ -1013,7 +1013,7 @@
 	
     <properties>
         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
-        <spring.web.version>0.24.0-RC.0</spring.web.version>
+        <spring.web.version>0.24.0</spring.web.version>
         <!-- Build properties -->
         <maven.version>3.0.0</maven.version>
         <java.version>1.8</java.version>
diff --git a/jhipster/jhipster-uaa/quotes/pom.xml b/jhipster/jhipster-uaa/quotes/pom.xml
index aacc6f8e36..f088ad2fd1 100644
--- a/jhipster/jhipster-uaa/quotes/pom.xml
+++ b/jhipster/jhipster-uaa/quotes/pom.xml
@@ -910,6 +910,6 @@
         <sonar.tests>${project.basedir}/src/test/</sonar.tests>
 
         <!-- jhipster-needle-maven-property -->
-        <zalando.version>0.24.0-RC.0</zalando.version>
+        <zalando.version>0.24.0</zalando.version>
     </properties>	
 </project>
diff --git a/jhipster/jhipster-uaa/uaa/pom.xml b/jhipster/jhipster-uaa/uaa/pom.xml
index 27a056820d..f9c1f226bb 100644
--- a/jhipster/jhipster-uaa/uaa/pom.xml
+++ b/jhipster/jhipster-uaa/uaa/pom.xml
@@ -835,7 +835,7 @@
 	
     <properties>
         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
-        <spring.web.version>0.24.0-RC.0</spring.web.version>
+        <spring.web.version>0.24.0</spring.web.version>
         <!-- Build properties -->
         <maven.version>3.0.0</maven.version>
         <java.version>1.8</java.version>
diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml
index f79f6f1633..76b1033dac 100644
--- a/persistence-modules/java-jpa-2/pom.xml
+++ b/persistence-modules/java-jpa-2/pom.xml
@@ -111,7 +111,7 @@
 
     <properties>
         <hibernate.version>5.4.0.Final</hibernate.version>
-        <eclipselink.version>2.7.4-RC1</eclipselink.version>
+        <eclipselink.version>2.7.4</eclipselink.version>
         <postgres.version>42.2.5</postgres.version>
         <javax.persistence-api.version>2.2</javax.persistence-api.version>
         <assertj.version>3.11.1</assertj.version>
diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml
index 762c541d96..3601721dac 100644
--- a/persistence-modules/java-jpa/pom.xml
+++ b/persistence-modules/java-jpa/pom.xml
@@ -106,7 +106,7 @@
 
     <properties>
         <hibernate.version>5.4.0.Final</hibernate.version>
-        <eclipselink.version>2.7.4-RC1</eclipselink.version>
+        <eclipselink.version>2.7.4</eclipselink.version>
         <postgres.version>42.2.5</postgres.version>
         <javax.persistence-api.version>2.2</javax.persistence-api.version>
         <maven-processor-plugin.version>3.3.3</maven-processor-plugin.version>

From ffc79e7edd3d9825ce3f9ab3aaedd73efb15564b Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Fri, 17 Apr 2020 21:25:03 +0200
Subject: [PATCH 053/404] [JAVA-630] vavr-2 module

* Creation

* Moved https://www.baeldung.com/vavr-either code

* Moved https://www.baeldung.com/java-vavr code
---
 pom.xml                                       |  6 +++--
 vavr-2/README.md                              |  8 ++++++
 vavr-2/pom.xml                                | 27 +++++++++++++++++++
 .../com/baeldung/vavr/either/EitherDemo.java  |  0
 .../baeldung/vavr/either/EitherUnitTest.java  |  0
 .../CollectionsInteroperabilityUnitTest.java  |  0
 vavr/README.md                                |  3 +--
 7 files changed, 40 insertions(+), 4 deletions(-)
 create mode 100644 vavr-2/README.md
 create mode 100644 vavr-2/pom.xml
 rename {vavr => vavr-2}/src/main/java/com/baeldung/vavr/either/EitherDemo.java (100%)
 rename {vavr => vavr-2}/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java (100%)
 rename {vavr => vavr-2}/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java (100%)

diff --git a/pom.xml b/pom.xml
index 02d1ab6cd2..1b3c98994f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -812,7 +812,8 @@
                 <module>libraries</module> <!-- very long running -->
 
                 <module>vaadin</module>
-                <module>vavr</module>
+		<module>vavr</module>
+		<module>vavr-2</module>
             </modules>
         </profile>
 
@@ -1310,7 +1311,8 @@
                 <module>libraries</module> <!-- very long running -->
 
                 <module>vaadin</module>
-                <module>vavr</module>
+		<module>vavr</module>
+		<module>vavr-2</module>
             </modules>
 
         </profile>
diff --git a/vavr-2/README.md b/vavr-2/README.md
new file mode 100644
index 0000000000..71814a08fd
--- /dev/null
+++ b/vavr-2/README.md
@@ -0,0 +1,8 @@
+## Vavr
+
+This module contains articles about Vavr.
+
+### Relevant Articles:
+- [Introduction to Vavr’s Either](https://www.baeldung.com/vavr-either)
+- [Interoperability Between Java and Vavr](https://www.baeldung.com/java-vavr)
+- [[<-- prev]](/vavr)
diff --git a/vavr-2/pom.xml b/vavr-2/pom.xml
new file mode 100644
index 0000000000..d20dd9afef
--- /dev/null
+++ b/vavr-2/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>parent-modules</artifactId>
+        <groupId>com.baeldung</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>vavr-2</artifactId>
+    <name>vavr-2</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.vavr</groupId>
+            <artifactId>vavr-test</artifactId>
+            <version>${vavr.version}</version>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <vavr.version>0.9.1</vavr.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/vavr/src/main/java/com/baeldung/vavr/either/EitherDemo.java b/vavr-2/src/main/java/com/baeldung/vavr/either/EitherDemo.java
similarity index 100%
rename from vavr/src/main/java/com/baeldung/vavr/either/EitherDemo.java
rename to vavr-2/src/main/java/com/baeldung/vavr/either/EitherDemo.java
diff --git a/vavr/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java b/vavr-2/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java
similarity index 100%
rename from vavr/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java
rename to vavr-2/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java
diff --git a/vavr/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java b/vavr-2/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java
similarity index 100%
rename from vavr/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java
rename to vavr-2/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java
diff --git a/vavr/README.md b/vavr/README.md
index 2b8bb25356..e04e02069f 100644
--- a/vavr/README.md
+++ b/vavr/README.md
@@ -13,5 +13,4 @@ This module contains articles about Vavr.
 - [Guide to Collections API in Vavr](https://www.baeldung.com/vavr-collections)
 - [Collection Factory Methods for Vavr](https://www.baeldung.com/vavr-collection-factory-methods)
 - [Introduction to Future in Vavr](https://www.baeldung.com/vavr-future)
-- [Introduction to Vavr’s Either](https://www.baeldung.com/vavr-either)
-- [Interoperability Between Java and Vavr](https://www.baeldung.com/java-vavr)
+- [[next -->]](/vavr-2)

From c4ed1770e266a0b9395a05fd47a2b04f82d47215 Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sun, 19 Apr 2020 21:46:19 +0530
Subject: [PATCH 054/404] "first commit in new fork"

---
 .../baeldung/composite/BookApplication.java   | 12 ++++
 .../com/baeldung/composite/entity/Book.java   | 47 ++++++++++++++
 .../com/baeldung/composite/entity/BookId.java | 51 +++++++++++++++
 .../composite/repository/BookRepository.java  | 16 +++++
 .../repository/BookRepositoryTest.java        | 63 +++++++++++++++++++
 5 files changed, 189 insertions(+)
 create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java
 create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java
 create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java
 create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java
 create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java

diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java
new file mode 100644
index 0000000000..52f06058aa
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.composite;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class BookApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BookApplication.class);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java
new file mode 100644
index 0000000000..e4f1727654
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java
@@ -0,0 +1,47 @@
+package com.baeldung.composite.entity;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+@Entity
+public class Book {
+
+    @EmbeddedId
+    private BookId id;
+    private String genre;
+    private Integer price;
+
+    public Book() {
+    }
+
+    public Book(String author, String name, String genre, Integer price) {
+        BookId id = new BookId(author, name);
+        this.id = id;
+        this.genre = genre;
+        this.price = price;
+    }
+
+    public BookId getId() {
+        return id;
+    }
+
+    public void setId(BookId id) {
+        this.id = id;
+    }
+
+    public String getGenre() {
+        return genre;
+    }
+
+    public void setGenre(String genre) {
+        this.genre = genre;
+    }
+
+    public Integer getPrice() {
+        return price;
+    }
+
+    public void setPrice(Integer price) {
+        this.price = price;
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java
new file mode 100644
index 0000000000..1524452412
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java
@@ -0,0 +1,51 @@
+package com.baeldung.composite.entity;
+
+import javax.persistence.Embeddable;
+import java.io.Serializable;
+import java.util.Objects;
+
+@Embeddable
+public class BookId implements Serializable {
+
+    private String author;
+    private String name;
+
+    public BookId() {
+    }
+
+    public BookId(String author, String name) {
+        this.author = author;
+        this.name = name;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        BookId bookId = (BookId) o;
+        return Objects.equals(author, bookId.author) && Objects.equals(name, bookId.name);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(author, name);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java
new file mode 100644
index 0000000000..3c09f909f0
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java
@@ -0,0 +1,16 @@
+package com.baeldung.composite.repository;
+
+import com.baeldung.composite.entity.Book;
+import com.baeldung.composite.entity.BookId;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface BookRepository extends JpaRepository<Book, BookId> {
+
+    List<Book> findByIdName(String name);
+
+    List<Book> findByIdAuthor(String author);
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java
new file mode 100644
index 0000000000..590593982d
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.composite.repository;
+
+import com.baeldung.composite.BookApplication;
+import com.baeldung.composite.entity.Book;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = BookApplication.class)
+public class BookRepositoryTest {
+
+    public static final String JAVA_101 = "Java101";
+    public static final String JANE = "Jane";
+    @Autowired
+    BookRepository repository;
+
+    @Before
+    public void setUp() {
+        Book book1 = new Book("John", JAVA_101, "Tech", 20);
+        Book book2 = new Book(JANE, JAVA_101, "Arch", 25);
+        Book book3 = new Book(JANE, "Scala101", "Tech", 23);
+
+        repository.saveAll(Arrays.asList(book1, book2, book3));
+    }
+
+    @After
+    public void tearDown() {
+        repository.deleteAll();
+    }
+
+    @Test
+    public void testFindByName() {
+        List<Book> books = repository.findByIdName(JAVA_101);
+
+        assertEquals(2, books.size());
+    }
+
+    @Test
+    public void testFindByAuthor() {
+        List<Book> books = repository.findByIdAuthor(JANE);
+
+        assertEquals(2, books.size());
+    }
+
+    @Test
+    public void testFindByGenre() {
+        List<Book> books = repository.findByIdAuthor(JANE);
+
+        assertEquals(2, books.size());
+    }
+}
\ No newline at end of file

From 60b00e38b6c5e1940bdbb7bae6baf38925765f1b Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sun, 19 Apr 2020 23:03:39 +0530
Subject: [PATCH 055/404] "first commit in new fork"

---
 ...okRepositoryTest.java => BookRepositoryIntegrationTest.java} | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/{BookRepositoryTest.java => BookRepositoryIntegrationTest.java} (97%)

diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
similarity index 97%
rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java
rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
index 590593982d..362950bea9 100644
--- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryTest.java
+++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
@@ -19,7 +19,7 @@ import static org.junit.Assert.assertEquals;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = BookApplication.class)
-public class BookRepositoryTest {
+public class BookRepositoryIntegrationTest {
 
     public static final String JAVA_101 = "Java101";
     public static final String JANE = "Jane";

From 0a42d945f85a0418e7e8de9980ff601f5ecb3ccf Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Sun, 19 Apr 2020 21:02:17 +0200
Subject: [PATCH 056/404] Source project for the draft article

---
 model-mapper/src/Main.java                    | 58 +++++++++++++++
 model-mapper/src/com/baeldung/model/User.java | 70 +++++++++++++++++++
 .../src/com/baeldung/model/UserDTO.java       | 49 +++++++++++++
 .../src/com/baeldung/model/UserList.java      | 21 ++++++
 .../src/com/baeldung/util/MapperUtil.java     | 47 +++++++++++++
 .../com/baeldung/util/UserPropertyMap.java    | 36 ++++++++++
 6 files changed, 281 insertions(+)
 create mode 100644 model-mapper/src/Main.java
 create mode 100644 model-mapper/src/com/baeldung/model/User.java
 create mode 100644 model-mapper/src/com/baeldung/model/UserDTO.java
 create mode 100644 model-mapper/src/com/baeldung/model/UserList.java
 create mode 100644 model-mapper/src/com/baeldung/util/MapperUtil.java
 create mode 100644 model-mapper/src/com/baeldung/util/UserPropertyMap.java

diff --git a/model-mapper/src/Main.java b/model-mapper/src/Main.java
new file mode 100644
index 0000000000..a6deb49168
--- /dev/null
+++ b/model-mapper/src/Main.java
@@ -0,0 +1,58 @@
+import com.baeldung.model.User;
+import com.baeldung.model.UserDTO;
+import com.baeldung.model.UserList;
+import com.baeldung.util.MapperUtil;
+import com.baeldung.util.UserPropertyMap;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+
+public class Main {
+
+    public static void main(String[] args) {
+
+        //Instantiate ModelMapper
+
+        ModelMapper mapper = new ModelMapper();
+        mapper.addMappings(new UserPropertyMap());
+
+        // Mapping lists using TypeToken generic class
+
+        List<Integer> integers = new ArrayList<Integer>();
+
+        integers.add(1);
+        integers.add(2);
+        integers.add(3);
+
+        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {}.getType());
+
+        System.out.println("Character list: " + characters);
+
+        // Mapping lists using generic type methods
+
+        List<User> users = new ArrayList();
+        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
+        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
+        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
+
+        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
+        userDtoList.stream().map(userDto -> userDto.getEmail()).forEachOrdered(System.out::println);
+
+        // Mapping lists using PropertyMap and Converter
+
+        UserList userList = new UserList();
+        userList.setUsers(users);
+        UserDTO dto = new UserDTO();
+
+        mapper.map(userList, dto);
+        dto.getUsernames().forEach(System.out::println);
+
+    }
+}
diff --git a/model-mapper/src/com/baeldung/model/User.java b/model-mapper/src/com/baeldung/model/User.java
new file mode 100644
index 0000000000..73e4baafb5
--- /dev/null
+++ b/model-mapper/src/com/baeldung/model/User.java
@@ -0,0 +1,70 @@
+package com.baeldung.model;
+
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+public class User {
+
+    private String userId;
+    private String userName;
+    private String email;
+    private String contactNumber;
+    private String userType;
+
+    // Standard constructors, getters and setters
+
+    public User(){}
+
+    public User(String userId, String userName, String email, String contactNumber, String userType) {
+        this.userId = userId;
+        this.userName = userName;
+        this.email = email;
+        this.contactNumber = contactNumber;
+        this.userType = userType;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getContactNumber() {
+        return contactNumber;
+    }
+
+    public void setContactNumber(String contactNumber) {
+        this.contactNumber = contactNumber;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+
+}
diff --git a/model-mapper/src/com/baeldung/model/UserDTO.java b/model-mapper/src/com/baeldung/model/UserDTO.java
new file mode 100644
index 0000000000..ed056ace8c
--- /dev/null
+++ b/model-mapper/src/com/baeldung/model/UserDTO.java
@@ -0,0 +1,49 @@
+package com.baeldung.model;
+
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+public class UserDTO {
+
+    private String userId;
+    private String userName;
+    private String email;
+    private List<String> usernames;
+
+    // getters and setters
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public List<String> getUsernames() {
+        return usernames;
+    }
+
+    public void setUsernames(List<String> usernames) {
+        this.usernames = usernames;
+    }
+}
diff --git a/model-mapper/src/com/baeldung/model/UserList.java b/model-mapper/src/com/baeldung/model/UserList.java
new file mode 100644
index 0000000000..b30d5507d5
--- /dev/null
+++ b/model-mapper/src/com/baeldung/model/UserList.java
@@ -0,0 +1,21 @@
+package com.baeldung.model;
+
+import java.util.Collection;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+
+public class UserList {
+
+    private Collection<User> users;
+
+    public Collection<User> getUsers() {
+        return users;
+    }
+
+    public void setUsers(Collection<User> users) {
+        this.users = users;
+    }
+}
diff --git a/model-mapper/src/com/baeldung/util/MapperUtil.java b/model-mapper/src/com/baeldung/util/MapperUtil.java
new file mode 100644
index 0000000000..fe10b7777d
--- /dev/null
+++ b/model-mapper/src/com/baeldung/util/MapperUtil.java
@@ -0,0 +1,47 @@
+package com.baeldung.util;
+
+import org.modelmapper.ModelMapper;
+import org.modelmapper.convention.MatchingStrategies;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+public class MapperUtil {
+
+
+    private static ModelMapper modelMapper = new ModelMapper();
+
+
+    static {
+
+        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
+
+    }
+
+    private MapperUtil() {
+
+
+    }
+
+    public static <S, T> T mapTo(final S source, final Class<T> target) {
+
+        return modelMapper.map(source, target);
+    }
+
+    public static <S, T> List<T> mapList(final List<S> sourceList, final Class<T> target) {
+
+        List<T> targetList = new ArrayList<T>();
+
+        for (S source : sourceList) {
+
+            targetList.add(modelMapper.map(source, target));
+        }
+
+        return targetList;
+    }
+
+}
diff --git a/model-mapper/src/com/baeldung/util/UserPropertyMap.java b/model-mapper/src/com/baeldung/util/UserPropertyMap.java
new file mode 100644
index 0000000000..4346174440
--- /dev/null
+++ b/model-mapper/src/com/baeldung/util/UserPropertyMap.java
@@ -0,0 +1,36 @@
+package com.baeldung.util;
+
+import com.baeldung.model.User;
+import com.baeldung.model.UserDTO;
+import com.baeldung.model.UserList;
+import org.modelmapper.AbstractConverter;
+import org.modelmapper.Converter;
+import org.modelmapper.PropertyMap;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+
+public class UserPropertyMap extends PropertyMap<UserList, UserDTO> {
+
+
+    Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
+
+        List<String> usernames = new ArrayList<>();
+
+        protected List<String> convert(List<User> users) {
+
+            users.forEach(user -> usernames.add(user.getUserName()));
+            return usernames;
+        }
+
+    };
+
+    @Override
+    protected void configure() {
+        using(converter).map(source.getUsers(), destination.getUsernames());
+    }
+}

From 3233f80c5b0df473890982e561c41cea53e06a28 Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Sun, 19 Apr 2020 22:37:21 +0200
Subject: [PATCH 057/404] [BAEL-3944] Code Upload

---
 .../com/baeldung/regex/RegexUnitTest.java     | 44 +++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
index b3c3a91a09..909894ec55 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
@@ -481,6 +481,50 @@ public class RegexUnitTest {
 
     }
 
+    @Test
+    public void whenMatchesTenDigitsNumber_thenCorrect() {
+        Pattern pattern = Pattern.compile("^\\d{10}$");
+        Matcher matcher = pattern.matcher("1234567890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesTenDigitsNumberWhitespacesHyphen_thenCorrect() {
+        Pattern pattern = Pattern.compile("^(\\d{3}[- ]?){2}\\d{4}$");
+        Matcher matcher = pattern.matcher("123 456 7890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
+        Pattern pattern = Pattern.compile("^\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
+        Matcher matcher = pattern.matcher("(123)-456-7890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
+        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
+        Matcher matcher = pattern.matcher("+111 (123)-456-7890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesPhoneNumber_thenCorrect() {
+        String patterns = "^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$" + 
+                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + 
+                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
+        
+        String[] validPhoneNumbers = {"1234567890","123 456 7890", "(123)-456-7890", "+111 (123)-456-7890",
+                                      "123 456 789", "+111 123 456 789", "123 45 67 89", "+111 123 45 67 89"};
+        
+        Pattern pattern = Pattern.compile(patterns);
+        for(String phoneNumber : validPhoneNumbers) {
+            Matcher matcher = pattern.matcher(phoneNumber);
+            assertTrue(matcher.matches());
+        }
+    }
+
     public synchronized static int runTest(String regex, String text) {
         pattern = Pattern.compile(regex);
         matcher = pattern.matcher(text);

From 9d993fc5bbf4ac4ce22b042b0104aa8affb3ea0f Mon Sep 17 00:00:00 2001
From: Kostas Karavitis <kkaravitis@gmail.com>
Date: Mon, 20 Apr 2020 00:29:56 +0300
Subject: [PATCH 058/404] [BAEL-3936] Changed test methods names to follow BDD
 naming conventions

---
 .../unrelated/entities/UnrelatedEntitiesUnitTest.java  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
index 8733b3e7da..569b093db6 100644
--- a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
@@ -40,7 +40,7 @@ public class UnrelatedEntitiesUnitTest {
 
 
     @Test
-    public void whenQueryingForCocktailThatHasRecipe_thenTheExpectedCocktailReturned() {
+    public void givenCocktailsWithRecipe_whenQuerying_thenTheExpectedCocktailsReturned() {
         // JPA
         Cocktail cocktail = entityManager.createQuery("select c "
             + "from Cocktail c join c.recipe", Cocktail.class)
@@ -67,7 +67,7 @@ public class UnrelatedEntitiesUnitTest {
     }
 
     @Test
-    public void whenQueryingForCocktailThatHasNotARecipe_thenTheExpectedCocktailReturned() {
+    public void givenCocktailsWithoutRecipe_whenQuerying_thenTheExpectedCocktailsReturned() {
         Cocktail cocktail = entityManager.createQuery("select c "
             + "from Cocktail c left join c.recipe r " 
             + "where r is null", Cocktail.class)
@@ -97,7 +97,7 @@ public class UnrelatedEntitiesUnitTest {
     }
 
     @Test
-    public void whenQueringForCocktailThatHasRecipes_thenTheExpectedCocktailReturned() {
+    public void givenCocktailsWithMultipleRecipes_whenQuerying_thenTheExpectedCocktailsReturned() {
         // JPQL
         Cocktail cocktail = entityManager.createQuery("select c "
             + "from Cocktail c join c.recipeList", Cocktail.class)
@@ -124,7 +124,7 @@ public class UnrelatedEntitiesUnitTest {
     }
 
     @Test
-    public void whenQueryingForCocktailThatHasNotRecipes_thenTheExpectedCocktailReturned() {
+    public void givenCocktailsWithoutMultipleRecipes_whenQuerying_thenTheExpectedCocktailsReturned() {
         // JPQL
         Cocktail cocktail = entityManager.createQuery("select c "
             + "from Cocktail c left join c.recipeList r "
@@ -156,7 +156,7 @@ public class UnrelatedEntitiesUnitTest {
     }
 
     @Test
-    public void whenQueryingForMultipleRecipes_thenTheExpectedRecipesReturned() {
+    public void givenMultipleRecipesWithCocktails_whenQuerying_thenTheExpectedMultipleRecipesReturned() {
         Consumer<List<MultipleRecipe>> verifyResult = recipes -> {
             assertEquals(2, recipes.size());
             recipes.forEach(r -> assertEquals(mojito.getName(), r.getCocktail()));

From b37ee5f26d08e8e24d2eae2b1aa101f6c9b62b8c Mon Sep 17 00:00:00 2001
From: Cavero Barca <carlos.cavero@atos.net>
Date: Tue, 21 Apr 2020 15:29:47 +0200
Subject: [PATCH 059/404] Add WebFilter Factories examples configured through
 yaml and Java DSL

---
 spring-cloud/spring-cloud-gateway/pom.xml     | 12 ++-
 .../WebFilterGatewayApplication.java          | 15 +++
 .../config/ModifyBodyRouteConfig.java         | 49 ++++++++++
 .../main/resources/application-webfilters.yml | 93 +++++++++++++++++++
 4 files changed, 165 insertions(+), 4 deletions(-)
 create mode 100644 spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
 create mode 100644 spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
 create mode 100644 spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml

diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml
index 0f62c031cf..ada32ae85f 100644
--- a/spring-cloud/spring-cloud-gateway/pom.xml
+++ b/spring-cloud/spring-cloud-gateway/pom.xml
@@ -49,6 +49,12 @@
             <artifactId>spring-cloud-starter-gateway</artifactId>
         </dependency>
 
+        <!-- Circuit Breaker -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
+        </dependency>
+        
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator-cdi</artifactId>
@@ -84,10 +90,8 @@
     </build>
 
     <properties>
-        <spring-cloud-dependencies.version>Greenwich.SR3</spring-cloud-dependencies.version>
-
-        <!-- Spring Boot version compatible with Spring Cloud Release train -->
-        <spring-boot.version>2.1.9.RELEASE</spring-boot.version>
+        <spring-cloud-dependencies.version>Hoxton.SR3</spring-cloud-dependencies.version>
+        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
         <hibernate-validator.version>6.0.2.Final</hibernate-validator.version>
     </properties>
 
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
new file mode 100644
index 0000000000..3b45e9013f
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.springcloudgateway.webfilters;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+
+@SpringBootApplication
+public class WebFilterGatewayApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(WebFilterGatewayApplication.class)
+            .profiles("webfilters")
+            .run(args);
+    }
+
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
new file mode 100644
index 0000000000..ccc789f287
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
@@ -0,0 +1,49 @@
+package com.baeldung.springcloudgateway.webfilters.config;
+
+import org.springframework.cloud.gateway.route.RouteLocator;
+import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class ModifyBodyRouteConfig {
+
+    @Bean
+    public RouteLocator routes(RouteLocatorBuilder builder) {
+        return builder.routes()
+            .route("modify_request_body", r -> r.path("/post")
+                .filters(f -> f.modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
+                        (exchange, s) -> Mono.just(new Hello(s.toUpperCase())))).uri("https://httpbin.org"))
+            .build();
+    }  
+
+    @Bean
+    public RouteLocator responseRoutes(RouteLocatorBuilder builder) {
+        return builder.routes()
+            .route("modify_response_body", r -> r.path("/put/**")
+                .filters(f -> f.modifyResponseBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
+                        (exchange, s) -> Mono.just(new Hello("New Body")))).uri("https://httpbin.org"))
+            .build();
+    } 
+
+    static class Hello {
+        String message;
+
+        public Hello() { }
+
+        public Hello(String message) {
+            this.message = message;
+        }
+
+        public String getMessage() {
+            return message;
+        }
+
+        public void setMessage(String message) {
+            this.message = message;
+        }
+    } 
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml b/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
new file mode 100644
index 0000000000..9b3ec64f96
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
@@ -0,0 +1,93 @@
+spring:
+  cloud:
+    gateway:
+      routes:
+      - id: request_header_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/get/**
+        filters:
+        - AddRequestHeader=My-Header-Good,Good
+        - AddRequestHeader=My-Header-Remove,Remove
+        - AddRequestParameter=var, good
+        - AddRequestParameter=var2, remove
+        - MapRequestHeader=My-Header-Good, My-Header-Bad
+        - MapRequestHeader=My-Header-Set, My-Header-Bad
+        - SetRequestHeader=My-Header-Set, Set 
+        - RemoveRequestHeader=My-Header-Remove
+        - RemoveRequestParameter=var2
+        - PreserveHostHeader
+        
+      - id: response_header_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/header/post/**
+        filters:
+        - AddResponseHeader=My-Header-Good,Good
+        - AddResponseHeader=My-Header-Set,Good
+        - AddResponseHeader=My-Header-Rewrite, password=12345678
+        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
+        - AddResponseHeader=My-Header-Remove,Remove
+        - SetResponseHeader=My-Header-Set, Set
+        - RemoveResponseHeader=My-Header-Remove
+        - RewriteResponseHeader=My-Header-Rewrite, password=[^&]+, password=***
+        - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
+        - StripPrefix=1
+        
+      - id: path_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/new/post/**
+        filters:
+        - RewritePath=/new(?<segment>/?.*), $\{segment}
+        - SetPath=/post
+        
+      - id: redirect_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/fake/post/**
+        filters:
+        - RedirectTo=302, https://httpbin.org
+        
+      - id: status_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/delete/**
+        filters:
+        - SetStatus=401
+        
+      - id: size_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/anything
+        filters:
+        - name: RequestSize
+          args:
+            maxSize: 5000000
+ 
+      - id: retry_test
+        uri: https://httpbin.org
+        predicates:
+        - Path=/status/502
+        filters:
+        - name: Retry
+          args:
+            retries: 3
+            statuses: BAD_GATEWAY
+            methods: GET,POST
+            backoff:
+              firstBackoff: 10ms
+              maxBackoff: 50ms
+              factor: 2
+              basedOnPreviousValue: false
+              
+      - id: circuitbreaker_route
+        uri: https://httpbin.org
+        predicates:
+        - Path=/status/504
+        filters:
+        - name: CircuitBreaker
+          args:
+            name: myCircuitBreaker
+            fallbackUri: forward:/anything
+        - RewritePath=/status/504, /anything
\ No newline at end of file

From b25323afb2891c5cdb19ac26161cb5b67558b2b6 Mon Sep 17 00:00:00 2001
From: Cavero Barca <carlos.cavero@atos.net>
Date: Tue, 21 Apr 2020 15:33:39 +0200
Subject: [PATCH 060/404] Add testing to the WebFilter Factories Spring Boot
 project

---
 .../WebFilterFactoriesLiveTest.java           | 139 ++++++++++++++++++
 1 file changed, 139 insertions(+)
 create mode 100644 spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java

diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
new file mode 100644
index 0000000000..3efd60fb27
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
@@ -0,0 +1,139 @@
+package com.baeldung.springcloudgateway.webfilters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.assertj.core.api.Condition;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("webfilters")
+public class WebFilterFactoriesLiveTest {
+
+    @LocalServerPort
+    String port;
+
+    @Autowired
+    private WebTestClient client;
+    
+    @Autowired
+    private TestRestTemplate restTemplate;
+
+    @BeforeEach
+    public void configureClient() {
+        client = WebTestClient.bindToServer()
+            .baseUrl("http://localhost:" + port)
+            .build();
+    }
+
+    @Test
+    public void whenCallGetThroughGateway_thenAllHTTPRequestHeadersParametersAreSet() throws JSONException {
+        String url = "http://localhost:" + port + "/get";        
+        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+        
+        JSONObject json = new JSONObject(response.getBody());
+        JSONObject headers = json.getJSONObject("headers");
+        assertThat(headers.getString("My-Header-Good")).isEqualTo("Good");
+        assertThat(headers.getString("My-Header-Bad")).isEqualTo("Good");
+        assertThat(headers.getString("My-Header-Set")).isEqualTo("Set");
+        assertTrue(headers.isNull("My-Header-Remove"));
+        JSONObject vars = json.getJSONObject("args");
+        assertThat(vars.getString("var")).isEqualTo("good");
+    }
+
+    @Test
+    public void whenCallHeaderPostThroughGateway_thenAllHTTPResponseHeadersAreSet() {
+        ResponseSpec response = client.post()
+            .uri("/header/post")
+            .exchange();
+
+        response.expectStatus()
+            .isOk()
+            .expectHeader()
+            .valueEquals("My-Header-Rewrite", "password=***")
+            .expectHeader()
+            .valueEquals("My-Header-Set", "Set")
+            .expectHeader()
+            .valueEquals("My-Header-Good", "Good")
+            .expectHeader()
+            .doesNotExist("My-Header-Remove");
+    }
+
+    @Test
+    public void whenCallPostThroughGateway_thenBodyIsRetrieved() throws JSONException {
+        String url = "http://localhost:" + port + "/post";        
+
+        HttpEntity<String> entity = new HttpEntity<>("content", new HttpHeaders());
+        
+        ResponseEntity<String> response = restTemplate.exchange(url, 
+            HttpMethod.POST, entity, String.class);
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+        
+        JSONObject json = new JSONObject(response.getBody());
+        JSONObject data = json.getJSONObject("json");
+        assertThat(data.getString("message")).isEqualTo("CONTENT");
+    }
+
+
+    @Test
+    public void whenCallPutThroughGateway_thenBodyIsRetrieved() throws JSONException {
+        String url = "http://localhost:" + port + "/put";        
+
+        HttpEntity<String> entity = new HttpEntity<>("CONTENT", new HttpHeaders());
+        
+        ResponseEntity<String> response = restTemplate.exchange(url, 
+            HttpMethod.PUT, entity, String.class);
+        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+        
+        JSONObject json = new JSONObject(response.getBody());
+        assertThat(json.getString("message")).isEqualTo("New Body");
+    }
+    
+    @Test
+    public void whenCallDeleteThroughGateway_thenIsUnauthorizedCodeIsSet() {
+        ResponseSpec response = client.delete()
+            .uri("/delete")
+            .exchange();
+
+        response.expectStatus()
+            .isUnauthorized();
+    }
+
+    @Test
+    public void whenCallFakePostThroughGateway_thenIsUnauthorizedCodeIsSet() {
+        ResponseSpec response = client.post()
+            .uri("/fake/post")
+            .exchange();
+
+        response.expectStatus()
+            .is3xxRedirection();
+    }
+
+    @Test
+    public void whenCallStatus504ThroughGateway_thenCircuitBreakerIsExecuted() throws JSONException {
+        String url = "http://localhost:" + port + "/status/504";        
+        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
+        
+        JSONObject json = new JSONObject(response.getBody());
+        assertThat(json.getString("url")).contains("anything");
+    }
+}

From 43852c4303b90e0ee4e11f15c7a52a1de1e7f8d8 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Tue, 21 Apr 2020 18:46:45 +0200
Subject: [PATCH 061/404] Moving com.baeldung.modelmmaper package to
 java-collections-conversations module

---
 java-collections-conversions-2/pom.xml        | 17 ++++
 .../com/baeldung/modelmapper}/MapperUtil.java |  9 +-
 .../java/com/baeldung/modelmapper}/User.java  |  6 +-
 .../com/baeldung/modelmapper}/UserDTO.java    | 13 +--
 .../com/baeldung/modelmapper}/UserList.java   |  5 +-
 .../com/baeldung/modelmapper/UserListDTO.java | 20 +++++
 .../modelmapper}/UserPropertyMap.java         | 12 ++-
 .../baeldung/modelmapper/UserMappingTest.java | 85 +++++++++++++++++++
 model-mapper/src/Main.java                    | 58 -------------
 parent-java/pom.xml                           |  3 +
 10 files changed, 140 insertions(+), 88 deletions(-)
 rename {model-mapper/src/com/baeldung/util => java-collections-conversions-2/src/main/java/com/baeldung/modelmapper}/MapperUtil.java (76%)
 rename {model-mapper/src/com/baeldung/model => java-collections-conversions-2/src/main/java/com/baeldung/modelmapper}/User.java (94%)
 rename {model-mapper/src/com/baeldung/model => java-collections-conversions-2/src/main/java/com/baeldung/modelmapper}/UserDTO.java (68%)
 rename {model-mapper/src/com/baeldung/model => java-collections-conversions-2/src/main/java/com/baeldung/modelmapper}/UserList.java (74%)
 create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
 rename {model-mapper/src/com/baeldung/util => java-collections-conversions-2/src/main/java/com/baeldung/modelmapper}/UserPropertyMap.java (68%)
 create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
 delete mode 100644 model-mapper/src/Main.java

diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml
index b04d764719..ca4ed882dd 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/java-collections-conversions-2/pom.xml
@@ -20,6 +20,23 @@
             <artifactId>commons-lang3</artifactId>
             <version>${commons-lang3.version}</version>
         </dependency>
+		<dependency>
+            <groupId>org.modelmapper</groupId>
+            <artifactId>modelmapper</artifactId>
+            <version>${modelmapper.version}</version>
+       </dependency>
+	   <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>  
+      </dependency>
+	  <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-all</artifactId>
+            <version>${hamcrest.version}</version>
+            <scope>test</scope>
+      </dependency>
     </dependencies>
 
     <build>
diff --git a/model-mapper/src/com/baeldung/util/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
similarity index 76%
rename from model-mapper/src/com/baeldung/util/MapperUtil.java
rename to java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
index fe10b7777d..c02f012126 100644
--- a/model-mapper/src/com/baeldung/util/MapperUtil.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
@@ -1,4 +1,4 @@
-package com.baeldung.util;
+package com.baeldung.modelmapper;
 
 import org.modelmapper.ModelMapper;
 import org.modelmapper.convention.MatchingStrategies;
@@ -8,7 +8,9 @@ import java.util.List;
 
 /**
  * @author sasam0320
- * @date 4/18/2020
+ * @description
+ * This is a helper class that contains methods for generic mapping of the users list.
+ * Initially, an instance of ModelMapper was created. In the static block we set the matching configuration to STRICT.
  */
 public class MapperUtil {
 
@@ -28,16 +30,13 @@ public class MapperUtil {
     }
 
     public static <S, T> T mapTo(final S source, final Class<T> target) {
-
         return modelMapper.map(source, target);
     }
 
     public static <S, T> List<T> mapList(final List<S> sourceList, final Class<T> target) {
-
         List<T> targetList = new ArrayList<T>();
 
         for (S source : sourceList) {
-
             targetList.add(modelMapper.map(source, target));
         }
 
diff --git a/model-mapper/src/com/baeldung/model/User.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
similarity index 94%
rename from model-mapper/src/com/baeldung/model/User.java
rename to java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
index 73e4baafb5..8f13b44894 100644
--- a/model-mapper/src/com/baeldung/model/User.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
@@ -1,10 +1,8 @@
-package com.baeldung.model;
-
-import java.util.List;
+package com.baeldung.modelmapper;
 
 /**
  * @author sasam0320
- * @date 4/18/2020
+ * @description User model entity class
  */
 public class User {
 
diff --git a/model-mapper/src/com/baeldung/model/UserDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
similarity index 68%
rename from model-mapper/src/com/baeldung/model/UserDTO.java
rename to java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
index ed056ace8c..ce75eecefc 100644
--- a/model-mapper/src/com/baeldung/model/UserDTO.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
@@ -1,17 +1,14 @@
-package com.baeldung.model;
-
-import java.util.List;
+package com.baeldung.modelmapper;
 
 /**
  * @author sasam0320
- * @date 4/18/2020
+ * @description UserDTO model class
  */
 public class UserDTO {
 
     private String userId;
     private String userName;
     private String email;
-    private List<String> usernames;
 
     // getters and setters
 
@@ -39,11 +36,5 @@ public class UserDTO {
         this.email = email;
     }
 
-    public List<String> getUsernames() {
-        return usernames;
-    }
 
-    public void setUsernames(List<String> usernames) {
-        this.usernames = usernames;
-    }
 }
diff --git a/model-mapper/src/com/baeldung/model/UserList.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
similarity index 74%
rename from model-mapper/src/com/baeldung/model/UserList.java
rename to java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
index b30d5507d5..02361da469 100644
--- a/model-mapper/src/com/baeldung/model/UserList.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
@@ -1,12 +1,11 @@
-package com.baeldung.model;
+package com.baeldung.modelmapper;
 
 import java.util.Collection;
 
 /**
  * @author sasam0320
- * @date 4/18/2020
+ * @description UserList class that contain collection of users
  */
-
 public class UserList {
 
     private Collection<User> users;
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
new file mode 100644
index 0000000000..fba311c1a3
--- /dev/null
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
@@ -0,0 +1,20 @@
+package com.baeldung.modelmapper;
+
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @description UserListDTO class that contain list of username properties
+ */
+public class UserListDTO {
+
+    private List<String> usernames;
+
+    public List<String> getUsernames() {
+        return usernames;
+    }
+
+    public void setUsernames(List<String> usernames) {
+        this.usernames = usernames;
+    }
+}
diff --git a/model-mapper/src/com/baeldung/util/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
similarity index 68%
rename from model-mapper/src/com/baeldung/util/UserPropertyMap.java
rename to java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 4346174440..9fa945ce32 100644
--- a/model-mapper/src/com/baeldung/util/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -1,8 +1,5 @@
-package com.baeldung.util;
+package com.baeldung.modelmapper;
 
-import com.baeldung.model.User;
-import com.baeldung.model.UserDTO;
-import com.baeldung.model.UserList;
 import org.modelmapper.AbstractConverter;
 import org.modelmapper.Converter;
 import org.modelmapper.PropertyMap;
@@ -11,10 +8,11 @@ import java.util.List;
 
 /**
  * @author sasam0320
- * @date 4/18/2020
+ * @description
+ * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
+ * In the configuration method, we call a converter to do the mapping.
  */
-
-public class UserPropertyMap extends PropertyMap<UserList, UserDTO> {
+public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
 
     Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
new file mode 100644
index 0000000000..44a929621b
--- /dev/null
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.modelmapper;
+
+import org.hamcrest.Matchers;
+import org.junit.Before;
+import org.junit.Test;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+
+/**
+ * @sasam0320
+ * @description
+ * This class has test methods of mapping Integer to Character list,
+ * mapping user list to DTO list using MapperUtil generic methods and Converter
+ */
+public class UserMappingTest {
+
+    private ModelMapper mapper;
+    private List<User> users;
+
+    @Before
+    public void init() {
+
+        mapper = new ModelMapper();
+        mapper.addMappings(new UserPropertyMap());
+        users = new ArrayList();
+        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
+        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
+        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
+
+    }
+
+    @Test
+    public void testMapIntegerList() {
+
+        List<Integer> integers = new ArrayList<Integer>();
+
+        integers.add(1);
+        integers.add(2);
+        integers.add(3);
+
+        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {
+        }.getType());
+
+        assertThat(characters, hasItems('1','2','3'));
+
+    }
+
+    @Test
+    public void testMapGenericTypeLists() {
+
+        // Mapping lists using generic type methods
+
+        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
+
+        assertThat(userDtoList, Matchers.<UserDTO>hasItem(
+                Matchers.both(hasProperty("userId", equalTo("b100")))
+                        .and(hasProperty("email", equalTo("user1@baeldung.com")))
+                        .and(hasProperty("userName", equalTo("user1")))));
+
+        // Mapping lists using PropertyMap and Converter
+
+        UserList userList = new UserList();
+        userList.setUsers(users);
+        UserListDTO dto = new UserListDTO();
+        mapper.map(userList, dto);
+
+        assertNotNull(dto);
+        assertThat(dto, Matchers.hasProperty("usernames"));
+        assertThat(dto.getUsernames(), hasSize(3));
+
+    }
+
+}
\ No newline at end of file
diff --git a/model-mapper/src/Main.java b/model-mapper/src/Main.java
deleted file mode 100644
index a6deb49168..0000000000
--- a/model-mapper/src/Main.java
+++ /dev/null
@@ -1,58 +0,0 @@
-import com.baeldung.model.User;
-import com.baeldung.model.UserDTO;
-import com.baeldung.model.UserList;
-import com.baeldung.util.MapperUtil;
-import com.baeldung.util.UserPropertyMap;
-import org.modelmapper.ModelMapper;
-import org.modelmapper.TypeToken;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author sasam0320
- * @date 4/18/2020
- */
-
-public class Main {
-
-    public static void main(String[] args) {
-
-        //Instantiate ModelMapper
-
-        ModelMapper mapper = new ModelMapper();
-        mapper.addMappings(new UserPropertyMap());
-
-        // Mapping lists using TypeToken generic class
-
-        List<Integer> integers = new ArrayList<Integer>();
-
-        integers.add(1);
-        integers.add(2);
-        integers.add(3);
-
-        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {}.getType());
-
-        System.out.println("Character list: " + characters);
-
-        // Mapping lists using generic type methods
-
-        List<User> users = new ArrayList();
-        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
-        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
-        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
-
-        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
-        userDtoList.stream().map(userDto -> userDto.getEmail()).forEachOrdered(System.out::println);
-
-        // Mapping lists using PropertyMap and Converter
-
-        UserList userList = new UserList();
-        userList.setUsers(users);
-        UserDTO dto = new UserDTO();
-
-        mapper.map(userList, dto);
-        dto.getUsernames().forEach(System.out::println);
-
-    }
-}
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index 4828bc2abb..ba786d912c 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -45,6 +45,9 @@
         <guava.version>23.0</guava.version>
         <commons.io.version>2.6</commons.io.version>
         <jmh.version>1.19</jmh.version>
+		<modelmapper.version>2.3.6</modelmapper.version>
+		<junit.version>4.12</junit.version>
+		<hamcrest.version>1.3</hamcrest.version>
     </properties>
 
 </project>

From d1b282220d4c4671343424b5737312a25dd2e2b1 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Tue, 21 Apr 2020 21:29:38 +0200
Subject: [PATCH 062/404] Renaming test methods and formatting

---
 java-collections-conversions-2/pom.xml             | 14 +++++++-------
 .../java/com/baeldung/modelmapper/MapperUtil.java  |  4 ++--
 .../main/java/com/baeldung/modelmapper/User.java   |  2 +-
 .../java/com/baeldung/modelmapper/UserDTO.java     |  2 +-
 .../java/com/baeldung/modelmapper/UserList.java    |  2 +-
 .../java/com/baeldung/modelmapper/UserListDTO.java |  2 +-
 .../com/baeldung/modelmapper/UserPropertyMap.java  |  3 +--
 ...pingTest.java => UsersListMappingUnitTest.java} | 13 ++++++-------
 parent-java/pom.xml                                | 12 ++++++------
 9 files changed, 26 insertions(+), 28 deletions(-)
 rename java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/{UserMappingTest.java => UsersListMappingUnitTest.java} (90%)

diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml
index ca4ed882dd..892d73cb2b 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/java-collections-conversions-2/pom.xml
@@ -20,23 +20,23 @@
             <artifactId>commons-lang3</artifactId>
             <version>${commons-lang3.version}</version>
         </dependency>
-		<dependency>
+        <dependency>
             <groupId>org.modelmapper</groupId>
             <artifactId>modelmapper</artifactId>
             <version>${modelmapper.version}</version>
-       </dependency>
-	   <dependency>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>${junit.version}</version>
-            <scope>test</scope>  
-      </dependency>
-	  <dependency>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>hamcrest-all</artifactId>
             <version>${hamcrest.version}</version>
             <scope>test</scope>
-      </dependency>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
index c02f012126..bbc2153c63 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
@@ -7,10 +7,10 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * @author sasam0320
- * @description
  * This is a helper class that contains methods for generic mapping of the users list.
  * Initially, an instance of ModelMapper was created. In the static block we set the matching configuration to STRICT.
+ *
+ * @author sasam0320
  */
 public class MapperUtil {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
index 8f13b44894..7fe22fb262 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
@@ -1,8 +1,8 @@
 package com.baeldung.modelmapper;
 
 /**
+ * User model entity class
  * @author sasam0320
- * @description User model entity class
  */
 public class User {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
index ce75eecefc..d36b829232 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
@@ -1,8 +1,8 @@
 package com.baeldung.modelmapper;
 
 /**
+ * UserDTO model class
  * @author sasam0320
- * @description UserDTO model class
  */
 public class UserDTO {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
index 02361da469..7c410727fd 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
@@ -3,8 +3,8 @@ package com.baeldung.modelmapper;
 import java.util.Collection;
 
 /**
+ * UserList class that contain collection of users
  * @author sasam0320
- * @description UserList class that contain collection of users
  */
 public class UserList {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
index fba311c1a3..ac25185635 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
@@ -3,8 +3,8 @@ package com.baeldung.modelmapper;
 import java.util.List;
 
 /**
+ * UserListDTO class that contain list of username properties
  * @author sasam0320
- * @description UserListDTO class that contain list of username properties
  */
 public class UserListDTO {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 9fa945ce32..3d9059c520 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -7,10 +7,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * @author sasam0320
- * @description
  * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
  * In the configuration method, we call a converter to do the mapping.
+ * @author sasam0320
  */
 public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
similarity index 90%
rename from java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
rename to java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
index 44a929621b..e03ddf81cf 100644
--- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
@@ -13,18 +13,17 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasItems;
 import static org.hamcrest.Matchers.hasProperty;
 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
 
 /**
- * @sasam0320
- * @description
  * This class has test methods of mapping Integer to Character list,
  * mapping user list to DTO list using MapperUtil generic methods and Converter
+ *
+ * @author sasam0320
  */
-public class UserMappingTest {
+public class UsersListMappingUnitTest {
 
     private ModelMapper mapper;
     private List<User> users;
@@ -42,7 +41,7 @@ public class UserMappingTest {
     }
 
     @Test
-    public void testMapIntegerList() {
+    public void whenMapIntegerToCharList() {
 
         List<Integer> integers = new ArrayList<Integer>();
 
@@ -53,12 +52,12 @@ public class UserMappingTest {
         List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {
         }.getType());
 
-        assertThat(characters, hasItems('1','2','3'));
+        assertThat(characters, hasItems('1', '2', '3'));
 
     }
 
     @Test
-    public void testMapGenericTypeLists() {
+    public void givenUsersList_whenUseGenericType_thenMapToDto() {
 
         // Mapping lists using generic type methods
 
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index ba786d912c..5c347ef176 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns="http://maven.apache.org/POM/4.0.0"
+        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>parent-java</artifactId>
     <version>0.0.1-SNAPSHOT</version>
@@ -45,9 +45,9 @@
         <guava.version>23.0</guava.version>
         <commons.io.version>2.6</commons.io.version>
         <jmh.version>1.19</jmh.version>
-		<modelmapper.version>2.3.6</modelmapper.version>
-		<junit.version>4.12</junit.version>
-		<hamcrest.version>1.3</hamcrest.version>
+        <modelmapper.version>2.3.6</modelmapper.version>
+        <junit.version>4.12</junit.version>
+        <hamcrest.version>1.3</hamcrest.version>
     </properties>
 
 </project>

From 32d1cc8a13f87217f906dabcc68afbf47fe466fe Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Tue, 21 Apr 2020 22:26:22 +0200
Subject: [PATCH 063/404] changes in build pom.xml

---
 .../src/main/java/com/baeldung/modelmapper/MapperUtil.java  | 2 +-
 .../src/main/java/com/baeldung/modelmapper/User.java        | 6 ++++--
 .../src/main/java/com/baeldung/modelmapper/UserDTO.java     | 3 ++-
 .../src/main/java/com/baeldung/modelmapper/UserList.java    | 3 ++-
 .../src/main/java/com/baeldung/modelmapper/UserListDTO.java | 3 ++-
 .../main/java/com/baeldung/modelmapper/UserPropertyMap.java | 4 +++-
 .../com/baeldung/modelmapper/UsersListMappingUnitTest.java  | 2 +-
 parent-java/pom.xml                                         | 2 +-
 8 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
index bbc2153c63..546e415755 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
@@ -10,7 +10,7 @@ import java.util.List;
  * This is a helper class that contains methods for generic mapping of the users list.
  * Initially, an instance of ModelMapper was created. In the static block we set the matching configuration to STRICT.
  *
- * @author sasam0320
+ * @author Sasa Milenkovic
  */
 public class MapperUtil {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
index 7fe22fb262..23a424dedd 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
@@ -2,7 +2,8 @@ package com.baeldung.modelmapper;
 
 /**
  * User model entity class
- * @author sasam0320
+ *
+ * @author Sasa Milenkovic
  */
 public class User {
 
@@ -14,7 +15,8 @@ public class User {
 
     // Standard constructors, getters and setters
 
-    public User(){}
+    public User() {
+    }
 
     public User(String userId, String userName, String email, String contactNumber, String userType) {
         this.userId = userId;
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
index d36b829232..e31414b629 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
@@ -2,7 +2,8 @@ package com.baeldung.modelmapper;
 
 /**
  * UserDTO model class
- * @author sasam0320
+ *
+ * @author Sasa Milenkovic
  */
 public class UserDTO {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
index 7c410727fd..7b6bed807b 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
@@ -4,7 +4,8 @@ import java.util.Collection;
 
 /**
  * UserList class that contain collection of users
- * @author sasam0320
+ *
+ * @author Sasa Milenkovic
  */
 public class UserList {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
index ac25185635..c001cbbc3c 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
@@ -4,7 +4,8 @@ import java.util.List;
 
 /**
  * UserListDTO class that contain list of username properties
- * @author sasam0320
+ *
+ * @author Sasa Milenkovic
  */
 public class UserListDTO {
 
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 3d9059c520..d2c32a307d 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -3,13 +3,15 @@ package com.baeldung.modelmapper;
 import org.modelmapper.AbstractConverter;
 import org.modelmapper.Converter;
 import org.modelmapper.PropertyMap;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
  * In the configuration method, we call a converter to do the mapping.
- * @author sasam0320
+ *
+ * @author Sasa Milenkovic
  */
 public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
index e03ddf81cf..05792fda38 100644
--- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertThat;
  * This class has test methods of mapping Integer to Character list,
  * mapping user list to DTO list using MapperUtil generic methods and Converter
  *
- * @author sasam0320
+ * @author Sasa Milenkovic
  */
 public class UsersListMappingUnitTest {
 
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index 5c347ef176..3b2b5f59de 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -45,7 +45,7 @@
         <guava.version>23.0</guava.version>
         <commons.io.version>2.6</commons.io.version>
         <jmh.version>1.19</jmh.version>
-        <modelmapper.version>2.3.6</modelmapper.version>
+        <modelmapper.version>2.3.7</modelmapper.version>
         <junit.version>4.12</junit.version>
         <hamcrest.version>1.3</hamcrest.version>
     </properties>

From 8b6c667ce058c09870c0784627fdf831a2dfe912 Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Wed, 22 Apr 2020 21:10:52 -0400
Subject: [PATCH 064/404] Bael-3893 AWS AppSync with Spring Boot

---
 aws-app-sync/pom.xml                          |  6 --
 .../awsappsync/AppSyncClientHelper.java       | 32 ++++++++++
 .../AwsAppSyncApplicationTests.java           | 63 ++-----------------
 3 files changed, 38 insertions(+), 63 deletions(-)
 create mode 100644 aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java

diff --git a/aws-app-sync/pom.xml b/aws-app-sync/pom.xml
index d30cfc96a4..ef2085ff35 100644
--- a/aws-app-sync/pom.xml
+++ b/aws-app-sync/pom.xml
@@ -22,12 +22,6 @@
 
 	<dependencies>
 
-		<dependency>
-			<groupId>com.amazonaws</groupId>
-			<artifactId>aws-java-sdk-appsync</artifactId>
-			<version>1.11.762</version>
-		</dependency>
-
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
new file mode 100644
index 0000000000..fcbc0aa275
--- /dev/null
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
@@ -0,0 +1,32 @@
+package com.baeldung.awsappsync;
+
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+public class AppSyncClientHelper {
+
+    static String apiUrl = "https://m4i3b6icrrb7livfbypfspiifi.appsync-api.us-east-2.amazonaws.com";
+    static String apiKey = "da2-es2s6oj4mzhbxk5yu26ss2ruj4";
+    static String API_KEY_HEADER = "x-api-key";
+
+    public static WebClient.ResponseSpec getResponseBodySpec(Map<String, Object> requestBody) {
+        return WebClient
+                .builder()
+                .baseUrl(apiUrl)
+                .defaultHeader(API_KEY_HEADER, apiKey)
+                .defaultHeader("Content-Type", "application/json")
+                .build()
+                .method(HttpMethod.POST)
+                .uri("/graphql")
+                .body(BodyInserters.fromValue(requestBody))
+                .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
+                .acceptCharset(StandardCharsets.UTF_8)
+                .retrieve();
+    }
+
+}
diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
index 005d533cbf..cd14bcd5b2 100644
--- a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -1,14 +1,9 @@
 package com.baeldung.awsappsync;
 
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.MediaType;
-import org.springframework.web.reactive.function.BodyInserters;
 import org.springframework.web.reactive.function.client.WebClient;
 
-import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -17,48 +12,16 @@ import static org.junit.jupiter.api.Assertions.*;
 @SpringBootTest
 class AwsAppSyncApplicationTests {
 
-	static String apiUrl = "https://m4i3b6icrrb7livfbypfspiifi.appsync-api.us-east-2.amazonaws.com";
-	static String apiKey = "da2-es2s6oj4mzhbxk5yu26ss2ruj4";
-	static String API_KEY_HEADER = "x-api-key";
-
-	static WebClient.RequestBodySpec requestBodySpec;
-
-	@BeforeAll
-	static void setUp() {
-		requestBodySpec = WebClient
-				.builder()
-				.baseUrl(apiUrl)
-				.defaultHeader(API_KEY_HEADER, apiKey)
-				.build()
-				.method(HttpMethod.POST)
-				.uri("/graphql");
-	}
-
 	@Test
 	void givenGraphQuery_whenListEvents_thenReturnAllEvents() {
 
 		Map<String, Object> requestBody = new HashMap<>();
-		requestBody.put("query", "query ListEvents {\n" +
-				"  listEvents {\n" +
-				"    items {\n" +
-				"      id\n" +
-				"      name\n" +
-				"      where\n" +
-				"      when\n" +
-				"      description\n" +
-				"    }\n" +
-				"  }\n" +
-				"}");
+		requestBody.put("query", "query ListEvents { listEvents { items { id name where when description } } }");
 		requestBody.put("variables", "");
 		requestBody.put("operationName", "ListEvents");
 
-		WebClient.ResponseSpec response = requestBodySpec
-				.body(BodyInserters.fromValue(requestBody))
-				.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
-				.acceptCharset(StandardCharsets.UTF_8)
-				.retrieve();
-
-		String bodyString = response.bodyToMono(String.class).block();
+		String bodyString = AppSyncClientHelper.getResponseBodySpec(requestBody)
+				.bodyToMono(String.class).block();
 
 		assertNotNull(bodyString);
 		assertTrue(bodyString.contains("My First Event"));
@@ -69,18 +32,8 @@ class AwsAppSyncApplicationTests {
 	@Test
 	void givenGraphAdd_whenMutation_thenReturnIdNameDesc() {
 
-		String queryString = "mutation add {\n" +
-				"    createEvent(\n" +
-				"        name:\"My added GraphQL event\"\n" +
-				"        where:\"Day 2\"\n" +
-				"        when:\"Saturday night\"\n" +
-				"        description:\"Studying GraphQL\"\n" +
-				"    ){\n" +
-				"        id\n" +
-				"        name\n" +
-				"        description\n" +
-				"    }\n" +
-				"}";
+		String queryString = "mutation add { createEvent( name:\"My added GraphQL event\" where:\"Day 2\"" +
+						" when:\"Saturday night\" description:\"Studying GraphQL\" ){ id name description } }";
 
 
 		Map<String, Object> requestBody = new HashMap<>();
@@ -88,11 +41,7 @@ class AwsAppSyncApplicationTests {
 		requestBody.put("variables", "");
 		requestBody.put("operationName", "add");
 
-		WebClient.ResponseSpec response = requestBodySpec
-				.body(BodyInserters.fromValue(requestBody))
-				.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
-				.acceptCharset(StandardCharsets.UTF_8)
-				.retrieve();
+		WebClient.ResponseSpec response = AppSyncClientHelper.getResponseBodySpec(requestBody);
 
 		String bodyString = response.bodyToMono(String.class).block();
 

From acf4fa5af9ad36f7273c11ee4be36dbe95434056 Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Thu, 23 Apr 2020 22:18:45 +0200
Subject: [PATCH 065/404] JAVA-73: Move scripts under live-test-resources

---
 persistence-modules/spring-data-mongodb/LIVE-TEST.md     | 9 ---------
 persistence-modules/spring-data-mongodb/README.md        | 9 +++++++++
 .../{ => src/live-test/resources}/live-test-setup.sh     | 2 +-
 .../{ => src/live-test/resources}/live-test-teardown.sh  | 0
 .../{ => src/live-test/resources}/live-test.sh           | 0
 5 files changed, 10 insertions(+), 10 deletions(-)
 delete mode 100644 persistence-modules/spring-data-mongodb/LIVE-TEST.md
 rename persistence-modules/spring-data-mongodb/{ => src/live-test/resources}/live-test-setup.sh (58%)
 rename persistence-modules/spring-data-mongodb/{ => src/live-test/resources}/live-test-teardown.sh (100%)
 rename persistence-modules/spring-data-mongodb/{ => src/live-test/resources}/live-test.sh (100%)
 mode change 100755 => 100644

diff --git a/persistence-modules/spring-data-mongodb/LIVE-TEST.md b/persistence-modules/spring-data-mongodb/LIVE-TEST.md
deleted file mode 100644
index 9da1ea249e..0000000000
--- a/persistence-modules/spring-data-mongodb/LIVE-TEST.md
+++ /dev/null
@@ -1,9 +0,0 @@
-=========
-
-## Spring Data MongoDB Live Testing
-
-
-There are 3 scripts to simplify running live tests:
-1. `live-test-setup.sh` builds a docker image with the necessary setup and runs it. The environment is ready, when the log stops - it takes approximately 30 seconds.
-2. `live-test.sh` runs the live tests (but no other tests).
-3. `live-test-setup.sh` stops and removes the docker image.
diff --git a/persistence-modules/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md
index c4f21dffc0..381bf83fa8 100644
--- a/persistence-modules/spring-data-mongodb/README.md
+++ b/persistence-modules/spring-data-mongodb/README.md
@@ -13,3 +13,12 @@
 - [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
 - [Spring Data MongoDB Transactions](https://www.baeldung.com/spring-data-mongodb-transactions )
 - [ZonedDateTime with Spring Data MongoDB](https://www.baeldung.com/spring-data-mongodb-zoneddatetime)
+
+
+## Spring Data MongoDB Live Testing
+
+
+There are 3 scripts to simplify running live tests:
+1. [`live-test-setup.sh`](src/live-test/resources/live-test-setup.sh) builds a docker image with the necessary setup and runs it. The environment is ready, when the log stops - it takes approximately 30 seconds.
+2. [`live-test.sh`](src/live-test/resources/live-test.sh) runs the live tests (but no other tests).
+3. [`live-test-teardown.sh`](src/live-test/resources/live-test-teardown.sh) stops and removes the docker image.
diff --git a/persistence-modules/spring-data-mongodb/live-test-setup.sh b/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test-setup.sh
similarity index 58%
rename from persistence-modules/spring-data-mongodb/live-test-setup.sh
rename to persistence-modules/spring-data-mongodb/src/live-test/resources/live-test-setup.sh
index e8e0437083..78968d51aa 100644
--- a/persistence-modules/spring-data-mongodb/live-test-setup.sh
+++ b/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test-setup.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
 
-docker image build -t spring-data-mongodb:live-test src/live-test/resources/
+docker image build -t spring-data-mongodb:live-test .
 
 docker run -p 27017:27017 --name spring-data-mongodb-live-test spring-data-mongodb:live-test
diff --git a/persistence-modules/spring-data-mongodb/live-test-teardown.sh b/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test-teardown.sh
similarity index 100%
rename from persistence-modules/spring-data-mongodb/live-test-teardown.sh
rename to persistence-modules/spring-data-mongodb/src/live-test/resources/live-test-teardown.sh
diff --git a/persistence-modules/spring-data-mongodb/live-test.sh b/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test.sh
old mode 100755
new mode 100644
similarity index 100%
rename from persistence-modules/spring-data-mongodb/live-test.sh
rename to persistence-modules/spring-data-mongodb/src/live-test/resources/live-test.sh

From ffa8e0839df894019e1b3cc501728c9c0f5d9aa6 Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Thu, 23 Apr 2020 22:38:10 +0200
Subject: [PATCH 066/404] JAVA-73: Fix live-test.sh and cleanup pom.xml

---
 .../spring-data-mongodb/src/live-test/resources/live-test.sh | 2 +-
 pom.xml                                                      | 5 +----
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test.sh b/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test.sh
index 5a079bdac8..307a68a3bd 100644
--- a/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test.sh
+++ b/persistence-modules/spring-data-mongodb/src/live-test/resources/live-test.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
 
-mvn clean compile test -P live-all
+mvn clean compile test -P live-all -f ../../../pom.xml
diff --git a/pom.xml b/pom.xml
index f94c89a5c0..314a6a9f43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1341,10 +1341,7 @@
                     
                 </plugins>
             </build>
-            
-            <!-- <modules> -->
-                <!-- <module>persistence-modules</module> -->
-            <!-- </modules> -->
+
 
         </profile>
 

From 5bb2977eb063a73c81dd7fc99cc2c6ecefdc1c32 Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Fri, 24 Apr 2020 13:03:41 +0200
Subject: [PATCH 067/404] [BAEL-3944] Move to a separate test class and fix
 other issues

---
 .../regex/PhoneNumbersRegexUnitTest.java      | 55 +++++++++++++++++++
 .../com/baeldung/regex/RegexUnitTest.java     | 49 -----------------
 2 files changed, 55 insertions(+), 49 deletions(-)
 create mode 100644 core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
new file mode 100644
index 0000000000..edfa7a2c5e
--- /dev/null
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.regex;
+
+import static org.junit.Assert.*;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+public class PhoneNumbersRegexUnitTest {
+
+    @Test
+    public void whenMatchesTenDigitsNumber_thenCorrect() {
+        Pattern pattern = Pattern.compile("^\\d{10}$");
+        Matcher matcher = pattern.matcher("1234567890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesTenDigitsNumberWhitespacesHyphen_thenCorrect() {
+        Pattern pattern = Pattern.compile("^(\\d{3}[- ]?){2}\\d{4}$");
+        Matcher matcher = pattern.matcher("123 456 7890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
+        Pattern pattern = Pattern.compile("^\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
+        Matcher matcher = pattern.matcher("(123)-456-7890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
+        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
+        Matcher matcher = pattern.matcher("+111 (123)-456-7890");
+        assertTrue(matcher.matches());
+    }
+    
+    @Test
+    public void whenMatchesPhoneNumber_thenCorrect() {
+        String patterns = "^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$" + 
+                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + 
+                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
+        
+        String[] validPhoneNumbers = {"1234567890","123 456 7890", "(123)-456-7890", "+111 (123)-456-7890",
+                                      "123 456 789", "+111 123 456 789", "123 45 67 89", "+111 123 45 67 89"};
+        
+        Pattern pattern = Pattern.compile(patterns);
+        for(String phoneNumber : validPhoneNumbers) {
+            Matcher matcher = pattern.matcher(phoneNumber);
+            assertTrue(matcher.matches());
+        }
+    }
+}
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
index 909894ec55..77052b79ac 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
@@ -26,7 +26,6 @@ public class RegexUnitTest {
         while (matcher.find())
             matches++;
         assertEquals(matches, 2);
-
     }
 
     @Test
@@ -452,7 +451,6 @@ public class RegexUnitTest {
         Matcher matcher = pattern.matcher("dogs are friendly");
         assertTrue(matcher.lookingAt());
         assertFalse(matcher.matches());
-
     }
 
     @Test
@@ -460,7 +458,6 @@ public class RegexUnitTest {
         Pattern pattern = Pattern.compile("dog");
         Matcher matcher = pattern.matcher("dog");
         assertTrue(matcher.matches());
-
     }
 
     @Test
@@ -469,7 +466,6 @@ public class RegexUnitTest {
         Matcher matcher = pattern.matcher("dogs are domestic animals, dogs are friendly");
         String newStr = matcher.replaceFirst("cat");
         assertEquals("cats are domestic animals, dogs are friendly", newStr);
-
     }
 
     @Test
@@ -478,51 +474,6 @@ public class RegexUnitTest {
         Matcher matcher = pattern.matcher("dogs are domestic animals, dogs are friendly");
         String newStr = matcher.replaceAll("cat");
         assertEquals("cats are domestic animals, cats are friendly", newStr);
-
-    }
-
-    @Test
-    public void whenMatchesTenDigitsNumber_thenCorrect() {
-        Pattern pattern = Pattern.compile("^\\d{10}$");
-        Matcher matcher = pattern.matcher("1234567890");
-        assertTrue(matcher.matches());
-    }
-    
-    @Test
-    public void whenMatchesTenDigitsNumberWhitespacesHyphen_thenCorrect() {
-        Pattern pattern = Pattern.compile("^(\\d{3}[- ]?){2}\\d{4}$");
-        Matcher matcher = pattern.matcher("123 456 7890");
-        assertTrue(matcher.matches());
-    }
-    
-    @Test
-    public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
-        Pattern pattern = Pattern.compile("^\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
-        Matcher matcher = pattern.matcher("(123)-456-7890");
-        assertTrue(matcher.matches());
-    }
-    
-    @Test
-    public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
-        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
-        Matcher matcher = pattern.matcher("+111 (123)-456-7890");
-        assertTrue(matcher.matches());
-    }
-    
-    @Test
-    public void whenMatchesPhoneNumber_thenCorrect() {
-        String patterns = "^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$" + 
-                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + 
-                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
-        
-        String[] validPhoneNumbers = {"1234567890","123 456 7890", "(123)-456-7890", "+111 (123)-456-7890",
-                                      "123 456 789", "+111 123 456 789", "123 45 67 89", "+111 123 45 67 89"};
-        
-        Pattern pattern = Pattern.compile(patterns);
-        for(String phoneNumber : validPhoneNumbers) {
-            Matcher matcher = pattern.matcher(phoneNumber);
-            assertTrue(matcher.matches());
-        }
     }
 
     public synchronized static int runTest(String regex, String text) {

From 953b8d4640900045433599e8148d92990b8835a0 Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Fri, 24 Apr 2020 13:07:05 +0200
Subject: [PATCH 068/404] [BAEL-3944] Real like phone numbers

---
 .../baeldung/regex/PhoneNumbersRegexUnitTest.java    | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
index edfa7a2c5e..620b7a9bae 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
@@ -12,28 +12,28 @@ public class PhoneNumbersRegexUnitTest {
     @Test
     public void whenMatchesTenDigitsNumber_thenCorrect() {
         Pattern pattern = Pattern.compile("^\\d{10}$");
-        Matcher matcher = pattern.matcher("1234567890");
+        Matcher matcher = pattern.matcher("2055550125");
         assertTrue(matcher.matches());
     }
     
     @Test
     public void whenMatchesTenDigitsNumberWhitespacesHyphen_thenCorrect() {
         Pattern pattern = Pattern.compile("^(\\d{3}[- ]?){2}\\d{4}$");
-        Matcher matcher = pattern.matcher("123 456 7890");
+        Matcher matcher = pattern.matcher("202 555 0125");
         assertTrue(matcher.matches());
     }
     
     @Test
     public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
         Pattern pattern = Pattern.compile("^\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
-        Matcher matcher = pattern.matcher("(123)-456-7890");
+        Matcher matcher = pattern.matcher("(202)-555-0125");
         assertTrue(matcher.matches());
     }
     
     @Test
     public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
         Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
-        Matcher matcher = pattern.matcher("+111 (123)-456-7890");
+        Matcher matcher = pattern.matcher("+111 (202)-555-0125");
         assertTrue(matcher.matches());
     }
     
@@ -43,8 +43,8 @@ public class PhoneNumbersRegexUnitTest {
                          "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + 
                          "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
         
-        String[] validPhoneNumbers = {"1234567890","123 456 7890", "(123)-456-7890", "+111 (123)-456-7890",
-                                      "123 456 789", "+111 123 456 789", "123 45 67 89", "+111 123 45 67 89"};
+        String[] validPhoneNumbers = {"2055550125","202 555 0125", "(202)-555-0125", "+111 (202)-555-0125",
+                                      "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};
         
         Pattern pattern = Pattern.compile(patterns);
         for(String phoneNumber : validPhoneNumbers) {

From 6a08fca7aae349c4219809e8caa25e7ec42ca64a Mon Sep 17 00:00:00 2001
From: kkaravitis <kkaravitis@gmail.com>
Date: Fri, 24 Apr 2020 15:04:44 +0300
Subject: [PATCH 069/404] [BAEL-3936] Fixed format to use 2-space indenting for
 line continuations.

---
 .../unrelated/entities/MultipleRecipe.java    |   9 +-
 .../jpa/unrelated/entities/Recipe.java        |  10 +-
 .../entities/UnrelatedEntitiesUnitTest.java   | 117 +++++++++---------
 3 files changed, 70 insertions(+), 66 deletions(-)

diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
index d628af1eaf..8664d6fd7f 100644
--- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/MultipleRecipe.java
@@ -56,15 +56,16 @@ public class MultipleRecipe {
         if (o == null || getClass() != o.getClass())
             return false;
         MultipleRecipe that = (MultipleRecipe) o;
+        
         return Objects.equals(id, that.id) && 
-            Objects.equals(cocktail, that.cocktail) && 
-            Objects.equals(instructions, that.instructions) && 
-            Objects.equals(baseIngredient, that.baseIngredient);
+          Objects.equals(cocktail, that.cocktail) && 
+          Objects.equals(instructions, that.instructions) && 
+          Objects.equals(baseIngredient, that.baseIngredient);
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(id, cocktail, 
-            instructions, baseIngredient);
+          instructions, baseIngredient);
     }
 }
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java
index 585c6abec3..4b3d200b60 100644
--- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/unrelated/entities/Recipe.java
@@ -34,11 +34,13 @@ public class Recipe {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
         Recipe recipe = (Recipe) o;
-        return Objects.equals(cocktail, recipe.cocktail) &&
-                Objects.equals(instructions, recipe.instructions);
+        return Objects.equals(cocktail, recipe.cocktail) 
+          && Objects.equals(instructions, recipe.instructions);
     }
 
     @Override
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
index 569b093db6..044e59b16e 100644
--- a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/unrelated/entities/UnrelatedEntitiesUnitTest.java
@@ -27,9 +27,9 @@ public class UnrelatedEntitiesUnitTest {
         entityManager.persist(ginTonic);
         entityManager.persist(new Recipe(mojito.getName(), "Some instructions"));
         entityManager.persist(new MultipleRecipe(1L, mojito.getName(), 
-            "some instructions", mojito.getCategory()));
+          "some instructions", mojito.getCategory()));
         entityManager.persist(new MultipleRecipe(2L, mojito.getName(), 
-            "some other instructions", mojito.getCategory()));
+          "some other instructions", mojito.getCategory()));
         entityManager.getTransaction().commit();
     }
 
@@ -43,56 +43,56 @@ public class UnrelatedEntitiesUnitTest {
     public void givenCocktailsWithRecipe_whenQuerying_thenTheExpectedCocktailsReturned() {
         // JPA
         Cocktail cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c join c.recipe", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c join c.recipe", Cocktail.class)
+          .getSingleResult();
         verifyResult(mojito, cocktail);
 
         cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c join Recipe r "
-            + "on c.name = r.cocktail", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c join Recipe r "
+          + "on c.name = r.cocktail", Cocktail.class)
+          .getSingleResult();
         verifyResult(mojito, cocktail);
 
         // QueryDSL
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .join(QCocktail.cocktail.recipe)
-            .fetchOne();
+          .join(QCocktail.cocktail.recipe)
+          .fetchOne();
         verifyResult(mojito, cocktail);
 
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .join(QRecipe.recipe)
-            .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
-            .fetchOne();
+          .join(QRecipe.recipe)
+          .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
+          .fetchOne();
         verifyResult(mojito, cocktail);
     }
 
     @Test
     public void givenCocktailsWithoutRecipe_whenQuerying_thenTheExpectedCocktailsReturned() {
         Cocktail cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c left join c.recipe r " 
-            + "where r is null", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c left join c.recipe r " 
+          + "where r is null", Cocktail.class)
+          .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
         cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c left join Recipe r " 
-            + "on c.name = r.cocktail " 
-            + "where r is null", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c left join Recipe r " 
+          + "on c.name = r.cocktail " 
+          + "where r is null", Cocktail.class)
+          .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
         QRecipe recipe = new QRecipe("alias");
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .leftJoin(QCocktail.cocktail.recipe, recipe)
-            .where(recipe.isNull())
-            .fetchOne();
+          .leftJoin(QCocktail.cocktail.recipe, recipe)
+          .where(recipe.isNull())
+          .fetchOne();
         verifyResult(ginTonic, cocktail);
 
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .leftJoin(QRecipe.recipe)
-            .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
-            .where(QRecipe.recipe.isNull())
-            .fetchOne();
+          .leftJoin(QRecipe.recipe)
+          .on(QCocktail.cocktail.name.eq(QRecipe.recipe.cocktail))
+          .where(QRecipe.recipe.isNull())
+          .fetchOne();
         verifyResult(ginTonic, cocktail);
     }
 
@@ -100,26 +100,26 @@ public class UnrelatedEntitiesUnitTest {
     public void givenCocktailsWithMultipleRecipes_whenQuerying_thenTheExpectedCocktailsReturned() {
         // JPQL
         Cocktail cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c join c.recipeList", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c join c.recipeList", Cocktail.class)
+          .getSingleResult();
         verifyResult(mojito, cocktail);
 
         cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c join MultipleRecipe mr "
-            + "on mr.cocktail = c.name", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c join MultipleRecipe mr "
+          + "on mr.cocktail = c.name", Cocktail.class)
+          .getSingleResult();
         verifyResult(mojito, cocktail);
 
         // QueryDSL
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .join(QCocktail.cocktail.recipeList)
-            .fetchOne();
+          .join(QCocktail.cocktail.recipeList)
+          .fetchOne();
         verifyResult(mojito, cocktail);
 
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .join(QMultipleRecipe.multipleRecipe)
-            .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
-            .fetchOne();
+          .join(QMultipleRecipe.multipleRecipe)
+          .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
+          .fetchOne();
         verifyResult(mojito, cocktail);
     }
 
@@ -127,31 +127,31 @@ public class UnrelatedEntitiesUnitTest {
     public void givenCocktailsWithoutMultipleRecipes_whenQuerying_thenTheExpectedCocktailsReturned() {
         // JPQL
         Cocktail cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c left join c.recipeList r "
-            + "where r is null", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c left join c.recipeList r "
+          + "where r is null", Cocktail.class)
+          .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
         cocktail = entityManager.createQuery("select c "
-            + "from Cocktail c left join MultipleRecipe r " 
-            + "on c.name = r.cocktail "
-            + "where r is null", Cocktail.class)
-            .getSingleResult();
+          + "from Cocktail c left join MultipleRecipe r " 
+          + "on c.name = r.cocktail "
+          + "where r is null", Cocktail.class)
+          .getSingleResult();
         verifyResult(ginTonic, cocktail);
 
         // QueryDSL
         QMultipleRecipe multipleRecipe = new QMultipleRecipe("alias");
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .leftJoin(QCocktail.cocktail.recipeList, multipleRecipe)
-            .where(multipleRecipe.isNull())
-            .fetchOne();
+          .leftJoin(QCocktail.cocktail.recipeList, multipleRecipe)
+          .where(multipleRecipe.isNull())
+          .fetchOne();
         verifyResult(ginTonic, cocktail);
 
         cocktail = new JPAQuery<Cocktail>(entityManager).from(QCocktail.cocktail)
-            .leftJoin(QMultipleRecipe.multipleRecipe)
-            .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
-            .where(QMultipleRecipe.multipleRecipe.isNull())
-            .fetchOne();
+          .leftJoin(QMultipleRecipe.multipleRecipe)
+          .on(QCocktail.cocktail.name.eq(QMultipleRecipe.multipleRecipe.cocktail))
+          .where(QMultipleRecipe.multipleRecipe.isNull())
+          .fetchOne();
         verifyResult(ginTonic, cocktail);
     }
 
@@ -164,20 +164,21 @@ public class UnrelatedEntitiesUnitTest {
 
         // JPQL
         List<MultipleRecipe> recipes = entityManager.createQuery("select distinct r "
-            + "from MultipleRecipe r "
-            + "join Cocktail c " 
-            + "on r.baseIngredient = c.category",
-        MultipleRecipe.class)
-            .getResultList();
+          + "from MultipleRecipe r "
+          + "join Cocktail c " 
+          + "on r.baseIngredient = c.category",
+          MultipleRecipe.class).getResultList();
+        
         verifyResult.accept(recipes);
 
         // QueryDSL
         QCocktail cocktail = QCocktail.cocktail;
         QMultipleRecipe multipleRecipe = QMultipleRecipe.multipleRecipe;
         recipes = new JPAQuery<MultipleRecipe>(entityManager).from(multipleRecipe)
-            .join(cocktail)
-            .on(multipleRecipe.baseIngredient.eq(cocktail.category))
-            .fetch();
+          .join(cocktail)
+          .on(multipleRecipe.baseIngredient.eq(cocktail.category))
+          .fetch();
+        
         verifyResult.accept(recipes);
     }
 

From 1278f63d03fd9e761e33f1ee0d4366596320016a Mon Sep 17 00:00:00 2001
From: Kostas Karavitis <kkaravitis@gmail.com>
Date: Fri, 24 Apr 2020 15:38:39 +0300
Subject: [PATCH 070/404] [BAEL-3936] Upgrade hibernate and querydsl to the
 latest stable versions

---
 persistence-modules/java-jpa-2/pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml
index b41cdccb07..d4532c32b8 100644
--- a/persistence-modules/java-jpa-2/pom.xml
+++ b/persistence-modules/java-jpa-2/pom.xml
@@ -138,7 +138,7 @@
     </build>
 
     <properties>
-        <hibernate.version>5.4.0.Final</hibernate.version>
+        <hibernate.version>5.4.14.Final</hibernate.version>
         <eclipselink.version>2.7.4-RC1</eclipselink.version>
         <postgres.version>42.2.5</postgres.version>
         <javax.persistence-api.version>2.2</javax.persistence-api.version>
@@ -146,7 +146,7 @@
         <maven-compiler-plugin.version>3.5.1</maven-compiler-plugin.version>
         <maven-processor-plugin.version>3.3.3</maven-processor-plugin.version>
         <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
-        <querydsl.version>4.2.2</querydsl.version>
+        <querydsl.version>4.3.1</querydsl.version>
     </properties>
 
 </project>

From 44485bcc48a090a6fd2850047065ce8a7677276c Mon Sep 17 00:00:00 2001
From: Cavero Barca <carlos.cavero@atos.net>
Date: Sat, 25 Apr 2020 01:49:20 +0200
Subject: [PATCH 071/404] Use a two-space indent when continuing a line

---
 .../WebFilterGatewayApplication.java          |  4 +-
 .../config/ModifyBodyRouteConfig.java         | 16 ++---
 .../WebFilterFactoriesLiveTest.java           | 69 +++++++++----------
 3 files changed, 43 insertions(+), 46 deletions(-)

diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
index 3b45e9013f..852e5cadba 100644
--- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
@@ -8,8 +8,8 @@ public class WebFilterGatewayApplication {
 
     public static void main(String[] args) {
         new SpringApplicationBuilder(WebFilterGatewayApplication.class)
-            .profiles("webfilters")
-            .run(args);
+          .profiles("webfilters")
+          .run(args);
     }
 
 }
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
index ccc789f287..7b6188b66a 100644
--- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
@@ -14,19 +14,19 @@ public class ModifyBodyRouteConfig {
     @Bean
     public RouteLocator routes(RouteLocatorBuilder builder) {
         return builder.routes()
-            .route("modify_request_body", r -> r.path("/post")
-                .filters(f -> f.modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
-                        (exchange, s) -> Mono.just(new Hello(s.toUpperCase())))).uri("https://httpbin.org"))
-            .build();
+          .route("modify_request_body", r -> r.path("/post")
+            .filters(f -> f.modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
+              (exchange, s) -> Mono.just(new Hello(s.toUpperCase())))).uri("https://httpbin.org"))
+          .build();
     }  
 
     @Bean
     public RouteLocator responseRoutes(RouteLocatorBuilder builder) {
         return builder.routes()
-            .route("modify_response_body", r -> r.path("/put/**")
-                .filters(f -> f.modifyResponseBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
-                        (exchange, s) -> Mono.just(new Hello("New Body")))).uri("https://httpbin.org"))
-            .build();
+          .route("modify_response_body", r -> r.path("/put/**")
+            .filters(f -> f.modifyResponseBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
+              (exchange, s) -> Mono.just(new Hello("New Body")))).uri("https://httpbin.org"))
+          .build();
     } 
 
     static class Hello {
diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
index 3efd60fb27..67e00a42fc 100644
--- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
+++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
@@ -33,23 +33,23 @@ public class WebFilterFactoriesLiveTest {
 
     @Autowired
     private WebTestClient client;
-    
+
     @Autowired
     private TestRestTemplate restTemplate;
 
     @BeforeEach
     public void configureClient() {
         client = WebTestClient.bindToServer()
-            .baseUrl("http://localhost:" + port)
-            .build();
+          .baseUrl("http://localhost:" + port)
+          .build();
     }
 
     @Test
     public void whenCallGetThroughGateway_thenAllHTTPRequestHeadersParametersAreSet() throws JSONException {
-        String url = "http://localhost:" + port + "/get";        
+        String url = "http://localhost:" + port + "/get";
         ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
         assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
-        
+
         JSONObject json = new JSONObject(response.getBody());
         JSONObject headers = json.getJSONObject("headers");
         assertThat(headers.getString("My-Header-Good")).isEqualTo("Good");
@@ -63,76 +63,73 @@ public class WebFilterFactoriesLiveTest {
     @Test
     public void whenCallHeaderPostThroughGateway_thenAllHTTPResponseHeadersAreSet() {
         ResponseSpec response = client.post()
-            .uri("/header/post")
-            .exchange();
+          .uri("/header/post")
+          .exchange();
 
         response.expectStatus()
-            .isOk()
-            .expectHeader()
-            .valueEquals("My-Header-Rewrite", "password=***")
-            .expectHeader()
-            .valueEquals("My-Header-Set", "Set")
-            .expectHeader()
-            .valueEquals("My-Header-Good", "Good")
-            .expectHeader()
-            .doesNotExist("My-Header-Remove");
+          .isOk()
+          .expectHeader()
+          .valueEquals("My-Header-Rewrite", "password=***")
+          .expectHeader()
+          .valueEquals("My-Header-Set", "Set")
+          .expectHeader()
+          .valueEquals("My-Header-Good", "Good")
+          .expectHeader()
+          .doesNotExist("My-Header-Remove");
     }
 
     @Test
     public void whenCallPostThroughGateway_thenBodyIsRetrieved() throws JSONException {
-        String url = "http://localhost:" + port + "/post";        
+        String url = "http://localhost:" + port + "/post";
 
         HttpEntity<String> entity = new HttpEntity<>("content", new HttpHeaders());
-        
-        ResponseEntity<String> response = restTemplate.exchange(url, 
-            HttpMethod.POST, entity, String.class);
+
+        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
         assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
-        
+
         JSONObject json = new JSONObject(response.getBody());
         JSONObject data = json.getJSONObject("json");
         assertThat(data.getString("message")).isEqualTo("CONTENT");
     }
 
-
     @Test
     public void whenCallPutThroughGateway_thenBodyIsRetrieved() throws JSONException {
-        String url = "http://localhost:" + port + "/put";        
+        String url = "http://localhost:" + port + "/put";
 
         HttpEntity<String> entity = new HttpEntity<>("CONTENT", new HttpHeaders());
-        
-        ResponseEntity<String> response = restTemplate.exchange(url, 
-            HttpMethod.PUT, entity, String.class);
+
+        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, entity, String.class);
         assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
-        
+
         JSONObject json = new JSONObject(response.getBody());
         assertThat(json.getString("message")).isEqualTo("New Body");
     }
-    
+
     @Test
     public void whenCallDeleteThroughGateway_thenIsUnauthorizedCodeIsSet() {
         ResponseSpec response = client.delete()
-            .uri("/delete")
-            .exchange();
+          .uri("/delete")
+          .exchange();
 
         response.expectStatus()
-            .isUnauthorized();
+          .isUnauthorized();
     }
 
     @Test
     public void whenCallFakePostThroughGateway_thenIsUnauthorizedCodeIsSet() {
         ResponseSpec response = client.post()
-            .uri("/fake/post")
-            .exchange();
+          .uri("/fake/post")
+          .exchange();
 
         response.expectStatus()
-            .is3xxRedirection();
+          .is3xxRedirection();
     }
 
     @Test
     public void whenCallStatus504ThroughGateway_thenCircuitBreakerIsExecuted() throws JSONException {
-        String url = "http://localhost:" + port + "/status/504";        
+        String url = "http://localhost:" + port + "/status/504";
         ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
-        
+
         JSONObject json = new JSONObject(response.getBody());
         assertThat(json.getString("url")).contains("anything");
     }

From a73fb8483a036103945b5934f1b40c70e7020f99 Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Sat, 25 Apr 2020 14:19:28 +0200
Subject: [PATCH 072/404] [BAEL-3944] Package move

---
 .../regex/{ => phonenumbers}/PhoneNumbersRegexUnitTest.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/{ => phonenumbers}/PhoneNumbersRegexUnitTest.java (98%)

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
rename to core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
index 620b7a9bae..f7a9d70850 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/PhoneNumbersRegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.regex;
+package com.baeldung.regex.phonenumbers;
 
 import static org.junit.Assert.*;
 

From b6996fbc05d4102b2da9f78796821fa78b5288e5 Mon Sep 17 00:00:00 2001
From: Ali Dehghani <ali.dehghani.g@gmail.com>
Date: Sat, 25 Apr 2020 22:55:00 +0430
Subject: [PATCH 073/404] Added Trailing slash to Fix the Relative Path Bug

---
 .../java/com/baeldung/favicon/config/FaviconConfiguration.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java
index d1809199d6..f2a173caf3 100644
--- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java
+++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java
@@ -28,7 +28,7 @@ public class FaviconConfiguration {
     @Bean
     protected ResourceHttpRequestHandler faviconRequestHandler() {
         ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
-        ClassPathResource classPathResource = new ClassPathResource("com/baeldung/images");
+        ClassPathResource classPathResource = new ClassPathResource("com/baeldung/images/");
         List<Resource> locations = Arrays.asList(classPathResource);
         requestHandler.setLocations(locations);
         return requestHandler;

From 837ebef85832c3a5fdc59929370c815bf1924510 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 1 Oct 2019 12:56:55 -0400
Subject: [PATCH 074/404] Add architecture module with Hexagonal example

---
 architecture/README.md                        |  3 ++
 architecture/pom.xml                          | 33 ++++++++++++
 .../HexagonalArchitectureTaskApplication.java | 12 +++++
 .../application/task/AddNewDailyTask.java     | 29 ++++++++++
 .../application/task/AddNewTask.java          | 22 ++++++++
 .../application/task/GetTasks.java            | 22 ++++++++
 .../commands/task/CreateTask.java             |  7 +++
 .../commands/task/GetAllTasks.java            |  7 +++
 .../architecture/domain/task/Task.java        | 53 +++++++++++++++++++
 .../domain/task/TaskRepository.java           |  7 +++
 .../architecture/domain/task/TaskService.java | 22 ++++++++
 .../framework/cli/StartupRunner.java          | 25 +++++++++
 .../http/task/TaskApiController.java          | 42 +++++++++++++++
 .../framework/http/task/TaskRequest.java      | 29 ++++++++++
 14 files changed, 313 insertions(+)
 create mode 100644 architecture/README.md
 create mode 100644 architecture/pom.xml
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
 create mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java

diff --git a/architecture/README.md b/architecture/README.md
new file mode 100644
index 0000000000..be093f25ed
--- /dev/null
+++ b/architecture/README.md
@@ -0,0 +1,3 @@
+### Relevant articles
+
+- [A Quick and Practical Example of Hexagonal Architecture in Java](https://www.baeldung.com/a-quick-and-practical-example-of-hexagonal-architecture-in-java-3/)
diff --git a/architecture/pom.xml b/architecture/pom.xml
new file mode 100644
index 0000000000..4ad104293e
--- /dev/null
+++ b/architecture/pom.xml
@@ -0,0 +1,33 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.baeldung.architecture</groupId>
+    <artifactId>architecture</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>architecture</name>
+    <packaging>jar</packaging>
+    <description>A Quick and Practical Example of Hexagonal Architecture in Java</description>
+
+    <parent>
+        <artifactId>parent-boot-2</artifactId>
+        <groupId>com.baeldung</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../parent-boot-2</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
new file mode 100644
index 0000000000..83e4fc4c0b
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.architecture;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class HexagonalArchitectureTaskApplication {
+	public static void main(String[] args) {
+		SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
+	}
+
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
new file mode 100644
index 0000000000..208d1bfcc9
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
@@ -0,0 +1,29 @@
+package com.baeldung.architecture.application.task;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+
+import com.baeldung.architecture.commands.task.CreateTask;
+import com.baeldung.architecture.domain.task.Task;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class AddNewDailyTask implements CreateTask {
+
+    private AddNewTask addNewTask;
+
+    public AddNewDailyTask(AddNewTask addNewTask) {
+        this.addNewTask = addNewTask;
+    }
+
+    @Override
+    public void create(Task newTask) {
+        Instant initialDueDate = newTask.getDueDate();
+        String description = newTask.getDescription();
+        for (int i = 1; i <= 5; i++) {
+            Task task = new Task(initialDueDate.plus(i, ChronoUnit.DAYS), description);
+            addNewTask.create(task);
+        }
+    }
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
new file mode 100644
index 0000000000..2e5aff4a53
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
@@ -0,0 +1,22 @@
+package com.baeldung.architecture.application.task;
+
+import com.baeldung.architecture.domain.task.Task;
+import com.baeldung.architecture.domain.task.TaskService;
+import com.baeldung.architecture.commands.task.*;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class AddNewTask implements CreateTask {
+
+    private TaskService taskService;
+
+    public AddNewTask(TaskService taskService) {
+        this.taskService = taskService;
+    }
+
+    @Override
+    public void create(Task newTask) {
+        taskService.createTask(newTask);
+    }
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
new file mode 100644
index 0000000000..54539290ba
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
@@ -0,0 +1,22 @@
+package com.baeldung.architecture.application.task;
+
+import com.baeldung.architecture.domain.task.Task;
+import com.baeldung.architecture.domain.task.TaskService;
+import com.baeldung.architecture.commands.task.*;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class GetTasks implements GetAllTasks {
+
+    private TaskService taskService;
+
+    public GetTasks(TaskService taskService) {
+        this.taskService = taskService;
+    }
+
+    @Override
+    public Iterable<Task> getAll() {
+        return taskService.getAllTasks();
+    }
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
new file mode 100644
index 0000000000..26e6da10e2
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
@@ -0,0 +1,7 @@
+package com.baeldung.architecture.commands.task;
+
+import com.baeldung.architecture.domain.task.Task;
+
+public interface CreateTask {
+    public void create(Task newTask);
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
new file mode 100644
index 0000000000..d3c40db92f
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
@@ -0,0 +1,7 @@
+package com.baeldung.architecture.commands.task;
+
+import com.baeldung.architecture.domain.task.Task;
+
+public interface GetAllTasks {
+    public Iterable<Task> getAll();
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
new file mode 100644
index 0000000000..240dc33571
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
@@ -0,0 +1,53 @@
+package com.baeldung.architecture.domain.task;
+
+import java.time.Instant;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Task {
+    @Id
+    @GeneratedValue(strategy=GenerationType.AUTO)
+    private Long id;
+    private Instant dueDate = Instant.now();
+    private String description;
+
+    public Task() {}
+
+    public Task(Instant dueDate, String description) {
+        this.dueDate = dueDate;
+        this.description = description;
+    }
+
+    public Task(Long id, Instant dueDate, String description) {
+        this(dueDate, description);
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Instant getDueDate() {
+        return dueDate;
+    }
+
+    public void setDueDate(Instant dueDate) {
+        this.dueDate = dueDate;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
new file mode 100644
index 0000000000..d896212714
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.architecture.domain.task;
+
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TaskRepository extends CrudRepository<Task, Long> {};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
new file mode 100644
index 0000000000..cace0614ad
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
@@ -0,0 +1,22 @@
+package com.baeldung.architecture.domain.task;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class TaskService {
+
+    private TaskRepository taskRepository;
+
+    public TaskService(TaskRepository taskRepository) {
+        this.taskRepository = taskRepository;
+    }
+
+    public void createTask(Task task) {
+        taskRepository.save(task);
+    }
+
+    public Iterable<Task> getAllTasks() {
+        return taskRepository.findAll();
+    }
+
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
new file mode 100644
index 0000000000..260c033b71
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -0,0 +1,25 @@
+package com.baeldung.architecture.framework.cli;
+
+import com.baeldung.architecture.application.task.AddNewDailyTask;
+import com.baeldung.architecture.domain.task.Task;
+
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StartupRunner implements ApplicationRunner {
+
+    AddNewDailyTask addNewDailyTask;
+
+    public StartupRunner(AddNewDailyTask addNewDailyTask) {
+        this.addNewDailyTask = addNewDailyTask;
+    }
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        System.out.println("Adding daily tasks");
+        Task task = new Task();
+        task.setDescription("Startup Task");
+        addNewDailyTask.create(task);
+    }
+}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
new file mode 100644
index 0000000000..c6f7bff2dd
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
@@ -0,0 +1,42 @@
+package com.baeldung.architecture.framework.http.task;
+
+import java.time.Instant;
+
+import com.baeldung.architecture.application.task.AddNewTask;
+import com.baeldung.architecture.application.task.GetTasks;
+import com.baeldung.architecture.domain.task.Task;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("task")
+public class TaskApiController {
+
+    private AddNewTask addNewTask;
+    private GetTasks getTasks;
+
+    public TaskApiController(
+        AddNewTask addNewTask,
+        GetTasks getTasks
+    ) {
+        this.addNewTask = addNewTask;
+        this.getTasks = getTasks;
+    }
+
+    @GetMapping
+    Iterable<Task> listTasks() {
+        return getTasks.getAll();
+    }
+
+    @PostMapping(consumes = "application/json", produces = "application/json")
+    void createTask(@RequestBody TaskRequest taskRequest) {
+        Task task = new Task();
+        task.setDescription(taskRequest.getDescription());
+        task.setDueDate(Instant.parse(taskRequest.getDueDate()));
+        addNewTask.create(task);
+    }
+}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
new file mode 100644
index 0000000000..2e353b079a
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
@@ -0,0 +1,29 @@
+package com.baeldung.architecture.framework.http.task;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+public class TaskRequest {
+    @JsonInclude(Include.NON_NULL)
+    private String description;
+
+    @JsonInclude(Include.NON_NULL)
+    private String dueDate;
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDueDate() {
+        return dueDate;
+    }
+
+    public void setDueDate(String dueDate) {
+        this.dueDate = dueDate;
+    }
+
+} 
\ No newline at end of file

From 616364afc443e2c4ae4c03e0b1f43f49b5a77483 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 1 Oct 2019 20:15:39 -0400
Subject: [PATCH 075/404] Fixup styling

---
 .../architecture/HexagonalArchitectureTaskApplication.java  | 6 +++---
 .../baeldung/architecture/application/task/AddNewTask.java  | 2 +-
 .../baeldung/architecture/application/task/GetTasks.java    | 2 +-
 .../baeldung/architecture/framework/cli/StartupRunner.java  | 1 -
 4 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
index 83e4fc4c0b..69c6f4b276 100644
--- a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
+++ b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
@@ -5,8 +5,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 public class HexagonalArchitectureTaskApplication {
-	public static void main(String[] args) {
-		SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
-	}
+    public static void main(String[] args) {
+        SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
+    }
 
 }
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
index 2e5aff4a53..70638378f9 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
@@ -19,4 +19,4 @@ public class AddNewTask implements CreateTask {
     public void create(Task newTask) {
         taskService.createTask(newTask);
     }
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
index 54539290ba..c876f7de85 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
@@ -19,4 +19,4 @@ public class GetTasks implements GetAllTasks {
     public Iterable<Task> getAll() {
         return taskService.getAllTasks();
     }
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
index 260c033b71..cf38e5ee5e 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -17,7 +17,6 @@ public class StartupRunner implements ApplicationRunner {
     }
     @Override
     public void run(ApplicationArguments args) throws Exception {
-        System.out.println("Adding daily tasks");
         Task task = new Task();
         task.setDescription("Startup Task");
         addNewDailyTask.create(task);

From 646bd45c1824071ae5d17bae82799a89de69929e Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 1 Oct 2019 20:15:39 -0400
Subject: [PATCH 076/404] Fixup styling

---
 .../architecture/application/task/AddNewDailyTask.java         | 2 +-
 .../com/baeldung/architecture/commands/task/CreateTask.java    | 2 +-
 .../com/baeldung/architecture/commands/task/GetAllTasks.java   | 2 +-
 .../com/baeldung/architecture/domain/task/TaskService.java     | 2 +-
 .../com/baeldung/architecture/framework/cli/StartupRunner.java | 2 +-
 .../architecture/framework/http/task/TaskApiController.java    | 2 +-
 .../baeldung/architecture/framework/http/task/TaskRequest.java | 3 +--
 7 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
index 208d1bfcc9..f9ee97542c 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
@@ -26,4 +26,4 @@ public class AddNewDailyTask implements CreateTask {
             addNewTask.create(task);
         }
     }
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
index 26e6da10e2..ec60868a22 100644
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
@@ -4,4 +4,4 @@ import com.baeldung.architecture.domain.task.Task;
 
 public interface CreateTask {
     public void create(Task newTask);
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
index d3c40db92f..c9aa1be5f8 100644
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
@@ -4,4 +4,4 @@ import com.baeldung.architecture.domain.task.Task;
 
 public interface GetAllTasks {
     public Iterable<Task> getAll();
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
index cace0614ad..11ef0f3e19 100644
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
@@ -19,4 +19,4 @@ public class TaskService {
         return taskRepository.findAll();
     }
 
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
index cf38e5ee5e..449bc9386e 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -21,4 +21,4 @@ public class StartupRunner implements ApplicationRunner {
         task.setDescription("Startup Task");
         addNewDailyTask.create(task);
     }
-}
\ No newline at end of file
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
index c6f7bff2dd..87a8f5fe4b 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
@@ -39,4 +39,4 @@ public class TaskApiController {
         task.setDueDate(Instant.parse(taskRequest.getDueDate()));
         addNewTask.create(task);
     }
-}
\ No newline at end of file
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
index 2e353b079a..70b98a32f9 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
@@ -25,5 +25,4 @@ public class TaskRequest {
     public void setDueDate(String dueDate) {
         this.dueDate = dueDate;
     }
-
-} 
\ No newline at end of file
+} 

From 925a69b401f9817cce62e790435a5400c5eef7d1 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 07:01:34 -0400
Subject: [PATCH 077/404] Java example for Hibernate Types

---
 .../hibernate-types/.gitignore                |  33 +++
 persistence-modules/hibernate-types/README.md |   7 +
 .../hibernate-types/docker-compose.yml        |  19 ++
 .../docker-entrypoint-initdb.d/init-db.sql    |   3 +
 .../docker/etc/mysql/conf.d/utf8.cnf          |   7 +
 persistence-modules/hibernate-types/pom.xml   | 214 ++++++++++++++++++
 .../com/baeldung/hibernate/types/Album.java   |  34 +++
 .../hibernate/types/AlbumRepository.java      |   8 +
 .../com/baeldung/hibernate/types/Artist.java  |  72 ++++++
 .../baeldung/hibernate/types/BaseEntity.java  |  37 +++
 .../baeldung/hibernate/types/CoverArt.java    |  71 ++++++
 .../types/HibernateTypesApplication.java      |  13 ++
 .../com/baeldung/hibernate/types/Song.java    |  57 +++++
 .../hibernate/types/SongRepository.java       |   8 +
 .../src/main/resources/application.properties |  21 ++
 .../main/resources/hibernate-types.properties |   1 +
 .../types/HibernateTypesIntegrationTest.java  | 182 +++++++++++++++
 persistence-modules/pom.xml                   |   1 +
 18 files changed, 788 insertions(+)
 create mode 100644 persistence-modules/hibernate-types/.gitignore
 create mode 100644 persistence-modules/hibernate-types/README.md
 create mode 100644 persistence-modules/hibernate-types/docker-compose.yml
 create mode 100644 persistence-modules/hibernate-types/docker/docker-entrypoint-initdb.d/init-db.sql
 create mode 100644 persistence-modules/hibernate-types/docker/etc/mysql/conf.d/utf8.cnf
 create mode 100644 persistence-modules/hibernate-types/pom.xml
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Album.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Artist.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/BaseEntity.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/CoverArt.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Song.java
 create mode 100644 persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/SongRepository.java
 create mode 100644 persistence-modules/hibernate-types/src/main/resources/application.properties
 create mode 100644 persistence-modules/hibernate-types/src/main/resources/hibernate-types.properties
 create mode 100644 persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java

diff --git a/persistence-modules/hibernate-types/.gitignore b/persistence-modules/hibernate-types/.gitignore
new file mode 100644
index 0000000000..94b9c48616
--- /dev/null
+++ b/persistence-modules/hibernate-types/.gitignore
@@ -0,0 +1,33 @@
+.classpath
+.project
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/persistence-modules/hibernate-types/README.md b/persistence-modules/hibernate-types/README.md
new file mode 100644
index 0000000000..9d02d8c8f2
--- /dev/null
+++ b/persistence-modules/hibernate-types/README.md
@@ -0,0 +1,7 @@
+## Hibernate Types
+
+This module contains articles specific to use of Hibernate Types.
+
+### Relevant articles:
+
+- [A Guide to Hibernate Types Project](https://www.baeldung.com/a-guide-to-hibernate-types-project/)
diff --git a/persistence-modules/hibernate-types/docker-compose.yml b/persistence-modules/hibernate-types/docker-compose.yml
new file mode 100644
index 0000000000..3ea9fef2e7
--- /dev/null
+++ b/persistence-modules/hibernate-types/docker-compose.yml
@@ -0,0 +1,19 @@
+version: '3.2'
+
+services:
+  mysql:
+    image: mysql:5.7
+    container_name: mysql57
+    restart: unless-stopped
+    ports:
+      - 53306:3306
+    environment:
+      - MYSQL_ALLOW_EMPTY_PASSWORD=true
+    volumes :
+      - ./docker/etc/mysql/conf.d:/etc/mysql/conf.d
+      - ./docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "50m"
+        max-file: "1"
diff --git a/persistence-modules/hibernate-types/docker/docker-entrypoint-initdb.d/init-db.sql b/persistence-modules/hibernate-types/docker/docker-entrypoint-initdb.d/init-db.sql
new file mode 100644
index 0000000000..1df234f5a1
--- /dev/null
+++ b/persistence-modules/hibernate-types/docker/docker-entrypoint-initdb.d/init-db.sql
@@ -0,0 +1,3 @@
+CREATE DATABASE hibernate_types;
+use hibernate_types;
+GRANT ALL PRIVILEGES ON hibernate_types.* TO 'mysql'@'%' IDENTIFIED BY 'admin';
diff --git a/persistence-modules/hibernate-types/docker/etc/mysql/conf.d/utf8.cnf b/persistence-modules/hibernate-types/docker/etc/mysql/conf.d/utf8.cnf
new file mode 100644
index 0000000000..1885d83c8b
--- /dev/null
+++ b/persistence-modules/hibernate-types/docker/etc/mysql/conf.d/utf8.cnf
@@ -0,0 +1,7 @@
+[mysqld]
+init_connect='SET collation_connection = utf8_unicode_ci'
+character-set-server = utf8
+collation-server = utf8_unicode_ci
+
+[client]
+default-character-set = utf8
\ No newline at end of file
diff --git a/persistence-modules/hibernate-types/pom.xml b/persistence-modules/hibernate-types/pom.xml
new file mode 100644
index 0000000000..9fa5d66347
--- /dev/null
+++ b/persistence-modules/hibernate-types/pom.xml
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>hibernate-types</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>hibernate-types</name>
+    <description>Introduction into hibernate types library</description>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>persistence-modules</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.vladmihalcea</groupId>
+            <artifactId>hibernate-types-52</artifactId>
+            <version>${hibernate-types.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <version>${spring-boot.version}</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <version>${spring-boot.version}</version>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core</artifactId>
+            <version>${hibernate.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-ehcache</artifactId>
+            <version>${hibernate.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-testing</artifactId>
+            <version>${hibernate.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>${jaxb.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.javassist</groupId>
+            <artifactId>javassist</artifactId>
+            <version>${javassist.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>net.ttddyy</groupId>
+            <artifactId>datasource-proxy</artifactId>
+            <version>${datasource-proxy.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.integralblue</groupId>
+            <artifactId>log4jdbc-spring-boot-starter</artifactId>
+            <version>${log4jdbc.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>hibernate-types</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven.version}</version>
+                <configuration>
+                    <source>${source.version}</source>
+                    <target>${target.version}</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <forkCount>3</forkCount>
+                    <reuseForks>true</reuseForks>
+                    <excludes>
+                        <exclude>**/*IntegrationTest.java</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>integration</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <excludes>
+                                        <exclude>none</exclude>
+                                    </excludes>
+                                    <includes>
+                                        <include>**/*IntegrationTest.java</include>
+                                    </includes>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>   
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+    <properties>
+        <assertj-core.version>3.15.0</assertj-core.version>
+        <datasource-proxy.version>1.6</datasource-proxy.version>
+        <guava.version>29.0-jre</guava.version>
+        <hibernate-types.version>2.9.7</hibernate-types.version>
+        <hibernate.version>5.4.14.Final</hibernate.version>
+        <jackson.version>2.10.3</jackson.version>
+        <java.version>1.8</java.version>
+        <javassist.version>3.27.0-GA</javassist.version>
+        <jaxb.version>2.3.1</jaxb.version>
+        <log4jdbc.version>2.0.0</log4jdbc.version>
+        <logback.version>1.2.3</logback.version>
+        <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
+        <maven.surefire.version>2.22.2</maven.surefire.version>
+        <maven.compiler.version>3.8.1</maven.compiler.version>
+        <maven.version>3.7.0</maven.version>
+        <mysql.version>8.0.19</mysql.version>
+        <slf4j.version>1.7.30</slf4j.version>
+        <spring-boot.version>2.1.3.RELEASE</spring-boot.version>
+    </properties>
+
+</project>
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Album.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Album.java
new file mode 100644
index 0000000000..f18818c3a9
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Album.java
@@ -0,0 +1,34 @@
+package com.baeldung.hibernate.types;
+
+import org.hibernate.annotations.Type;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity(name = "Album")
+@Table(name = "album")
+public class Album extends BaseEntity {
+    @Type(type = "json")
+    @Column(columnDefinition = "json")
+    private CoverArt coverArt;
+
+    @OneToMany(fetch = FetchType.EAGER)
+    private List<Song> songs;
+
+    public CoverArt getCoverArt() {
+        return coverArt;
+    }
+
+    public void setCoverArt(CoverArt coverArt) {
+        this.coverArt = coverArt;
+    }
+
+
+    public List<Song> getSongs() {
+        return songs;
+    }
+
+    public void setSong(List<Song> songs) {
+        this.songs = songs;
+    }
+}
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java
new file mode 100644
index 0000000000..d89542de46
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.hibernate.types;
+
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AlbumRepository extends CrudRepository<Album, Long> {
+}
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Artist.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Artist.java
new file mode 100644
index 0000000000..8f3ccb44c5
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Artist.java
@@ -0,0 +1,72 @@
+package com.baeldung.hibernate.types;
+
+import java.io.Serializable;
+
+public class Artist implements Serializable {
+ 
+    private String name;
+    private String country;
+    private String genre;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public String getGenre() {
+        return genre;
+    }
+
+    public void setGenre(String genre) {
+        this.genre = genre;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((country == null) ? 0 : country.hashCode());
+        result = prime * result + ((genre == null) ? 0 : genre.hashCode());
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Artist other = (Artist) obj;
+        if (country == null) {
+            if (other.country != null)
+                return false;
+        } else if (!country.equals(other.country))
+            return false;
+        if (genre == null) {
+            if (other.genre != null)
+                return false;
+        } else if (!genre.equals(other.genre))
+            return false;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
+        return true;
+    }
+    
+ }
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/BaseEntity.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/BaseEntity.java
new file mode 100644
index 0000000000..3e0fbc7595
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/BaseEntity.java
@@ -0,0 +1,37 @@
+package com.baeldung.hibernate.types;
+
+import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
+import com.vladmihalcea.hibernate.type.json.JsonStringType;
+import org.hibernate.annotations.TypeDef;
+import org.hibernate.annotations.TypeDefs;
+
+import javax.persistence.*;
+
+@TypeDefs({
+    @TypeDef(name = "json", typeClass = JsonStringType.class),
+    @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
+})
+@MappedSuperclass
+public class BaseEntity {
+    @Id
+    @GeneratedValue(strategy=GenerationType.AUTO)
+    @Column(name = "id", unique = true, nullable = false)
+    long id;
+    String name;
+
+    public Long getId() {
+        return id;
+    }
+ 
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/CoverArt.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/CoverArt.java
new file mode 100644
index 0000000000..bd71edc53c
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/CoverArt.java
@@ -0,0 +1,71 @@
+package com.baeldung.hibernate.types;
+
+import java.io.Serializable;
+
+public class CoverArt implements Serializable {
+
+    private String frontCoverArtUrl;
+    private String backCoverArtUrl;
+    private String upcCode;
+
+    public String getFrontCoverArtUrl() {
+        return frontCoverArtUrl;
+    }
+
+    public void setFrontCoverArtUrl(String frontCoverArtUrl) {
+        this.frontCoverArtUrl = frontCoverArtUrl;
+    }
+
+    public String getBackCoverArtUrl() {
+        return backCoverArtUrl;
+    }
+
+    public void setBackCoverArtUrl(String backCoverArtUrl) {
+        this.backCoverArtUrl = backCoverArtUrl;
+    }
+
+    public String getUpcCode() {
+        return upcCode;
+    }
+
+    public void setUpcCode(String upcCode) {
+        this.upcCode = upcCode;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((backCoverArtUrl == null) ? 0 : backCoverArtUrl.hashCode());
+        result = prime * result + ((frontCoverArtUrl == null) ? 0 : frontCoverArtUrl.hashCode());
+        result = prime * result + ((upcCode == null) ? 0 : upcCode.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        CoverArt other = (CoverArt) obj;
+        if (backCoverArtUrl == null) {
+            if (other.backCoverArtUrl != null)
+                return false;
+        } else if (!backCoverArtUrl.equals(other.backCoverArtUrl))
+            return false;
+        if (frontCoverArtUrl == null) {
+            if (other.frontCoverArtUrl != null)
+                return false;
+        } else if (!frontCoverArtUrl.equals(other.frontCoverArtUrl))
+            return false;
+        if (upcCode == null) {
+            if (other.upcCode != null)
+                return false;
+        } else if (!upcCode.equals(other.upcCode))
+            return false;
+        return true;
+    }
+}
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java
new file mode 100644
index 0000000000..ac379f9ee2
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.hibernate.types;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class HibernateTypesApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(HibernateTypesApplication.class, args);
+	}
+
+}
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Song.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Song.java
new file mode 100644
index 0000000000..2d22296024
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Song.java
@@ -0,0 +1,57 @@
+package com.baeldung.hibernate.types;
+
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import java.time.YearMonth;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import com.vladmihalcea.hibernate.type.basic.YearMonthIntegerType;
+
+@Entity(name = "Song")
+@Table(name = "song")
+@TypeDef(
+    typeClass = YearMonthIntegerType.class,
+    defaultForType = YearMonth.class
+)
+public class Song extends BaseEntity {
+
+    private Long length = 0L;
+
+    @Type(type = "json")
+    @Column(columnDefinition = "json")
+    private Artist artist;
+
+    @Column(
+        name = "recorded_on",
+        columnDefinition = "mediumint"
+    )
+    private YearMonth recordedOn = YearMonth.now();
+
+    public Long getLength() {
+        return length;
+    }
+
+    public void setLength(Long length) {
+        this.length = length;
+    }
+
+    public Artist getArtist() {
+        return artist;
+    }
+ 
+    public void setArtist(Artist artist) {
+        this.artist = artist;
+    }
+
+    public YearMonth getRecordedOn() {
+        return recordedOn;
+    }
+
+    public void setRecordedOn(YearMonth recordedOn) {
+        this.recordedOn = recordedOn;
+    }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/SongRepository.java b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/SongRepository.java
new file mode 100644
index 0000000000..e79e88108b
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/SongRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.hibernate.types;
+
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SongRepository extends CrudRepository<Song, Long> {
+}
diff --git a/persistence-modules/hibernate-types/src/main/resources/application.properties b/persistence-modules/hibernate-types/src/main/resources/application.properties
new file mode 100644
index 0000000000..bcd21578dd
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/resources/application.properties
@@ -0,0 +1,21 @@
+log4jdbc.dump.sql.addsemicolon=true
+log4jdbc.dump.sql.maxlinelength=0
+log4jdbc.trim.sql.extrablanklines=false
+logging.level.jdbc.audit=fatal
+logging.level.jdbc.connection=fatal
+logging.level.jdbc.resultset=fatal
+logging.level.jdbc.resultsettable=info
+logging.level.jdbc.sqlonly=fatal
+logging.level.jdbc.sqltiming=info
+# logging.level.org.hibernate.SQL=DEBUG
+# logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
+# logging.level.org.hibernate.type.descriptor.sql=trace
+# logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
+# logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE
+spring.datasource.url=jdbc:mysql://localhost:53306/hibernate_types?serverTimezone=UTC&useSSL=false
+spring.datasource.username=root
+spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
+spring.jpa.hibernate.ddl-auto=create
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
+# spring.jpa.properties.hibernate.format_sql=false
+# spring.jpa.show-sql=false
\ No newline at end of file
diff --git a/persistence-modules/hibernate-types/src/main/resources/hibernate-types.properties b/persistence-modules/hibernate-types/src/main/resources/hibernate-types.properties
new file mode 100644
index 0000000000..226b50fafd
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/main/resources/hibernate-types.properties
@@ -0,0 +1 @@
+hibernate.types.print.banner=false
diff --git a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
new file mode 100644
index 0000000000..cf3c34777e
--- /dev/null
+++ b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
@@ -0,0 +1,182 @@
+package com.baeldung.hibernate.types;
+
+import com.google.common.collect.Lists;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.time.Duration;
+import java.time.YearMonth;
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+public class HibernateTypesIntegrationTest {
+
+    @Autowired
+    AlbumRepository albumRepository;
+
+    @Autowired
+    SongRepository songRepository;
+
+    private void deleteAll() {
+        albumRepository.deleteAll();
+        songRepository.deleteAll();
+    }
+
+    @BeforeEach
+    public void setUp() {
+        deleteAll();
+    }
+
+    @BeforeEach
+    public void tearDown() {
+        setUp();
+    }
+
+
+    @Test
+    void hibernateTypeJsonTest() {
+        Album nullAlbum = new Album();
+        nullAlbum = albumRepository.save(nullAlbum);
+
+        Song nullSong = new Song();
+        nullSong = songRepository.save(nullSong);
+
+        Artist artist0 = new Artist();
+        artist0.setCountry("England");
+        artist0.setGenre("Pop");
+        artist0.setName("Superstar");
+
+        Song song0 = new Song();
+        song0.setArtist(artist0);
+        song0.setName("A Happy Song");
+        song0.setLength(Duration.ofMinutes(4).getSeconds());
+        song0 = songRepository.save(song0);
+
+        Song song1 = new Song();
+        song1.setArtist(artist0);
+        song1.setName("A Sad Song");
+        song1.setLength(Duration.ofMinutes(2).getSeconds());
+        song1 = songRepository.save(song1);
+
+        Song song2 = new Song();
+        song2.setArtist(artist0);
+        song2.setName("Another Happy Song");
+        song2.setLength(Duration.ofMinutes(3).getSeconds());
+        song2 = songRepository.save(song2);
+
+        Artist artist1 = new Artist();
+        artist1.setCountry("Jamaica");
+        artist1.setGenre("Reggae");
+        artist1.setName("Newcomer");
+
+        Song song3 = new Song();
+        song3.setArtist(artist1);
+        song3.setName("A New Song");
+        song3.setLength(Duration.ofMinutes(5).getSeconds());
+        song3 = songRepository.save(song3);
+
+        CoverArt album0CoverArt = new CoverArt();
+        album0CoverArt.setUpcCode(UUID.randomUUID().toString());
+        album0CoverArt.setFrontCoverArtUrl("http://fakeurl-0");
+        album0CoverArt.setBackCoverArtUrl("http://fakeurl-1");
+
+        Album album0 = new Album();
+        album0.setCoverArt(album0CoverArt);
+        album0.setName("Album 0");
+        album0.setSong(Lists.newArrayList(song0, song1, song2));
+        album0 = albumRepository.save(album0);
+
+        CoverArt album1CoverArt = new CoverArt();
+        album1CoverArt.setUpcCode(UUID.randomUUID().toString());
+        album1CoverArt.setFrontCoverArtUrl("http://fakeurl-2");
+        album1CoverArt.setBackCoverArtUrl("http://fakeurl-3");
+
+        Album album1 = new Album();
+        album1.setCoverArt(album1CoverArt);
+        album1.setName("Album 1");
+        album1.setSong(Lists.newArrayList(song3));
+        albumRepository.save(album1);
+
+        Iterable<Album> queryAlbumsResult = albumRepository.findAll();
+        assertThat(queryAlbumsResult).hasSize(3);
+
+        Iterable<Song> querySongsResult = songRepository.findAll();
+        assertThat(querySongsResult).hasSize(5);
+
+        Album queryAlbumResult;
+
+        queryAlbumResult = albumRepository.findById(nullAlbum.getId()).get();
+        assertThat(queryAlbumResult.getName()).isNull();
+        assertThat(queryAlbumResult.getCoverArt()).isNull();
+        assertThat(queryAlbumResult.getSongs()).isNullOrEmpty();
+
+        queryAlbumResult = albumRepository.findById(album0.getId()).get();
+        assertThat(queryAlbumResult.getName()).isEqualTo("Album 0");
+        assertThat(queryAlbumResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-0");
+        assertThat(queryAlbumResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-1");
+        assertThat(queryAlbumResult.getSongs()).hasSize(3);
+        assertThat(queryAlbumResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(song0, song1, song2);
+
+        queryAlbumResult = albumRepository.findById(album1.getId()).get();
+        assertThat(queryAlbumResult.getName()).isEqualTo("Album 1");
+        assertThat(queryAlbumResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-2");
+        assertThat(queryAlbumResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-3");
+        assertThat(queryAlbumResult.getSongs()).hasSize(1);
+        assertThat(queryAlbumResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(song3);
+
+        Song querySongResult;
+
+        querySongResult = songRepository.findById(nullSong.getId()).get();
+        assertThat(querySongResult.getName()).isNull();
+        assertThat(querySongResult.getLength()).isZero();
+        assertThat(querySongResult.getArtist()).isNull();
+
+        querySongResult = songRepository.findById(song0.getId()).get();
+        assertThat(querySongResult.getName()).isEqualTo("A Happy Song");
+        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(4).getSeconds());
+        assertThat(querySongResult.getArtist().getName()).isEqualTo("Superstar");
+        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Pop");
+        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("England");
+
+        querySongResult = songRepository.findById(song1.getId()).get();
+        assertThat(querySongResult.getName()).isEqualTo("A Sad Song");
+        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(2).getSeconds());
+        assertThat(querySongResult.getArtist().getName()).isEqualTo("Superstar");
+        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Pop");
+        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("England");
+
+        querySongResult = songRepository.findById(song2.getId()).get();
+        assertThat(querySongResult.getName()).isEqualTo("Another Happy Song");
+        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(3).getSeconds());
+        assertThat(querySongResult.getArtist().getName()).isEqualTo("Superstar");
+        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Pop");
+        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("England");
+
+        querySongResult = songRepository.findById(song3.getId()).get();
+        assertThat(querySongResult.getName()).isEqualTo("A New Song");
+        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(5).getSeconds());
+        assertThat(querySongResult.getArtist().getName()).isEqualTo("Newcomer");
+        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Reggae");
+        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("Jamaica");
+    }
+
+    @Test
+    void hibernateTypeYearMonthTest() {
+        Song mySong = new Song();
+        YearMonth now = YearMonth.of(2019, 12);
+        mySong.setArtist(new Artist());
+        mySong.setName("My Song");
+        mySong.setLength(Duration.ofMinutes(1).getSeconds());
+        mySong.setRecordedOn(now);
+        mySong = songRepository.save(mySong);
+
+        Song queryResult;
+        queryResult = songRepository.findById(mySong.getId()).get();
+        assertThat(queryResult.getRecordedOn().getYear()).isEqualTo(2019);
+        assertThat(queryResult.getRecordedOn().getMonthValue()).isEqualTo(12);
+    }
+}
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index ec7f0bcec2..4d39b2d98b 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -24,6 +24,7 @@
         <module>hibernate-mapping</module> <!-- long running -->
         <module>hibernate-ogm</module>
         <module>hibernate-annotations</module>
+        <module>hibernate-types</module>
         <module>hibernate-jpa</module>
         <module>hibernate-queries</module>
         <module>hibernate-enterprise</module>

From 4426454a9aa71e43def26b27e0912c84ad06b0f4 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 07:42:28 -0400
Subject: [PATCH 078/404] Fixup variable names

---
 .../types/HibernateTypesIntegrationTest.java  | 212 +++++++++---------
 1 file changed, 106 insertions(+), 106 deletions(-)

diff --git a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
index cf3c34777e..af28eadfb8 100644
--- a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
+++ b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
@@ -38,134 +38,134 @@ public class HibernateTypesIntegrationTest {
 
 
     @Test
-    void hibernateTypeJsonTest() {
-        Album nullAlbum = new Album();
-        nullAlbum = albumRepository.save(nullAlbum);
+    void whenSavingHibernateTypes_thenTheCorrectJsonIsStoredInTheDatabase() {
+        Album emptyAlbum = new Album();
+        emptyAlbum = albumRepository.save(emptyAlbum);
 
-        Song nullSong = new Song();
-        nullSong = songRepository.save(nullSong);
+        Song emptySong = new Song();
+        emptySong = songRepository.save(emptySong);
 
-        Artist artist0 = new Artist();
-        artist0.setCountry("England");
-        artist0.setGenre("Pop");
-        artist0.setName("Superstar");
+        Artist superstarArtist = new Artist();
+        superstarArtist.setCountry("England");
+        superstarArtist.setGenre("Pop");
+        superstarArtist.setName("Superstar");
 
-        Song song0 = new Song();
-        song0.setArtist(artist0);
-        song0.setName("A Happy Song");
-        song0.setLength(Duration.ofMinutes(4).getSeconds());
-        song0 = songRepository.save(song0);
+        Song aHappySong = new Song();
+        aHappySong.setArtist(superstarArtist);
+        aHappySong.setName("A Happy Song");
+        aHappySong.setLength(Duration.ofMinutes(4).getSeconds());
+        aHappySong = songRepository.save(aHappySong);
 
-        Song song1 = new Song();
-        song1.setArtist(artist0);
-        song1.setName("A Sad Song");
-        song1.setLength(Duration.ofMinutes(2).getSeconds());
-        song1 = songRepository.save(song1);
+        Song aSadSong = new Song();
+        aSadSong.setArtist(superstarArtist);
+        aSadSong.setName("A Sad Song");
+        aSadSong.setLength(Duration.ofMinutes(2).getSeconds());
+        aSadSong = songRepository.save(aSadSong);
 
-        Song song2 = new Song();
-        song2.setArtist(artist0);
-        song2.setName("Another Happy Song");
-        song2.setLength(Duration.ofMinutes(3).getSeconds());
-        song2 = songRepository.save(song2);
+        Song anotherHappySong = new Song();
+        anotherHappySong.setArtist(superstarArtist);
+        anotherHappySong.setName("Another Happy Song");
+        anotherHappySong.setLength(Duration.ofMinutes(3).getSeconds());
+        anotherHappySong = songRepository.save(anotherHappySong);
 
-        Artist artist1 = new Artist();
-        artist1.setCountry("Jamaica");
-        artist1.setGenre("Reggae");
-        artist1.setName("Newcomer");
+        Artist newcomer = new Artist();
+        newcomer.setCountry("Jamaica");
+        newcomer.setGenre("Reggae");
+        newcomer.setName("Newcomer");
 
-        Song song3 = new Song();
-        song3.setArtist(artist1);
-        song3.setName("A New Song");
-        song3.setLength(Duration.ofMinutes(5).getSeconds());
-        song3 = songRepository.save(song3);
+        Song aNewSong = new Song();
+        aNewSong.setArtist(newcomer);
+        aNewSong.setName("A New Song");
+        aNewSong.setLength(Duration.ofMinutes(5).getSeconds());
+        aNewSong = songRepository.save(aNewSong);
 
-        CoverArt album0CoverArt = new CoverArt();
-        album0CoverArt.setUpcCode(UUID.randomUUID().toString());
-        album0CoverArt.setFrontCoverArtUrl("http://fakeurl-0");
-        album0CoverArt.setBackCoverArtUrl("http://fakeurl-1");
+        CoverArt superstarAlbumCoverArt = new CoverArt();
+        superstarAlbumCoverArt.setUpcCode(UUID.randomUUID().toString());
+        superstarAlbumCoverArt.setFrontCoverArtUrl("http://fakeurl-0");
+        superstarAlbumCoverArt.setBackCoverArtUrl("http://fakeurl-1");
 
-        Album album0 = new Album();
-        album0.setCoverArt(album0CoverArt);
-        album0.setName("Album 0");
-        album0.setSong(Lists.newArrayList(song0, song1, song2));
-        album0 = albumRepository.save(album0);
+        Album superstarAlbum = new Album();
+        superstarAlbum.setCoverArt(superstarAlbumCoverArt);
+        superstarAlbum.setName("The Superstar Album");
+        superstarAlbum.setSong(Lists.newArrayList(aHappySong, aSadSong, anotherHappySong));
+        superstarAlbum = albumRepository.save(superstarAlbum);
 
-        CoverArt album1CoverArt = new CoverArt();
-        album1CoverArt.setUpcCode(UUID.randomUUID().toString());
-        album1CoverArt.setFrontCoverArtUrl("http://fakeurl-2");
-        album1CoverArt.setBackCoverArtUrl("http://fakeurl-3");
+        CoverArt newcomerAlbumCoverArt = new CoverArt();
+        newcomerAlbumCoverArt.setUpcCode(UUID.randomUUID().toString());
+        newcomerAlbumCoverArt.setFrontCoverArtUrl("http://fakeurl-2");
+        newcomerAlbumCoverArt.setBackCoverArtUrl("http://fakeurl-3");
 
-        Album album1 = new Album();
-        album1.setCoverArt(album1CoverArt);
-        album1.setName("Album 1");
-        album1.setSong(Lists.newArrayList(song3));
-        albumRepository.save(album1);
+        Album newcomerAlbum = new Album();
+        newcomerAlbum.setCoverArt(newcomerAlbumCoverArt);
+        newcomerAlbum.setName("The Newcomer Album");
+        newcomerAlbum.setSong(Lists.newArrayList(aNewSong));
+        albumRepository.save(newcomerAlbum);
 
-        Iterable<Album> queryAlbumsResult = albumRepository.findAll();
-        assertThat(queryAlbumsResult).hasSize(3);
+        Iterable<Album> selectAlbumsQueryResult = albumRepository.findAll();
+        assertThat(selectAlbumsQueryResult).hasSize(3);
 
-        Iterable<Song> querySongsResult = songRepository.findAll();
-        assertThat(querySongsResult).hasSize(5);
+        Iterable<Song> selectSongsQueryResult = songRepository.findAll();
+        assertThat(selectSongsQueryResult).hasSize(5);
 
-        Album queryAlbumResult;
+        Album selectAlbumQueryResult;
 
-        queryAlbumResult = albumRepository.findById(nullAlbum.getId()).get();
-        assertThat(queryAlbumResult.getName()).isNull();
-        assertThat(queryAlbumResult.getCoverArt()).isNull();
-        assertThat(queryAlbumResult.getSongs()).isNullOrEmpty();
+        selectAlbumQueryResult = albumRepository.findById(emptyAlbum.getId()).get();
+        assertThat(selectAlbumQueryResult.getName()).isNull();
+        assertThat(selectAlbumQueryResult.getCoverArt()).isNull();
+        assertThat(selectAlbumQueryResult.getSongs()).isNullOrEmpty();
 
-        queryAlbumResult = albumRepository.findById(album0.getId()).get();
-        assertThat(queryAlbumResult.getName()).isEqualTo("Album 0");
-        assertThat(queryAlbumResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-0");
-        assertThat(queryAlbumResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-1");
-        assertThat(queryAlbumResult.getSongs()).hasSize(3);
-        assertThat(queryAlbumResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(song0, song1, song2);
+        selectAlbumQueryResult = albumRepository.findById(superstarAlbum.getId()).get();
+        assertThat(selectAlbumQueryResult.getName()).isEqualTo("Album 0");
+        assertThat(selectAlbumQueryResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-0");
+        assertThat(selectAlbumQueryResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-1");
+        assertThat(selectAlbumQueryResult.getSongs()).hasSize(3);
+        assertThat(selectAlbumQueryResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(aHappySong, aSadSong, anotherHappySong);
 
-        queryAlbumResult = albumRepository.findById(album1.getId()).get();
-        assertThat(queryAlbumResult.getName()).isEqualTo("Album 1");
-        assertThat(queryAlbumResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-2");
-        assertThat(queryAlbumResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-3");
-        assertThat(queryAlbumResult.getSongs()).hasSize(1);
-        assertThat(queryAlbumResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(song3);
+        selectAlbumQueryResult = albumRepository.findById(superstarAlbum.getId()).get();
+        assertThat(selectAlbumQueryResult.getName()).isEqualTo("Album 1");
+        assertThat(selectAlbumQueryResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-2");
+        assertThat(selectAlbumQueryResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-3");
+        assertThat(selectAlbumQueryResult.getSongs()).hasSize(1);
+        assertThat(selectAlbumQueryResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(aNewSong);
 
-        Song querySongResult;
+        Song selectSongQueryResult;
 
-        querySongResult = songRepository.findById(nullSong.getId()).get();
-        assertThat(querySongResult.getName()).isNull();
-        assertThat(querySongResult.getLength()).isZero();
-        assertThat(querySongResult.getArtist()).isNull();
+        selectSongQueryResult = songRepository.findById(emptySong.getId()).get();
+        assertThat(selectSongQueryResult.getName()).isNull();
+        assertThat(selectSongQueryResult.getLength()).isZero();
+        assertThat(selectSongQueryResult.getArtist()).isNull();
 
-        querySongResult = songRepository.findById(song0.getId()).get();
-        assertThat(querySongResult.getName()).isEqualTo("A Happy Song");
-        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(4).getSeconds());
-        assertThat(querySongResult.getArtist().getName()).isEqualTo("Superstar");
-        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Pop");
-        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("England");
+        selectSongQueryResult = songRepository.findById(aHappySong.getId()).get();
+        assertThat(selectSongQueryResult.getName()).isEqualTo("A Happy Song");
+        assertThat(selectSongQueryResult.getLength()).isEqualTo(Duration.ofMinutes(4).getSeconds());
+        assertThat(selectSongQueryResult.getArtist().getName()).isEqualTo("Superstar");
+        assertThat(selectSongQueryResult.getArtist().getGenre()).isEqualTo("Pop");
+        assertThat(selectSongQueryResult.getArtist().getCountry()).isEqualTo("England");
 
-        querySongResult = songRepository.findById(song1.getId()).get();
-        assertThat(querySongResult.getName()).isEqualTo("A Sad Song");
-        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(2).getSeconds());
-        assertThat(querySongResult.getArtist().getName()).isEqualTo("Superstar");
-        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Pop");
-        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("England");
+        selectSongQueryResult = songRepository.findById(aSadSong.getId()).get();
+        assertThat(selectSongQueryResult.getName()).isEqualTo("A Sad Song");
+        assertThat(selectSongQueryResult.getLength()).isEqualTo(Duration.ofMinutes(2).getSeconds());
+        assertThat(selectSongQueryResult.getArtist().getName()).isEqualTo("Superstar");
+        assertThat(selectSongQueryResult.getArtist().getGenre()).isEqualTo("Pop");
+        assertThat(selectSongQueryResult.getArtist().getCountry()).isEqualTo("England");
 
-        querySongResult = songRepository.findById(song2.getId()).get();
-        assertThat(querySongResult.getName()).isEqualTo("Another Happy Song");
-        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(3).getSeconds());
-        assertThat(querySongResult.getArtist().getName()).isEqualTo("Superstar");
-        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Pop");
-        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("England");
+        selectSongQueryResult = songRepository.findById(anotherHappySong.getId()).get();
+        assertThat(selectSongQueryResult.getName()).isEqualTo("Another Happy Song");
+        assertThat(selectSongQueryResult.getLength()).isEqualTo(Duration.ofMinutes(3).getSeconds());
+        assertThat(selectSongQueryResult.getArtist().getName()).isEqualTo("Superstar");
+        assertThat(selectSongQueryResult.getArtist().getGenre()).isEqualTo("Pop");
+        assertThat(selectSongQueryResult.getArtist().getCountry()).isEqualTo("England");
 
-        querySongResult = songRepository.findById(song3.getId()).get();
-        assertThat(querySongResult.getName()).isEqualTo("A New Song");
-        assertThat(querySongResult.getLength()).isEqualTo(Duration.ofMinutes(5).getSeconds());
-        assertThat(querySongResult.getArtist().getName()).isEqualTo("Newcomer");
-        assertThat(querySongResult.getArtist().getGenre()).isEqualTo("Reggae");
-        assertThat(querySongResult.getArtist().getCountry()).isEqualTo("Jamaica");
+        selectSongQueryResult = songRepository.findById(aNewSong.getId()).get();
+        assertThat(selectSongQueryResult.getName()).isEqualTo("A New Song");
+        assertThat(selectSongQueryResult.getLength()).isEqualTo(Duration.ofMinutes(5).getSeconds());
+        assertThat(selectSongQueryResult.getArtist().getName()).isEqualTo("Newcomer");
+        assertThat(selectSongQueryResult.getArtist().getGenre()).isEqualTo("Reggae");
+        assertThat(selectSongQueryResult.getArtist().getCountry()).isEqualTo("Jamaica");
     }
 
     @Test
-    void hibernateTypeYearMonthTest() {
+    void whenSavingAHibernateTypeYearMonth_thenTheCorrectValueIsStoredInTheDatabase() {
         Song mySong = new Song();
         YearMonth now = YearMonth.of(2019, 12);
         mySong.setArtist(new Artist());
@@ -174,9 +174,9 @@ public class HibernateTypesIntegrationTest {
         mySong.setRecordedOn(now);
         mySong = songRepository.save(mySong);
 
-        Song queryResult;
-        queryResult = songRepository.findById(mySong.getId()).get();
-        assertThat(queryResult.getRecordedOn().getYear()).isEqualTo(2019);
-        assertThat(queryResult.getRecordedOn().getMonthValue()).isEqualTo(12);
+        Song selectSongQueryResult;
+        selectSongQueryResult = songRepository.findById(mySong.getId()).get();
+        assertThat(selectSongQueryResult.getRecordedOn().getYear()).isEqualTo(2019);
+        assertThat(selectSongQueryResult.getRecordedOn().getMonthValue()).isEqualTo(12);
     }
 }

From a667a0191a4bc099ce92e1acf09455412938f073 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 07:48:01 -0400
Subject: [PATCH 079/404] Fix integration test

---
 .../hibernate/types/HibernateTypesIntegrationTest.java      | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
index af28eadfb8..08d4cf919d 100644
--- a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
+++ b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
@@ -115,14 +115,14 @@ public class HibernateTypesIntegrationTest {
         assertThat(selectAlbumQueryResult.getSongs()).isNullOrEmpty();
 
         selectAlbumQueryResult = albumRepository.findById(superstarAlbum.getId()).get();
-        assertThat(selectAlbumQueryResult.getName()).isEqualTo("Album 0");
+        assertThat(selectAlbumQueryResult.getName()).isEqualTo("The Superstar Album");
         assertThat(selectAlbumQueryResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-0");
         assertThat(selectAlbumQueryResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-1");
         assertThat(selectAlbumQueryResult.getSongs()).hasSize(3);
         assertThat(selectAlbumQueryResult.getSongs()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder(aHappySong, aSadSong, anotherHappySong);
 
-        selectAlbumQueryResult = albumRepository.findById(superstarAlbum.getId()).get();
-        assertThat(selectAlbumQueryResult.getName()).isEqualTo("Album 1");
+        selectAlbumQueryResult = albumRepository.findById(newcomerAlbum.getId()).get();
+        assertThat(selectAlbumQueryResult.getName()).isEqualTo("The Newcomer Album");
         assertThat(selectAlbumQueryResult.getCoverArt().getFrontCoverArtUrl()).isEqualTo("http://fakeurl-2");
         assertThat(selectAlbumQueryResult.getCoverArt().getBackCoverArtUrl()).isEqualTo("http://fakeurl-3");
         assertThat(selectAlbumQueryResult.getSongs()).hasSize(1);

From dc3f7039cb7c38e4ef07fdcb6d09de265fbc07df Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 13:41:10 -0400
Subject: [PATCH 080/404] Revert "Fixup styling"

This reverts commit 72addaf8c354879197e0c252e4d8153cc54e0e2c.
---
 .../architecture/application/task/AddNewDailyTask.java         | 2 +-
 .../com/baeldung/architecture/commands/task/CreateTask.java    | 2 +-
 .../com/baeldung/architecture/commands/task/GetAllTasks.java   | 2 +-
 .../com/baeldung/architecture/domain/task/TaskService.java     | 2 +-
 .../com/baeldung/architecture/framework/cli/StartupRunner.java | 2 +-
 .../architecture/framework/http/task/TaskApiController.java    | 2 +-
 .../baeldung/architecture/framework/http/task/TaskRequest.java | 3 ++-
 7 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
index f9ee97542c..208d1bfcc9 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
@@ -26,4 +26,4 @@ public class AddNewDailyTask implements CreateTask {
             addNewTask.create(task);
         }
     }
-}
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
index ec60868a22..26e6da10e2 100644
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
@@ -4,4 +4,4 @@ import com.baeldung.architecture.domain.task.Task;
 
 public interface CreateTask {
     public void create(Task newTask);
-}
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
index c9aa1be5f8..d3c40db92f 100644
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
@@ -4,4 +4,4 @@ import com.baeldung.architecture.domain.task.Task;
 
 public interface GetAllTasks {
     public Iterable<Task> getAll();
-}
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
index 11ef0f3e19..cace0614ad 100644
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
@@ -19,4 +19,4 @@ public class TaskService {
         return taskRepository.findAll();
     }
 
-}
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
index 449bc9386e..cf38e5ee5e 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -21,4 +21,4 @@ public class StartupRunner implements ApplicationRunner {
         task.setDescription("Startup Task");
         addNewDailyTask.create(task);
     }
-}
+}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
index 87a8f5fe4b..c6f7bff2dd 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
@@ -39,4 +39,4 @@ public class TaskApiController {
         task.setDueDate(Instant.parse(taskRequest.getDueDate()));
         addNewTask.create(task);
     }
-}
+}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
index 70b98a32f9..2e353b079a 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
@@ -25,4 +25,5 @@ public class TaskRequest {
     public void setDueDate(String dueDate) {
         this.dueDate = dueDate;
     }
-} 
+
+} 
\ No newline at end of file

From a2efde1d8707cb85898c6fb0eb5321ab0dce392d Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 13:41:33 -0400
Subject: [PATCH 081/404] Revert "Fixup styling"

This reverts commit 6cb35dd535bfddad1243feaae2f3d2af0dc932d7.
---
 .../architecture/HexagonalArchitectureTaskApplication.java  | 6 +++---
 .../baeldung/architecture/application/task/AddNewTask.java  | 2 +-
 .../baeldung/architecture/application/task/GetTasks.java    | 2 +-
 .../baeldung/architecture/framework/cli/StartupRunner.java  | 1 +
 4 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
index 69c6f4b276..83e4fc4c0b 100644
--- a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
+++ b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
@@ -5,8 +5,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 public class HexagonalArchitectureTaskApplication {
-    public static void main(String[] args) {
-        SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
-    }
+	public static void main(String[] args) {
+		SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
+	}
 
 }
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
index 70638378f9..2e5aff4a53 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
@@ -19,4 +19,4 @@ public class AddNewTask implements CreateTask {
     public void create(Task newTask) {
         taskService.createTask(newTask);
     }
-}
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
index c876f7de85..54539290ba 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
@@ -19,4 +19,4 @@ public class GetTasks implements GetAllTasks {
     public Iterable<Task> getAll() {
         return taskService.getAllTasks();
     }
-}
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
index cf38e5ee5e..260c033b71 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -17,6 +17,7 @@ public class StartupRunner implements ApplicationRunner {
     }
     @Override
     public void run(ApplicationArguments args) throws Exception {
+        System.out.println("Adding daily tasks");
         Task task = new Task();
         task.setDescription("Startup Task");
         addNewDailyTask.create(task);

From 6008e4446787ab8e4a638fabfb5f734e39ecc384 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 13:41:47 -0400
Subject: [PATCH 082/404] Revert "Add architecture module with Hexagonal
 example"

This reverts commit 50efbf3dfb3a951d276c13ab3b8f1a0cadb114d4.
---
 architecture/README.md                        |  3 --
 architecture/pom.xml                          | 33 ------------
 .../HexagonalArchitectureTaskApplication.java | 12 -----
 .../application/task/AddNewDailyTask.java     | 29 ----------
 .../application/task/AddNewTask.java          | 22 --------
 .../application/task/GetTasks.java            | 22 --------
 .../commands/task/CreateTask.java             |  7 ---
 .../commands/task/GetAllTasks.java            |  7 ---
 .../architecture/domain/task/Task.java        | 53 -------------------
 .../domain/task/TaskRepository.java           |  7 ---
 .../architecture/domain/task/TaskService.java | 22 --------
 .../framework/cli/StartupRunner.java          | 25 ---------
 .../http/task/TaskApiController.java          | 42 ---------------
 .../framework/http/task/TaskRequest.java      | 29 ----------
 14 files changed, 313 deletions(-)
 delete mode 100644 architecture/README.md
 delete mode 100644 architecture/pom.xml
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
 delete mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java

diff --git a/architecture/README.md b/architecture/README.md
deleted file mode 100644
index be093f25ed..0000000000
--- a/architecture/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant articles
-
-- [A Quick and Practical Example of Hexagonal Architecture in Java](https://www.baeldung.com/a-quick-and-practical-example-of-hexagonal-architecture-in-java-3/)
diff --git a/architecture/pom.xml b/architecture/pom.xml
deleted file mode 100644
index 4ad104293e..0000000000
--- a/architecture/pom.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.architecture</groupId>
-    <artifactId>architecture</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>architecture</name>
-    <packaging>jar</packaging>
-    <description>A Quick and Practical Example of Hexagonal Architecture in Java</description>
-
-    <parent>
-        <artifactId>parent-boot-2</artifactId>
-        <groupId>com.baeldung</groupId>
-        <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-2</relativePath>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
deleted file mode 100644
index 83e4fc4c0b..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.architecture;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class HexagonalArchitectureTaskApplication {
-	public static void main(String[] args) {
-		SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
-	}
-
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
deleted file mode 100644
index 208d1bfcc9..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.architecture.application.task;
-
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-
-import com.baeldung.architecture.commands.task.CreateTask;
-import com.baeldung.architecture.domain.task.Task;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class AddNewDailyTask implements CreateTask {
-
-    private AddNewTask addNewTask;
-
-    public AddNewDailyTask(AddNewTask addNewTask) {
-        this.addNewTask = addNewTask;
-    }
-
-    @Override
-    public void create(Task newTask) {
-        Instant initialDueDate = newTask.getDueDate();
-        String description = newTask.getDescription();
-        for (int i = 1; i <= 5; i++) {
-            Task task = new Task(initialDueDate.plus(i, ChronoUnit.DAYS), description);
-            addNewTask.create(task);
-        }
-    }
-};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
deleted file mode 100644
index 2e5aff4a53..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.architecture.application.task;
-
-import com.baeldung.architecture.domain.task.Task;
-import com.baeldung.architecture.domain.task.TaskService;
-import com.baeldung.architecture.commands.task.*;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class AddNewTask implements CreateTask {
-
-    private TaskService taskService;
-
-    public AddNewTask(TaskService taskService) {
-        this.taskService = taskService;
-    }
-
-    @Override
-    public void create(Task newTask) {
-        taskService.createTask(newTask);
-    }
-};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
deleted file mode 100644
index 54539290ba..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.architecture.application.task;
-
-import com.baeldung.architecture.domain.task.Task;
-import com.baeldung.architecture.domain.task.TaskService;
-import com.baeldung.architecture.commands.task.*;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class GetTasks implements GetAllTasks {
-
-    private TaskService taskService;
-
-    public GetTasks(TaskService taskService) {
-        this.taskService = taskService;
-    }
-
-    @Override
-    public Iterable<Task> getAll() {
-        return taskService.getAllTasks();
-    }
-};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
deleted file mode 100644
index 26e6da10e2..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.architecture.commands.task;
-
-import com.baeldung.architecture.domain.task.Task;
-
-public interface CreateTask {
-    public void create(Task newTask);
-};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
deleted file mode 100644
index d3c40db92f..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.architecture.commands.task;
-
-import com.baeldung.architecture.domain.task.Task;
-
-public interface GetAllTasks {
-    public Iterable<Task> getAll();
-};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
deleted file mode 100644
index 240dc33571..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.baeldung.architecture.domain.task;
-
-import java.time.Instant;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-@Entity
-public class Task {
-    @Id
-    @GeneratedValue(strategy=GenerationType.AUTO)
-    private Long id;
-    private Instant dueDate = Instant.now();
-    private String description;
-
-    public Task() {}
-
-    public Task(Instant dueDate, String description) {
-        this.dueDate = dueDate;
-        this.description = description;
-    }
-
-    public Task(Long id, Instant dueDate, String description) {
-        this(dueDate, description);
-        this.id = id;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Instant getDueDate() {
-        return dueDate;
-    }
-
-    public void setDueDate(Instant dueDate) {
-        this.dueDate = dueDate;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
deleted file mode 100644
index d896212714..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.architecture.domain.task;
-
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface TaskRepository extends CrudRepository<Task, Long> {};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
deleted file mode 100644
index cace0614ad..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.architecture.domain.task;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class TaskService {
-
-    private TaskRepository taskRepository;
-
-    public TaskService(TaskRepository taskRepository) {
-        this.taskRepository = taskRepository;
-    }
-
-    public void createTask(Task task) {
-        taskRepository.save(task);
-    }
-
-    public Iterable<Task> getAllTasks() {
-        return taskRepository.findAll();
-    }
-
-};
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
deleted file mode 100644
index 260c033b71..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.architecture.framework.cli;
-
-import com.baeldung.architecture.application.task.AddNewDailyTask;
-import com.baeldung.architecture.domain.task.Task;
-
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-@Component
-public class StartupRunner implements ApplicationRunner {
-
-    AddNewDailyTask addNewDailyTask;
-
-    public StartupRunner(AddNewDailyTask addNewDailyTask) {
-        this.addNewDailyTask = addNewDailyTask;
-    }
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        System.out.println("Adding daily tasks");
-        Task task = new Task();
-        task.setDescription("Startup Task");
-        addNewDailyTask.create(task);
-    }
-}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
deleted file mode 100644
index c6f7bff2dd..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.baeldung.architecture.framework.http.task;
-
-import java.time.Instant;
-
-import com.baeldung.architecture.application.task.AddNewTask;
-import com.baeldung.architecture.application.task.GetTasks;
-import com.baeldung.architecture.domain.task.Task;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("task")
-public class TaskApiController {
-
-    private AddNewTask addNewTask;
-    private GetTasks getTasks;
-
-    public TaskApiController(
-        AddNewTask addNewTask,
-        GetTasks getTasks
-    ) {
-        this.addNewTask = addNewTask;
-        this.getTasks = getTasks;
-    }
-
-    @GetMapping
-    Iterable<Task> listTasks() {
-        return getTasks.getAll();
-    }
-
-    @PostMapping(consumes = "application/json", produces = "application/json")
-    void createTask(@RequestBody TaskRequest taskRequest) {
-        Task task = new Task();
-        task.setDescription(taskRequest.getDescription());
-        task.setDueDate(Instant.parse(taskRequest.getDueDate()));
-        addNewTask.create(task);
-    }
-}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
deleted file mode 100644
index 2e353b079a..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.architecture.framework.http.task;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-
-public class TaskRequest {
-    @JsonInclude(Include.NON_NULL)
-    private String description;
-
-    @JsonInclude(Include.NON_NULL)
-    private String dueDate;
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getDueDate() {
-        return dueDate;
-    }
-
-    public void setDueDate(String dueDate) {
-        this.dueDate = dueDate;
-    }
-
-} 
\ No newline at end of file

From cabe3381634a24af850c504ae76ac9844e2d70fe Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 13:59:02 -0400
Subject: [PATCH 083/404] Update application.properties

---
 .../src/main/resources/application.properties              | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/persistence-modules/hibernate-types/src/main/resources/application.properties b/persistence-modules/hibernate-types/src/main/resources/application.properties
index bcd21578dd..9588139eb0 100644
--- a/persistence-modules/hibernate-types/src/main/resources/application.properties
+++ b/persistence-modules/hibernate-types/src/main/resources/application.properties
@@ -7,15 +7,8 @@ logging.level.jdbc.resultset=fatal
 logging.level.jdbc.resultsettable=info
 logging.level.jdbc.sqlonly=fatal
 logging.level.jdbc.sqltiming=info
-# logging.level.org.hibernate.SQL=DEBUG
-# logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
-# logging.level.org.hibernate.type.descriptor.sql=trace
-# logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
-# logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE
 spring.datasource.url=jdbc:mysql://localhost:53306/hibernate_types?serverTimezone=UTC&useSSL=false
 spring.datasource.username=root
 spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
 spring.jpa.hibernate.ddl-auto=create
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
-# spring.jpa.properties.hibernate.format_sql=false
-# spring.jpa.show-sql=false
\ No newline at end of file

From e91d8d6a6cc9fe1fbb0ad3ea66f6277bb6c37193 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 25 Apr 2020 14:33:28 -0400
Subject: [PATCH 084/404] Update pom

---
 persistence-modules/hibernate-types/pom.xml                     | 2 +-
 .../baeldung/hibernate/types/HibernateTypesIntegrationTest.java | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/persistence-modules/hibernate-types/pom.xml b/persistence-modules/hibernate-types/pom.xml
index 9fa5d66347..4d686c72a5 100644
--- a/persistence-modules/hibernate-types/pom.xml
+++ b/persistence-modules/hibernate-types/pom.xml
@@ -205,7 +205,7 @@
         <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
         <maven.surefire.version>2.22.2</maven.surefire.version>
         <maven.compiler.version>3.8.1</maven.compiler.version>
-        <maven.version>3.7.0</maven.version>
+        <maven.version>3.8.1</maven.version>
         <mysql.version>8.0.19</mysql.version>
         <slf4j.version>1.7.30</slf4j.version>
         <spring-boot.version>2.1.3.RELEASE</spring-boot.version>
diff --git a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
index 08d4cf919d..9d7479e77d 100644
--- a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
+++ b/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
@@ -36,7 +36,6 @@ public class HibernateTypesIntegrationTest {
         setUp();
     }
 
-
     @Test
     void whenSavingHibernateTypes_thenTheCorrectJsonIsStoredInTheDatabase() {
         Album emptyAlbum = new Album();

From a5264182cd0faed8a9cae5368ea84d1372ad3be2 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Sat, 25 Apr 2020 21:57:43 +0200
Subject: [PATCH 085/404] Refactoring code in com.baeldung.modelmapper package

---
 .../com/baeldung/modelmapper/MapperUtil.java     | 16 ++--------------
 .../main/java/com/baeldung/modelmapper/User.java | 14 +++++++-------
 .../java/com/baeldung/modelmapper/UserDTO.java   | 10 +++++-----
 .../baeldung/modelmapper/UserPropertyMap.java    |  7 ++++---
 .../modelmapper/UsersListMappingUnitTest.java    | 12 ++++++------
 5 files changed, 24 insertions(+), 35 deletions(-)

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
index 546e415755..60af44cc76 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
@@ -1,39 +1,27 @@
 package com.baeldung.modelmapper;
 
 import org.modelmapper.ModelMapper;
-import org.modelmapper.convention.MatchingStrategies;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * This is a helper class that contains methods for generic mapping of the users list.
- * Initially, an instance of ModelMapper was created. In the static block we set the matching configuration to STRICT.
+ * Initially, an instance of ModelMapper was created.
  *
  * @author Sasa Milenkovic
  */
 public class MapperUtil {
 
-
     private static ModelMapper modelMapper = new ModelMapper();
 
 
-    static {
-
-        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
-
-    }
-
     private MapperUtil() {
 
 
     }
 
-    public static <S, T> T mapTo(final S source, final Class<T> target) {
-        return modelMapper.map(source, target);
-    }
-
-    public static <S, T> List<T> mapList(final List<S> sourceList, final Class<T> target) {
+    public static <S, T> List<T> mapList(List<S> sourceList, Class<T> target) {
         List<T> targetList = new ArrayList<T>();
 
         for (S source : sourceList) {
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
index 23a424dedd..8ed674d86a 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
@@ -8,7 +8,7 @@ package com.baeldung.modelmapper;
 public class User {
 
     private String userId;
-    private String userName;
+    private String username;
     private String email;
     private String contactNumber;
     private String userType;
@@ -18,9 +18,9 @@ public class User {
     public User() {
     }
 
-    public User(String userId, String userName, String email, String contactNumber, String userType) {
+    public User(String userId, String username, String email, String contactNumber, String userType) {
         this.userId = userId;
-        this.userName = userName;
+        this.username = username;
         this.email = email;
         this.contactNumber = contactNumber;
         this.userType = userType;
@@ -34,12 +34,12 @@ public class User {
         this.userId = userId;
     }
 
-    public String getUserName() {
-        return userName;
+    public String getUsername() {
+        return username;
     }
 
-    public void setUserName(String userName) {
-        this.userName = userName;
+    public void setUsername(String userName) {
+        this.username = userName;
     }
 
     public String getEmail() {
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
index e31414b629..b67bb58ef4 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
@@ -8,7 +8,7 @@ package com.baeldung.modelmapper;
 public class UserDTO {
 
     private String userId;
-    private String userName;
+    private String username;
     private String email;
 
     // getters and setters
@@ -21,12 +21,12 @@ public class UserDTO {
         this.userId = userId;
     }
 
-    public String getUserName() {
-        return userName;
+    public String getUsername() {
+        return username;
     }
 
-    public void setUserName(String userName) {
-        this.userName = userName;
+    public void setUsername(String username) {
+        this.username = username;
     }
 
     public String getEmail() {
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index d2c32a307d..0d2ebf7b4c 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -18,14 +18,15 @@ public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
     Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
 
-        List<String> usernames = new ArrayList<>();
+        protected List<String> usernames;
 
+        @Override
         protected List<String> convert(List<User> users) {
 
-            users.forEach(user -> usernames.add(user.getUserName()));
+            usernames = new ArrayList<String>();
+            users.forEach(user -> usernames.add(user.getUsername()));
             return usernames;
         }
-
     };
 
     @Override
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
index 05792fda38..aaeb8711a8 100644
--- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
@@ -25,14 +25,14 @@ import static org.junit.Assert.assertThat;
  */
 public class UsersListMappingUnitTest {
 
-    private ModelMapper mapper;
+    private ModelMapper modelMapper;
     private List<User> users;
 
     @Before
     public void init() {
 
-        mapper = new ModelMapper();
-        mapper.addMappings(new UserPropertyMap());
+        modelMapper = new ModelMapper();
+        modelMapper.addMappings(new UserPropertyMap());
         users = new ArrayList();
         users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
         users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
@@ -49,7 +49,7 @@ public class UsersListMappingUnitTest {
         integers.add(2);
         integers.add(3);
 
-        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {
+        List<Character> characters = modelMapper.map(integers, new TypeToken<List<Character>>() {
         }.getType());
 
         assertThat(characters, hasItems('1', '2', '3'));
@@ -66,14 +66,14 @@ public class UsersListMappingUnitTest {
         assertThat(userDtoList, Matchers.<UserDTO>hasItem(
                 Matchers.both(hasProperty("userId", equalTo("b100")))
                         .and(hasProperty("email", equalTo("user1@baeldung.com")))
-                        .and(hasProperty("userName", equalTo("user1")))));
+                        .and(hasProperty("username", equalTo("user1")))));
 
         // Mapping lists using PropertyMap and Converter
 
         UserList userList = new UserList();
         userList.setUsers(users);
         UserListDTO dto = new UserListDTO();
-        mapper.map(userList, dto);
+        modelMapper.map(userList, dto);
 
         assertNotNull(dto);
         assertThat(dto, Matchers.hasProperty("usernames"));

From 0223584fee0d7d6661696a194e63032d6a37acd8 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 26 Apr 2020 06:41:14 +0530
Subject: [PATCH 086/404] removed duplicate module

---
 maven-java-11/README.md                       |  6 --
 .../daomodule/pom.xml                         | 17 -----
 .../src/main/java/com/baeldung/dao/Dao.java   | 12 ----
 .../daomodule/src/main/java/module-info.java  |  3 -
 .../entitiymodule/pom.xml                     | 22 -------
 .../main/java/com/baeldung/entity/User.java   | 19 ------
 .../src/main/java/module-info.java            |  3 -
 .../mainppmodule/pom.xml                      | 38 -----------
 .../com/baeldung/mainapp/Application.java     | 19 ------
 .../src/main/java/module-info.java            |  6 --
 .../multimodule-maven-project/pom.xml         | 66 -------------------
 .../userdaomodule/pom.xml                     | 42 ------------
 .../java/com/baeldung/userdao/UserDao.java    | 32 ---------
 .../src/main/java/module-info.java            |  6 --
 .../userdao/test/UserDaoUnitTest.java         | 36 ----------
 maven-java-11/pom.xml                         | 27 --------
 16 files changed, 354 deletions(-)
 delete mode 100644 maven-java-11/README.md
 delete mode 100644 maven-java-11/multimodule-maven-project/daomodule/pom.xml
 delete mode 100644 maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java
 delete mode 100644 maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java
 delete mode 100644 maven-java-11/multimodule-maven-project/entitiymodule/pom.xml
 delete mode 100644 maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java
 delete mode 100644 maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java
 delete mode 100644 maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
 delete mode 100644 maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java
 delete mode 100644 maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java
 delete mode 100644 maven-java-11/multimodule-maven-project/pom.xml
 delete mode 100644 maven-java-11/multimodule-maven-project/userdaomodule/pom.xml
 delete mode 100644 maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java
 delete mode 100644 maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java
 delete mode 100644 maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java
 delete mode 100644 maven-java-11/pom.xml

diff --git a/maven-java-11/README.md b/maven-java-11/README.md
deleted file mode 100644
index b923518825..0000000000
--- a/maven-java-11/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## Maven and Java 11
-
-This module contains articles about Maven with Java 11+.
-
-### Relevant Articles: 
-
diff --git a/maven-java-11/multimodule-maven-project/daomodule/pom.xml b/maven-java-11/multimodule-maven-project/daomodule/pom.xml
deleted file mode 100644
index cbe0b4cb95..0000000000
--- a/maven-java-11/multimodule-maven-project/daomodule/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.daomodule</groupId>
-    <artifactId>daomodule</artifactId>
-    <version>1.0</version>
-    <name>daomodule</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung.multimodule-maven-project</groupId>
-        <artifactId>multimodule-maven-project</artifactId>
-        <version>1.0</version>
-    </parent>
-
-</project>
diff --git a/maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java b/maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java
deleted file mode 100644
index f86ae8abb3..0000000000
--- a/maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.dao;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface Dao<T> {
-
-    Optional<T> findById(int id);
-
-    List<T> findAll();
-
-}
diff --git a/maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java
deleted file mode 100644
index 072d7ad007..0000000000
--- a/maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java
+++ /dev/null
@@ -1,3 +0,0 @@
-module com.baeldung.dao {
-    exports com.baeldung.dao;
-}
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml b/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml
deleted file mode 100644
index 228619ed74..0000000000
--- a/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.entitymodule</groupId>
-    <artifactId>entitymodule</artifactId>
-    <version>1.0</version>
-    <name>entitymodule</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung.multimodule-maven-project</groupId>
-        <artifactId>multimodule-maven-project</artifactId>
-        <version>1.0</version>
-    </parent>
-
-    <properties>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
-    </properties>
-
-</project>
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java b/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java
deleted file mode 100644
index 22022a2e6d..0000000000
--- a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.entity;
-
-public class User {
-
-    private final String name;
-
-    public User(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public String toString() {
-        return "User{" + "name=" + name + '}';
-    }
-}
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java
deleted file mode 100644
index 67a3097352..0000000000
--- a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java
+++ /dev/null
@@ -1,3 +0,0 @@
-module com.baeldung.entity {
-    exports com.baeldung.entity;
-}
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml b/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
deleted file mode 100644
index a4a6575906..0000000000
--- a/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.mainappmodule</groupId>
-    <artifactId>mainappmodule</artifactId>
-    <version>1.0</version>
-    <name>mainappmodule</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung.multimodule-maven-project</groupId>
-        <artifactId>multimodule-maven-project</artifactId>
-        <version>1.0</version>
-        <entitymodule.version>1.0</entitymodule.version>
-        <daomodule.version>1.0</daomodule.version>
-        <userdaomodule.version>1.0</userdaomodule.version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.baeldung.entitymodule</groupId>
-            <artifactId>entitymodule</artifactId>
-            <version>${entitymodule.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.baeldung.daomodule</groupId>
-            <artifactId>daomodule</artifactId>
-            <version>${daomodule.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.baeldung.userdaomodule</groupId>
-            <artifactId>userdaomodule</artifactId>
-            <version>${userdaomodule.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java b/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java
deleted file mode 100644
index 0c0df7461b..0000000000
--- a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.mainapp;
-
-import com.baeldung.dao.Dao;
-import com.baeldung.entity.User;
-import com.baeldung.userdao.UserDao;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Application {
-    
-    public static void main(String[] args) {
-        Map<Integer, User> users = new HashMap<>();
-        users.put(1, new User("Julie"));
-        users.put(2, new User("David"));
-        Dao userDao = new UserDao(users);
-        userDao.findAll().forEach(System.out::println);
-    }
-    
-}
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java
deleted file mode 100644
index c688fcf7de..0000000000
--- a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-module com.baeldung.mainapp {
-    requires com.baeldung.entity;
-    requires com.baeldung.userdao;
-    requires com.baeldung.dao;
-    uses com.baeldung.dao.Dao;
-}
diff --git a/maven-java-11/multimodule-maven-project/pom.xml b/maven-java-11/multimodule-maven-project/pom.xml
deleted file mode 100644
index 65f5b7a814..0000000000
--- a/maven-java-11/multimodule-maven-project/pom.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.multimodule-maven-project</groupId>
-    <artifactId>multimodule-maven-project</artifactId>
-    <version>1.0</version>
-    <name>multimodule-maven-project</name>
-    <packaging>pom</packaging>
-
-    <parent>
-        <groupId>com.baeldung.maven-java-11</groupId>
-        <artifactId>maven-java-11</artifactId>
-        <version>1.0</version>
-    </parent>
-
-    <modules>
-        <module>entitymodule</module>
-        <module>daomodule</module>
-        <module>userdaomodule</module>
-        <module>mainappmodule</module>
-    </modules>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>${junit.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.assertj</groupId>
-                <artifactId>assertj-core</artifactId>
-                <version>${assertj.version}</version>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>${compiler.plugin.version}</version>
-                    <configuration>
-                        <source>${source.version}</source>
-                        <target>${target.version}</target>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <junit.version>4.12</junit.version>
-        <assertj.version>3.12.2</assertj.version>
-        <compiler.plugin.version>3.8.0</compiler.plugin.version>
-        <source.version>11</source.version>
-        <target.version>11</target.version>
-    </properties>
-
-</project>
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml b/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml
deleted file mode 100644
index cf6ea85cb5..0000000000
--- a/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.userdaomodule</groupId>
-    <artifactId>userdaomodule</artifactId>
-    <version>1.0</version>
-    <name>userdaomodule</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung.multimodule-maven-project</groupId>
-        <artifactId>multimodule-maven-project</artifactId>
-        <version>1.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.baeldung.entitymodule</groupId>
-            <artifactId>entitymodule</artifactId>
-            <version>${entitymodule.version}1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.baeldung.daomodule</groupId>
-            <artifactId>daomodule</artifactId>
-            <version>${daomodule.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <properties>
-        <entitymodule.version>1.0</entitymodule.version>
-        <daomodule.version>1.0</daomodule.version>
-    </properties>
-
-</project>
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java b/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java
deleted file mode 100644
index 1f1ea38a60..0000000000
--- a/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.userdao;
-
-import com.baeldung.dao.Dao;
-import com.baeldung.entity.User;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-public class UserDao implements Dao<User> {
-
-    private final Map<Integer, User> users;
-
-    public UserDao() {
-        users = new HashMap<>();
-    }
-
-    public UserDao(Map<Integer, User> users) {
-        this.users = users;
-    }
-
-    @Override
-    public List<User> findAll() {
-        return new ArrayList<>(users.values());
-    }
-
-    @Override
-    public Optional<User> findById(int id) {
-        return Optional.ofNullable(users.get(id));
-    }
-}
\ No newline at end of file
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java
deleted file mode 100644
index f1cb217e23..0000000000
--- a/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-module com.baeldung.userdao {
-    requires com.baeldung.entity;
-    requires com.baeldung.dao;
-    provides com.baeldung.dao.Dao with com.baeldung.userdao.UserDao;
-    exports com.baeldung.userdao;
-}
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java b/maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java
deleted file mode 100644
index 191d17ff32..0000000000
--- a/maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.userdao.test;
-
-import com.baeldung.dao.Dao;
-import com.baeldung.entity.User;
-import com.baeldung.userdao.UserDao;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import static org.junit.Assert.*;
-import static org.hamcrest.CoreMatchers.*;
-import org.junit.Before;
-import org.junit.Test;
-
-public class UserDaoUnitTest {
-    
-    private Dao userDao;
-    
-    @Before
-    public void setUpUserDaoInstance() {
-        Map<Integer, User> users = new HashMap<>();
-        users.put(1, new User("Julie"));
-        users.put(2, new User("David"));
-        userDao = new UserDao(users);
-    }
-    
-    @Test
-    public void givenUserDaoIntance_whenCalledFindById_thenCorrect() {
-       assertThat(userDao.findById(1), isA(Optional.class));
-    } 
-    
-    @Test
-    public void givenUserDaoIntance_whenCalledFindAll_thenCorrect() {
-       assertThat(userDao.findAll(), isA(List.class));
-    } 
-}
diff --git a/maven-java-11/pom.xml b/maven-java-11/pom.xml
deleted file mode 100644
index 10e80365c8..0000000000
--- a/maven-java-11/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baeldung.maven-java-11</groupId>
-    <artifactId>maven-java-11</artifactId>
-    <version>1.0</version>
-    <name>maven-java-11</name>
-    <packaging>pom</packaging>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-
-    <modules>
-        <module>multimodule-maven-project</module>
-    </modules>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
-    </properties>
-
-</project>

From caadf4ceb4b3826979a60112eabfde93f8f6fc6c Mon Sep 17 00:00:00 2001
From: John Richardson <42470533+John-Richardson@users.noreply.github.com>
Date: Sun, 26 Apr 2020 13:17:19 +0200
Subject: [PATCH 087/404] Replaced for loop with enhanced for

---
 data-structures/src/main/java/com/baeldung/trie/Trie.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/data-structures/src/main/java/com/baeldung/trie/Trie.java b/data-structures/src/main/java/com/baeldung/trie/Trie.java
index dac1a64733..9f0be5c647 100644
--- a/data-structures/src/main/java/com/baeldung/trie/Trie.java
+++ b/data-structures/src/main/java/com/baeldung/trie/Trie.java
@@ -10,8 +10,8 @@ class Trie {
     void insert(String word) {
         TrieNode current = root;
 
-        for (int i = 0; i < word.length(); i++) {
-            current = current.getChildren().computeIfAbsent(word.charAt(i), c -> new TrieNode());
+        for (char l : word.toCharArray()) {
+            current = current.getChildren().computeIfAbsent(l, c -> new TrieNode());
         }
         current.setEndOfWord(true);
     }
@@ -59,4 +59,4 @@ class Trie {
         }
         return false;
     }
-}
\ No newline at end of file
+}

From 28e73e30f4af6fdc9ead15460306b5d2757c354a Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Sun, 26 Apr 2020 14:33:20 +0200
Subject: [PATCH 088/404] BAEL-3751: Add code needed for CI/CD

---
 .../.mvn/wrapper/maven-wrapper.properties     |   2 +
 spring-boot-ci-cd/.travis.yml                 |  13 +
 spring-boot-ci-cd/mvnw                        | 310 ++++++++++++++++++
 spring-boot-ci-cd/mvnw.cmd                    | 182 ++++++++++
 spring-boot-ci-cd/pom.xml                     |  64 +++-
 5 files changed, 567 insertions(+), 4 deletions(-)
 create mode 100644 spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties
 create mode 100644 spring-boot-ci-cd/.travis.yml
 create mode 100755 spring-boot-ci-cd/mvnw
 create mode 100644 spring-boot-ci-cd/mvnw.cmd

diff --git a/spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties b/spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000000..642d572ce9
--- /dev/null
+++ b/spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/spring-boot-ci-cd/.travis.yml b/spring-boot-ci-cd/.travis.yml
new file mode 100644
index 0000000000..b932f8969c
--- /dev/null
+++ b/spring-boot-ci-cd/.travis.yml
@@ -0,0 +1,13 @@
+language: java
+jdk:
+  - openjdk11
+services:
+  - docker
+
+before_install:
+  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
+  - docker pull openjdk:11-jre-slim-sid
+
+script:
+  - ./mvnw clean install
+  - ./mvnw heroku:deploy -P deploy-heroku,deploy-docker
\ No newline at end of file
diff --git a/spring-boot-ci-cd/mvnw b/spring-boot-ci-cd/mvnw
new file mode 100755
index 0000000000..41c0f0c23d
--- /dev/null
+++ b/spring-boot-ci-cd/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/spring-boot-ci-cd/mvnw.cmd b/spring-boot-ci-cd/mvnw.cmd
new file mode 100644
index 0000000000..86115719e5
--- /dev/null
+++ b/spring-boot-ci-cd/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/spring-boot-ci-cd/pom.xml b/spring-boot-ci-cd/pom.xml
index 070294fdce..982abd6ff8 100644
--- a/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-ci-cd/pom.xml
@@ -29,11 +29,67 @@
 
   <build>
     <plugins>
-<plugin>
-  <groupId>org.springframework.boot</groupId>
-  <artifactId>spring-boot-maven-plugin</artifactId>
-</plugin>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
     </plugins>
   </build>
 
+  <profiles>
+    <profile>
+      <id>deploy-heroku</id>
+      <properties>
+        <maven.deploy.skip>true</maven.deploy.skip>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>com.heroku.sdk</groupId>
+            <artifactId>heroku-maven-plugin</artifactId>
+            <version>3.0.2</version>
+            <configuration>
+              <appName>spring-boot-ci-cd</appName>
+              <processTypes>
+                <web>java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar</web>
+              </processTypes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>deploy-docker</id>
+      <properties>
+        <maven.deploy.skip>true</maven.deploy.skip>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>com.spotify</groupId>
+            <artifactId>dockerfile-maven-plugin</artifactId>
+            <version>1.4.13</version>
+            <executions>
+              <execution>
+                <id>default</id>
+                <goals>
+                  <goal>build</goal>
+                  <goal>push</goal>
+                </goals>
+              </execution>
+            </executions>
+            <configuration>
+              <repository>lukaszrys/spring-boot-ci-cd</repository>
+              <tag>${project.version}</tag>
+              <tag>latest</tag>
+              <buildArgs>
+                <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
+              </buildArgs>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
 </project>
\ No newline at end of file

From d2f60283b8eb3d8633f2bcb5eda3fc69fbff330c Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Sun, 26 Apr 2020 15:46:04 +0200
Subject: [PATCH 089/404] JAVA-73: Remove unused test methods

---
 .../MongoTransactionalLiveTest.java            | 18 ------------------
 1 file changed, 18 deletions(-)

diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java
index bafcd770ec..6cd9657006 100644
--- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java
+++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java
@@ -62,24 +62,6 @@ public class MongoTransactionalLiveTest {
         }
     }
 
-    @Test(expected = MongoCommandException.class)
-    @Transactional
-    public void whenCountDuringMongoTransaction_thenException() {
-        userRepository.save(new User("John", 30));
-        userRepository.save(new User("Ringo", 35));
-        userRepository.count();
-    }
-
-    @Test
-    @Transactional
-    public void whenQueryDuringMongoTransaction_thenSuccess() {
-        userRepository.save(new User("Jane", 20));
-        userRepository.save(new User("Nick", 33));
-        List<User> users = mongoTemplate.find(new Query(), User.class);
-
-        assertTrue(users.size() > 1);
-    }
-
     // ==== Using test instead of before and after due to @transactional doesn't allow list collection
 
     @Test

From 8d7d98a144b2af7038efa1a266a284df92b9b7d9 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Sun, 26 Apr 2020 18:37:31 +0200
Subject: [PATCH 090/404] Customizing Java 8 code in modemmapper package

---
 .../com/baeldung/modelmapper/MapperUtil.java     | 16 +++++++---------
 .../baeldung/modelmapper/UserPropertyMap.java    | 13 +++++++------
 .../modelmapper/UsersListMappingUnitTest.java    | 12 ++++++------
 3 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
index 60af44cc76..9c6a5a0320 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
@@ -2,11 +2,11 @@ package com.baeldung.modelmapper;
 
 import org.modelmapper.ModelMapper;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
- * This is a helper class that contains methods for generic mapping of the users list.
+ * This is a helper class that contains method for generic mapping of the users list.
  * Initially, an instance of ModelMapper was created.
  *
  * @author Sasa Milenkovic
@@ -21,14 +21,12 @@ public class MapperUtil {
 
     }
 
-    public static <S, T> List<T> mapList(List<S> sourceList, Class<T> target) {
-        List<T> targetList = new ArrayList<T>();
+    public static <S, T> List<T> mapList(List<S> source, Class<T> targetClass) {
 
-        for (S source : sourceList) {
-            targetList.add(modelMapper.map(source, target));
-        }
-
-        return targetList;
+        return source
+                .stream()
+                .map(element -> modelMapper.map(element, targetClass))
+                .collect(Collectors.toList());
     }
 
 }
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 0d2ebf7b4c..5b2942b158 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -4,11 +4,11 @@ import org.modelmapper.AbstractConverter;
 import org.modelmapper.Converter;
 import org.modelmapper.PropertyMap;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
- * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
+ * UserPropertyMap class instantiates the converter to map the data from the UserList to the UsersLisDTO.
  * In the configuration method, we call a converter to do the mapping.
  *
  * @author Sasa Milenkovic
@@ -18,19 +18,20 @@ public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
     Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
 
-        protected List<String> usernames;
 
         @Override
         protected List<String> convert(List<User> users) {
 
-            usernames = new ArrayList<String>();
-            users.forEach(user -> usernames.add(user.getUsername()));
-            return usernames;
+            return users
+                    .stream()
+                    .map(User::getUsername)
+                    .collect(Collectors.toList());
         }
     };
 
     @Override
     protected void configure() {
+
         using(converter).map(source.getUsers(), destination.getUsernames());
     }
 }
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
index aaeb8711a8..982622e1f5 100644
--- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
@@ -59,7 +59,7 @@ public class UsersListMappingUnitTest {
     @Test
     public void givenUsersList_whenUseGenericType_thenMapToDto() {
 
-        // Mapping lists using generic type methods
+        // Mapping lists using custom type methods
 
         List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
 
@@ -72,12 +72,12 @@ public class UsersListMappingUnitTest {
 
         UserList userList = new UserList();
         userList.setUsers(users);
-        UserListDTO dto = new UserListDTO();
-        modelMapper.map(userList, dto);
+        UserListDTO dtos = new UserListDTO();
+        modelMapper.map(userList, dtos);
 
-        assertNotNull(dto);
-        assertThat(dto, Matchers.hasProperty("usernames"));
-        assertThat(dto.getUsernames(), hasSize(3));
+        assertNotNull(dtos);
+        assertThat(dtos, Matchers.hasProperty("usernames"));
+        assertThat(dtos.getUsernames(), hasSize(3));
 
     }
 

From c7acf47138c929c59a35e545a3fe66d3225365eb Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 26 Apr 2020 22:24:14 +0530
Subject: [PATCH 091/404] fix junit test cases

---
 .../batch/understanding/CustomCheckPointUnitTest.java |  9 +++------
 .../batch/understanding/JobSequenceUnitTest.java      |  6 +++---
 .../batch/understanding/SimpleBatchLetUnitTest.java   |  9 ++++-----
 .../batch/understanding/SimpleChunkUnitTest.java      |  5 ++---
 .../batch/understanding/SimpleErrorChunkUnitTest.java | 11 +++++------
 jee-7/src/test/resources/jberet.properties            |  1 +
 6 files changed, 18 insertions(+), 23 deletions(-)
 create mode 100644 jee-7/src/test/resources/jberet.properties

diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
index 744bdfc8f5..c607efeb24 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
@@ -1,20 +1,17 @@
 package com.baeldung.batch.understanding;
 
-import static org.junit.jupiter.api.Assertions.*;
-import java.util.Map;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.Properties;
+
 import javax.batch.operations.JobOperator;
 import javax.batch.runtime.BatchRuntime;
 import javax.batch.runtime.BatchStatus;
 import javax.batch.runtime.JobExecution;
-import javax.batch.runtime.Metric;
 import javax.batch.runtime.StepExecution;
-import com.baeldung.batch.understanding.BatchTestHelper;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Disabled;
 
-@Disabled("Should be fixed in BAEL-3812")
 class CustomCheckPointUnitTest {
     @Test
     public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception {
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
index 88b981df92..4b27e5f5ec 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
@@ -1,6 +1,8 @@
 package com.baeldung.batch.understanding;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -13,9 +15,7 @@ import javax.batch.runtime.JobExecution;
 import javax.batch.runtime.StepExecution;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Disabled;
 
-@Disabled("Should be fixed in BAEL-3812")
 class JobSequenceUnitTest {
     @Test
     public void givenTwoSteps_thenBatch_CompleteWithSuccess() throws Exception {
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
index 3babf9b5aa..788b75eb3e 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
@@ -1,17 +1,16 @@
 package com.baeldung.batch.understanding;
 
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Properties;
 
 import javax.batch.operations.JobOperator;
 import javax.batch.runtime.BatchRuntime;
 import javax.batch.runtime.BatchStatus;
 import javax.batch.runtime.JobExecution;
-import java.util.Properties;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
 
-@Disabled("Should be fixed in BAEL-3812")
 class SimpleBatchLetUnitTest {
     @Test
     public void givenBatchLet_thenBatch_CompleteWithSuccess() throws Exception {
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
index 5871143fa3..9010c365a2 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
@@ -1,6 +1,7 @@
 package com.baeldung.batch.understanding;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.List;
 import java.util.Map;
@@ -14,9 +15,7 @@ import javax.batch.runtime.Metric;
 import javax.batch.runtime.StepExecution;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Disabled;
 
-@Disabled("Should be fixed in BAEL-3812")
 class SimpleChunkUnitTest {
     @Test
     public void givenChunk_thenBatch_CompletesWithSucess() throws Exception {
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
index c53561a0c0..bc410aec8d 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
@@ -1,19 +1,18 @@
 package com.baeldung.batch.understanding;
 
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+import java.util.Properties;
 
 import javax.batch.operations.JobOperator;
 import javax.batch.runtime.BatchRuntime;
 import javax.batch.runtime.BatchStatus;
 import javax.batch.runtime.JobExecution;
 import javax.batch.runtime.StepExecution;
-import java.util.List;
-import java.util.Properties;
 
-import static org.junit.Assert.assertEquals;
+import org.junit.jupiter.api.Test;
 
-@Disabled("Should be fixed in BAEL-3812")
 class SimpleErrorChunkUnitTest {
 
     @Test
diff --git a/jee-7/src/test/resources/jberet.properties b/jee-7/src/test/resources/jberet.properties
new file mode 100644
index 0000000000..e8b9907de5
--- /dev/null
+++ b/jee-7/src/test/resources/jberet.properties
@@ -0,0 +1 @@
+db-url=jdbc:h2:mem:jberet-repo;DB_CLOSE_DELAY=-1
\ No newline at end of file

From da174392ed63097a64d6a095eb71f442b563a356 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Sun, 26 Apr 2020 22:34:22 +0200
Subject: [PATCH 092/404] JAVA-1470 Move 10 articles to libraries-4 module

---
 libraries-4/README.md                         |  43 +++
 libraries-4/pom.xml                           | 111 +++++++
 .../distinct/DistinctWithJavaFunction.java    |   0
 .../java/com/baeldung/distinct/Person.java    |   0
 .../ConvertContainerToAnother.java            |   0
 .../baeldung/eclipsecollections/Student.java  |   0
 .../com/baeldung/jdeffered/FilterDemo.java    |   0
 .../java/com/baeldung/jdeffered/PipeDemo.java |   0
 .../com/baeldung/jdeffered/PromiseDemo.java   |   0
 .../baeldung/jdeffered/ThreadSafeDemo.java    |   0
 .../manager/DeferredManagerDemo.java          |   0
 .../DeferredManagerWithExecutorDemo.java      |   0
 .../manager/SimpleDeferredManagerDemo.java    |   0
 .../com/baeldung/mbassador/AckMessage.java    |   0
 .../java/com/baeldung/mbassador/Message.java  |   0
 .../com/baeldung/mbassador/RejectMessage.java |   0
 .../noexception/CustomExceptionHandler.java   |   0
 .../java/com/baeldung/pairs/CustomPair.java   |   0
 .../com/baeldung/rome/RSSRomeExample.java     |   0
 .../com/baeldung/yarg/DocumentController.java |   0
 ...istinctWithEclipseCollectionsUnitTest.java |   0
 .../DistinctWithJavaFunctionUnitTest.java     |   0
 .../DistinctWithStreamexUnitTest.java         |   0
 .../distinct/DistinctWithVavrUnitTest.java    |   0
 .../distinct/PersonDataGenerator.java         |   0
 .../AllSatisfyPatternUnitTest.java            |   0
 .../AnySatisfyPatternUnitTest.java            |   0
 .../CollectPatternUnitTest.java               |   0
 .../ConvertContainerToAnotherUnitTest.java    |   0
 .../DetectPatternUnitTest.java                |   0
 .../FlatCollectUnitTest.java                  |   0
 .../ForEachPatternUnitTest.java               |   3 +-
 .../InjectIntoPatternUnitTest.java            |   0
 .../LazyIterationUnitTest.java                |   0
 .../PartitionPatternUnitTest.java             |   0
 .../RejectPatternUnitTest.java                |   0
 .../SelectPatternUnitTest.java                |   0
 .../eclipsecollections/ZipUnitTest.java       |   0
 .../ZipWithIndexUnitTest.java                 |   0
 .../io/JavaDirectoryDeleteUnitTest.java       | 276 +++++++++---------
 .../baeldung/jdeffered/JDeferredUnitTest.java |   0
 .../MBassadorAsyncDispatchUnitTest.java       |   0
 .../MBassadorAsyncInvocationUnitTest.java     |   0
 .../mbassador/MBassadorBasicUnitTest.java     |   0
 .../MBassadorConfigurationUnitTest.java       |   0
 .../mbassador/MBassadorFilterUnitTest.java    |   0
 .../mbassador/MBassadorHierarchyUnitTest.java |   0
 .../noexception/NoExceptionUnitTest.java      |   0
 .../pairs/ApacheCommonsPairUnitTest.java      |   0
 .../baeldung/pairs/CoreJavaPairUnitTest.java  |   0
 .../pairs/CoreJavaSimpleEntryUnitTest.java    |   0
 .../com/baeldung/pairs/VavrPairsUnitTest.java |   0
 .../pcollections/PCollectionsUnitTest.java    |   0
 libraries-5/pom.xml                           |  15 +
 libraries-6/pom.xml                           |  15 +
 libraries/README.md                           |   9 +-
 libraries/pom.xml                             | 134 ++++-----
 pom.xml                                       |   4 +
 58 files changed, 403 insertions(+), 207 deletions(-)
 create mode 100644 libraries-4/README.md
 create mode 100644 libraries-4/pom.xml
 rename {libraries => libraries-4}/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/distinct/Person.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/eclipsecollections/Student.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/FilterDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/PipeDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/PromiseDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/mbassador/AckMessage.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/mbassador/Message.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/mbassador/RejectMessage.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/pairs/CustomPair.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/rome/RSSRomeExample.java (100%)
 rename {libraries => libraries-4}/src/main/java/com/baeldung/yarg/DocumentController.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/distinct/PersonDataGenerator.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java (90%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java (100%)
 rename {libraries/src/test/java/com/baeldung/java => libraries-4/src/test/java/com/baeldung}/io/JavaDirectoryDeleteUnitTest.java (96%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java (100%)
 rename {libraries => libraries-4}/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java (100%)
 create mode 100644 libraries-5/pom.xml
 create mode 100644 libraries-6/pom.xml

diff --git a/libraries-4/README.md b/libraries-4/README.md
new file mode 100644
index 0000000000..f650c073a7
--- /dev/null
+++ b/libraries-4/README.md
@@ -0,0 +1,43 @@
+## Libraries
+
+This module contains articles about various Java libraries. 
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+
+- [Introduction to Javatuples](https://www.baeldung.com/java-tuples)
+- [Introduction to Javassist](https://www.baeldung.com/javassist)
+- [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink)
+- [Intro to JaVers](https://www.baeldung.com/javers)
+- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams)
+- [Introduction to Quartz](https://www.baeldung.com/quartz)
+- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup)
+- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
+- [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
+- [Introduction to Neuroph](https://www.baeldung.com/neuroph)
+
+#5
+- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
+- [Introduction to StreamEx](https://www.baeldung.com/streamex)
+- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
+- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
+- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
+- [Introduction to jOOL](https://www.baeldung.com/jool)
+- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
+- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
+- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
+- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
+
+#6
+- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
+- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
+- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
+- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
+- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
+
+- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
+- More articles [[next -->]](/libraries-2)
diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml
new file mode 100644
index 0000000000..1b2db27861
--- /dev/null
+++ b/libraries-4/pom.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>parent-modules</artifactId>
+        <groupId>com.baeldung</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>libraries-4</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.jdeferred</groupId>
+            <artifactId>jdeferred-core</artifactId>
+            <version>${jdeferred.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.collections</groupId>
+            <artifactId>eclipse-collections</artifactId>
+            <version>${eclipse-collections.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.haulmont.yarg</groupId>
+            <artifactId>yarg</artifactId>
+            <version>${yarg.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.engio</groupId>
+            <artifactId>mbassador</artifactId>
+            <version>${mbassador.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.machinezoo.noexception</groupId>
+            <artifactId>noexception</artifactId>
+            <version>${noexception.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>rome</groupId>
+            <artifactId>rome</artifactId>
+            <version>${rome.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.datanucleus</groupId>
+            <artifactId>javax.jdo</artifactId>
+            <version>${javax.jdo.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>${javax.servlet.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.vavr</groupId>
+            <artifactId>vavr</artifactId>
+            <version>${vavr.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.pcollections</groupId>
+            <artifactId>pcollections</artifactId>
+            <version>${pcollections.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <version>${awaitility.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>one.util</groupId>
+            <artifactId>streamex</artifactId>
+            <version>${streamex.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>javax.el-api</artifactId>
+            <version>${javax.el.version}</version>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <jdeferred.version>1.2.6</jdeferred.version>
+        <eclipse-collections.version>8.2.0</eclipse-collections.version>
+        <noexception.version>1.1.0</noexception.version>
+        <yarg.version>2.0.12</yarg.version>
+        <mbassador.version>1.3.1</mbassador.version>
+        <rome.version>1.0</rome.version>
+        <spring.version>4.3.8.RELEASE</spring.version>
+        <javax.servlet.version>2.5</javax.servlet.version>
+        <javax.jdo.version>3.2.0-m7</javax.jdo.version>
+        <vavr.version>0.9.0</vavr.version>
+        <assertj.version>3.6.2</assertj.version>
+        <pcollections.version>2.1.2</pcollections.version>
+        <awaitility.version>3.0.0</awaitility.version>
+        <streamex.version>0.6.5</streamex.version>
+        <javax.el.version>3.0.0</javax.el.version>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java b/libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
rename to libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
diff --git a/libraries/src/main/java/com/baeldung/distinct/Person.java b/libraries-4/src/main/java/com/baeldung/distinct/Person.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/distinct/Person.java
rename to libraries-4/src/main/java/com/baeldung/distinct/Person.java
diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
rename to libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/eclipsecollections/Student.java
rename to libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/FilterDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/FilterDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/PipeDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/PipeDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/PromiseDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/PromiseDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java
diff --git a/libraries/src/main/java/com/baeldung/mbassador/AckMessage.java b/libraries-4/src/main/java/com/baeldung/mbassador/AckMessage.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/mbassador/AckMessage.java
rename to libraries-4/src/main/java/com/baeldung/mbassador/AckMessage.java
diff --git a/libraries/src/main/java/com/baeldung/mbassador/Message.java b/libraries-4/src/main/java/com/baeldung/mbassador/Message.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/mbassador/Message.java
rename to libraries-4/src/main/java/com/baeldung/mbassador/Message.java
diff --git a/libraries/src/main/java/com/baeldung/mbassador/RejectMessage.java b/libraries-4/src/main/java/com/baeldung/mbassador/RejectMessage.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/mbassador/RejectMessage.java
rename to libraries-4/src/main/java/com/baeldung/mbassador/RejectMessage.java
diff --git a/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java b/libraries-4/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
rename to libraries-4/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
diff --git a/libraries/src/main/java/com/baeldung/pairs/CustomPair.java b/libraries-4/src/main/java/com/baeldung/pairs/CustomPair.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/pairs/CustomPair.java
rename to libraries-4/src/main/java/com/baeldung/pairs/CustomPair.java
diff --git a/libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java b/libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java
rename to libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java
diff --git a/libraries/src/main/java/com/baeldung/yarg/DocumentController.java b/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/yarg/DocumentController.java
rename to libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/PersonDataGenerator.java b/libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
rename to libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
similarity index 90%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
index 38d95047ed..a1bd280658 100644
--- a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
+++ b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
 import org.eclipse.collections.api.tuple.Pair;
 import org.eclipse.collections.impl.map.mutable.UnifiedMap;
 import org.eclipse.collections.impl.tuple.Tuples;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class ForEachPatternUnitTest {
@@ -23,7 +24,7 @@ public class ForEachPatternUnitTest {
         }
 
         for (int i = 0; i < map.size(); i++) {
-            assertEquals("New Value", map.get(i + 1));
+            Assert.assertEquals("New Value", map.get(i + 1));
         }
     }
 }
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java b/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
index 53d9d11bbb..c9c8242cd5 100644
--- a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
+++ b/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
@@ -1,138 +1,138 @@
-package com.baeldung.java.io;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.commons.io.FileUtils;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.springframework.util.FileSystemUtils;
-
-public class JavaDirectoryDeleteUnitTest {
-    private static Path TEMP_DIRECTORY;
-    private static final String DIRECTORY_NAME = "toBeDeleted";
-
-    private static final List<String> ALL_LINES = Arrays.asList("This is line 1", "This is line 2", "This is line 3", "This is line 4", "This is line 5", "This is line 6");
-
-    @BeforeClass
-    public static void initializeTempDirectory() throws IOException {
-        TEMP_DIRECTORY = Files.createTempDirectory("tmpForJUnit");
-    }
-
-    @AfterClass
-    public static void cleanTempDirectory() throws IOException {
-        FileUtils.deleteDirectory(TEMP_DIRECTORY.toFile());
-    }
-
-    @Before
-    public void setupDirectory() throws IOException {
-        Path tempPathForEachTest = Files.createDirectory(TEMP_DIRECTORY.resolve(DIRECTORY_NAME));
-
-        // Create a directory structure
-        Files.write(tempPathForEachTest.resolve("file1.txt"), ALL_LINES.subList(0, 2));
-        Files.write(tempPathForEachTest.resolve("file2.txt"), ALL_LINES.subList(2, 4));
-
-        Files.createDirectories(tempPathForEachTest.resolve("Empty"));
-
-        Path aSubDir = Files.createDirectories(tempPathForEachTest.resolve("notEmpty"));
-        Files.write(aSubDir.resolve("file3.txt"), ALL_LINES.subList(3, 5));
-        Files.write(aSubDir.resolve("file4.txt"), ALL_LINES.subList(0, 3));
-
-        aSubDir = Files.createDirectories(aSubDir.resolve("anotherSubDirectory"));
-        Files.write(aSubDir.resolve("file5.txt"), ALL_LINES.subList(4, 5));
-        Files.write(aSubDir.resolve("file6.txt"), ALL_LINES.subList(0, 2));
-    }
-
-    @After
-    public void checkAndCleanupIfRequired() throws IOException {
-        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-        if (Files.exists(pathToBeDeleted)) {
-            FileUtils.deleteDirectory(pathToBeDeleted.toFile());
-        }
-    }
-
-    private boolean deleteDirectory(File directoryToBeDeleted) {
-        File[] allContents = directoryToBeDeleted.listFiles();
-
-        if (allContents != null) {
-            for (File file : allContents) {
-                deleteDirectory(file);
-            }
-        }
-
-        return directoryToBeDeleted.delete();
-    }
-
-    @Test
-    public void givenDirectory_whenDeletedWithRecursion_thenIsGone() throws IOException {
-        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
-        boolean result = deleteDirectory(pathToBeDeleted.toFile());
-
-        assertTrue("Could not delete directory", result);
-        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
-    }
-
-    @Test
-    public void givenDirectory_whenDeletedWithCommonsIOFileUtils_thenIsGone() throws IOException {
-        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
-        FileUtils.deleteDirectory(pathToBeDeleted.toFile());
-
-        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
-    }
-
-    @Test
-    public void givenDirectory_whenDeletedWithSpringFileSystemUtils_thenIsGone() throws IOException {
-        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
-        boolean result = FileSystemUtils.deleteRecursively(pathToBeDeleted.toFile());
-
-        assertTrue("Could not delete directory", result);
-        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
-    }
-
-    @Test
-    public void givenDirectory_whenDeletedWithFilesWalk_thenIsGone() throws IOException {
-        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
-        Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
-
-        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
-    }
-
-    @Test
-    public void givenDirectory_whenDeletedWithNIO2WalkFileTree_thenIsGone() throws IOException {
-        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
-        Files.walkFileTree(pathToBeDeleted, new SimpleFileVisitor<Path>() {
-            @Override
-            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
-                Files.delete(dir);
-                return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                Files.delete(file);
-                return FileVisitResult.CONTINUE;
-            }
-        });
-
-        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
-    }
-}
+package com.baeldung.io;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.springframework.util.FileSystemUtils;
+
+public class JavaDirectoryDeleteUnitTest {
+    private static Path TEMP_DIRECTORY;
+    private static final String DIRECTORY_NAME = "toBeDeleted";
+
+    private static final List<String> ALL_LINES = Arrays.asList("This is line 1", "This is line 2", "This is line 3", "This is line 4", "This is line 5", "This is line 6");
+
+    @BeforeClass
+    public static void initializeTempDirectory() throws IOException {
+        TEMP_DIRECTORY = Files.createTempDirectory("tmpForJUnit");
+    }
+
+    @AfterClass
+    public static void cleanTempDirectory() throws IOException {
+        FileUtils.deleteDirectory(TEMP_DIRECTORY.toFile());
+    }
+
+    @Before
+    public void setupDirectory() throws IOException {
+        Path tempPathForEachTest = Files.createDirectory(TEMP_DIRECTORY.resolve(DIRECTORY_NAME));
+
+        // Create a directory structure
+        Files.write(tempPathForEachTest.resolve("file1.txt"), ALL_LINES.subList(0, 2));
+        Files.write(tempPathForEachTest.resolve("file2.txt"), ALL_LINES.subList(2, 4));
+
+        Files.createDirectories(tempPathForEachTest.resolve("Empty"));
+
+        Path aSubDir = Files.createDirectories(tempPathForEachTest.resolve("notEmpty"));
+        Files.write(aSubDir.resolve("file3.txt"), ALL_LINES.subList(3, 5));
+        Files.write(aSubDir.resolve("file4.txt"), ALL_LINES.subList(0, 3));
+
+        aSubDir = Files.createDirectories(aSubDir.resolve("anotherSubDirectory"));
+        Files.write(aSubDir.resolve("file5.txt"), ALL_LINES.subList(4, 5));
+        Files.write(aSubDir.resolve("file6.txt"), ALL_LINES.subList(0, 2));
+    }
+
+    @After
+    public void checkAndCleanupIfRequired() throws IOException {
+        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+        if (Files.exists(pathToBeDeleted)) {
+            FileUtils.deleteDirectory(pathToBeDeleted.toFile());
+        }
+    }
+
+    private boolean deleteDirectory(File directoryToBeDeleted) {
+        File[] allContents = directoryToBeDeleted.listFiles();
+
+        if (allContents != null) {
+            for (File file : allContents) {
+                deleteDirectory(file);
+            }
+        }
+
+        return directoryToBeDeleted.delete();
+    }
+
+    @Test
+    public void givenDirectory_whenDeletedWithRecursion_thenIsGone() throws IOException {
+        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+        boolean result = deleteDirectory(pathToBeDeleted.toFile());
+
+        assertTrue("Could not delete directory", result);
+        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+    }
+
+    @Test
+    public void givenDirectory_whenDeletedWithCommonsIOFileUtils_thenIsGone() throws IOException {
+        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+        FileUtils.deleteDirectory(pathToBeDeleted.toFile());
+
+        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+    }
+
+    @Test
+    public void givenDirectory_whenDeletedWithSpringFileSystemUtils_thenIsGone() throws IOException {
+        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+        boolean result = FileSystemUtils.deleteRecursively(pathToBeDeleted.toFile());
+
+        assertTrue("Could not delete directory", result);
+        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+    }
+
+    @Test
+    public void givenDirectory_whenDeletedWithFilesWalk_thenIsGone() throws IOException {
+        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+        Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+
+        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+    }
+
+    @Test
+    public void givenDirectory_whenDeletedWithNIO2WalkFileTree_thenIsGone() throws IOException {
+        Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+        Files.walkFileTree(pathToBeDeleted, new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                Files.delete(dir);
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                Files.delete(file);
+                return FileVisitResult.CONTINUE;
+            }
+        });
+
+        assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+    }
+}
diff --git a/libraries/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java b/libraries-4/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java b/libraries-4/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java b/libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
new file mode 100644
index 0000000000..b5a1ecd49c
--- /dev/null
+++ b/libraries-5/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>parent-modules</artifactId>
+        <groupId>com.baeldung</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>libraries-5</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
new file mode 100644
index 0000000000..be74ff9ef0
--- /dev/null
+++ b/libraries-6/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>parent-modules</artifactId>
+        <groupId>com.baeldung</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>libraries-6</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/libraries/README.md b/libraries/README.md
index 79ba8fe55d..3f259e4222 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -19,6 +19,8 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
 - [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
 - [Introduction to Neuroph](https://www.baeldung.com/neuroph)
+
+#4
 - [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
 - [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
 - [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
@@ -29,6 +31,8 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Guide to JDeferred](https://www.baeldung.com/jdeferred)
 - [Introduction to MBassador](https://www.baeldung.com/mbassador)
 - [Using Pairs in Java](https://www.baeldung.com/java-pairs)
+
+#5
 - [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
 - [Introduction to StreamEx](https://www.baeldung.com/streamex)
 - [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
@@ -39,10 +43,13 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
 - [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
 - [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
+
+#6
 - [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
 - [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
-- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
 - [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
 - [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
 - [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
+
+- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
 - More articles [[next -->]](/libraries-2)
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 41bc2b9311..5d540f0d90 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -70,11 +70,11 @@
             <version>${jnats.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>rome</groupId>
-            <artifactId>rome</artifactId>
-            <version>${rome.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>rome</groupId>-->
+<!--            <artifactId>rome</artifactId>-->
+<!--            <version>${rome.version}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>net.serenity-bdd</groupId>
             <artifactId>serenity-core</artifactId>
@@ -218,11 +218,11 @@
             <artifactId>quartz</artifactId>
             <version>${quartz.version}</version>
         </dependency>
-        <dependency>
-            <groupId>one.util</groupId>
-            <artifactId>streamex</artifactId>
-            <version>${streamex.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>one.util</groupId>-->
+<!--            <artifactId>streamex</artifactId>-->
+<!--            <version>${streamex.version}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>org.jooq</groupId>
             <artifactId>jool</artifactId>
@@ -256,18 +256,18 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>org.awaitility</groupId>
-            <artifactId>awaitility</artifactId>
-            <version>${awaitility.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.awaitility</groupId>
-            <artifactId>awaitility-proxy</artifactId>
-            <version>${awaitility.version}</version>
-            <scope>test</scope>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.awaitility</groupId>-->
+<!--            <artifactId>awaitility</artifactId>-->
+<!--            <version>${awaitility.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.awaitility</groupId>-->
+<!--            <artifactId>awaitility-proxy</artifactId>-->
+<!--            <version>${awaitility.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>java-hamcrest</artifactId>
@@ -284,42 +284,42 @@
             <artifactId>byte-buddy-agent</artifactId>
             <version>${bytebuddy.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.pcollections</groupId>
-            <artifactId>pcollections</artifactId>
-            <version>${pcollections.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.machinezoo.noexception</groupId>
-            <artifactId>noexception</artifactId>
-            <version>${noexception.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.collections</groupId>
-            <artifactId>eclipse-collections</artifactId>
-            <version>${eclipse-collections.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.vavr</groupId>
-            <artifactId>vavr</artifactId>
-            <version>${vavr.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.pcollections</groupId>-->
+<!--            <artifactId>pcollections</artifactId>-->
+<!--            <version>${pcollections.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.machinezoo.noexception</groupId>-->
+<!--            <artifactId>noexception</artifactId>-->
+<!--            <version>${noexception.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.eclipse.collections</groupId>-->
+<!--            <artifactId>eclipse-collections</artifactId>-->
+<!--            <version>${eclipse-collections.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>io.vavr</groupId>-->
+<!--            <artifactId>vavr</artifactId>-->
+<!--            <version>${vavr.version}</version>-->
+<!--        </dependency>-->
 
-        <dependency>
-            <groupId>com.haulmont.yarg</groupId>
-            <artifactId>yarg</artifactId>
-            <version>${yarg.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>net.engio</groupId>
-            <artifactId>mbassador</artifactId>
-            <version>${mbassador.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jdeferred</groupId>
-            <artifactId>jdeferred-core</artifactId>
-            <version>${jdeferred.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.haulmont.yarg</groupId>-->
+<!--            <artifactId>yarg</artifactId>-->
+<!--            <version>${yarg.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>net.engio</groupId>-->
+<!--            <artifactId>mbassador</artifactId>-->
+<!--            <version>${mbassador.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.jdeferred</groupId>-->
+<!--            <artifactId>jdeferred-core</artifactId>-->
+<!--            <version>${jdeferred.version}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.codepoetics</groupId>
             <artifactId>protonpack</artifactId>
@@ -572,14 +572,14 @@
         <jUnitParams.version>1.1.0</jUnitParams.version>
         <java-lsh.version>0.10</java-lsh.version>
         <pact.version>3.5.0</pact.version>
-        <awaitility.version>3.0.0</awaitility.version>
+<!--        <awaitility.version>3.0.0</awaitility.version>-->
         <org.hamcrest.java-hamcrest.version>2.0.0.0</org.hamcrest.java-hamcrest.version>
         <bytebuddy.version>1.7.1</bytebuddy.version>
-        <pcollections.version>2.1.2</pcollections.version>
-        <rome.version>1.0</rome.version>
-        <eclipse-collections.version>8.2.0</eclipse-collections.version>
-        <streamex.version>0.6.5</streamex.version>
-        <vavr.version>0.9.0</vavr.version>
+<!--        <pcollections.version>2.1.2</pcollections.version>-->
+<!--        <rome.version>1.0</rome.version>-->
+<!--        <eclipse-collections.version>8.2.0</eclipse-collections.version>-->
+<!--        <streamex.version>0.6.5</streamex.version>-->
+<!--        <vavr.version>0.9.0</vavr.version>-->
 
         <protonpack.version>1.15</protonpack.version>
         <caffeine.version>2.5.5</caffeine.version>
@@ -604,10 +604,10 @@
         <quartz.version>2.3.0</quartz.version>
         <jool.version>0.9.12</jool.version>
         <jmh.version>1.19</jmh.version>
-        <noexception.version>1.1.0</noexception.version>
-        <yarg.version>2.0.4</yarg.version>
-        <mbassador.version>1.3.1</mbassador.version>
-        <jdeferred.version>1.2.6</jdeferred.version>
+<!--        <noexception.version>1.1.0</noexception.version>-->
+<!--        <yarg.version>2.0.4</yarg.version>-->
+<!--        <mbassador.version>1.3.1</mbassador.version>-->
+<!--        <jdeferred.version>1.2.6</jdeferred.version>-->
         <functionaljava.version>4.8.1</functionaljava.version>
         <fugue.version>4.5.1</fugue.version>
         <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
diff --git a/pom.xml b/pom.xml
index 44a94095b3..d481f95042 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1011,6 +1011,10 @@
                 <!-- <module>lagom</module> --> <!-- Not a maven project -->
                 <module>libraries-2</module>
                 <module>libraries-3</module>
+                <module>libraries-4</module>
+<!--                <module>libraries-5</module>-->
+<!--                <module>libraries-6</module>-->
+
                 <module>libraries-apache-commons</module>
                 <module>libraries-apache-commons-collections</module>
                 <module>libraries-apache-commons-io</module>

From ec8d2244a3118ca3854feac34ef60ae3391acb59 Mon Sep 17 00:00:00 2001
From: Cavero Barca <carlos.cavero@atos.net>
Date: Mon, 27 Apr 2020 01:22:33 +0200
Subject: [PATCH 093/404] Add RedisRateLimiter to webfilter package

---
 spring-cloud/spring-cloud-gateway/pom.xml     | 25 ++++++--
 .../RequestRateLimiterResolverConfig.java     | 16 +++++
 .../main/resources/application-webfilters.yml | 21 ++++--
 .../RedisWebFilterFactoriesLiveTest.java      | 64 +++++++++++++++++++
 .../src/test/resources/logback-test.xml       |  8 +++
 5 files changed, 123 insertions(+), 11 deletions(-)
 create mode 100644 spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java
 create mode 100644 spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java

diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml
index ada32ae85f..c692eed7ec 100644
--- a/spring-cloud/spring-cloud-gateway/pom.xml
+++ b/spring-cloud/spring-cloud-gateway/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://maven.apache.org/POM/4.0.0"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>spring-cloud-gateway</artifactId>
     <name>spring-cloud-gateway</name>
@@ -54,7 +54,21 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
         </dependency>
-        
+
+        <!-- Redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
+        </dependency>
+
+        <!-- Embedded Redis -->
+        <dependency>
+            <groupId>it.ozimov</groupId>
+            <artifactId>embedded-redis</artifactId>
+            <version>${redis.version}</version>
+            <scope>test</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator-cdi</artifactId>
@@ -75,8 +89,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-        	<groupId>org.springframework.boot</groupId>
-        	<artifactId>spring-boot-devtools</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
         </dependency>
     </dependencies>
 
@@ -93,6 +107,7 @@
         <spring-cloud-dependencies.version>Hoxton.SR3</spring-cloud-dependencies.version>
         <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
         <hibernate-validator.version>6.0.2.Final</hibernate-validator.version>
+        <redis.version>0.7.2</redis.version>
     </properties>
 
 </project>
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java
new file mode 100644
index 0000000000..f80a742fa6
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.springcloudgateway.webfilters.config;
+
+import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class RequestRateLimiterResolverConfig {
+    
+    @Bean
+    KeyResolver userKeyResolver() {
+        return exchange -> Mono.just("1");
+    }
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml b/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
index 9b3ec64f96..3348cbbba0 100644
--- a/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
+++ b/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
@@ -1,4 +1,12 @@
+logging:
+  level:
+    org.springframework.cloud.gateway: INFO
+    reactor.netty.http.client: INFO
+    
 spring:
+  redis:
+    host: localhost
+    port: 6379
   cloud:
     gateway:
       routes:
@@ -81,13 +89,14 @@ spring:
               factor: 2
               basedOnPreviousValue: false
               
-      - id: circuitbreaker_route
+      - id: request_rate_limiter
         uri: https://httpbin.org
         predicates:
-        - Path=/status/504
+        - Path=/redis/get/**
         filters:
-        - name: CircuitBreaker
+        - StripPrefix=1
+        - name: RequestRateLimiter
           args:
-            name: myCircuitBreaker
-            fallbackUri: forward:/anything
-        - RewritePath=/status/504, /anything
\ No newline at end of file
+            redis-rate-limiter.replenishRate: 10
+            redis-rate-limiter.burstCapacity: 5
+            key-resolver: "#{@userKeyResolver}"
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java
new file mode 100644
index 0000000000..a28eb68775
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.springcloudgateway.webfilters;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.jupiter.api.RepeatedTest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+
+import redis.embedded.RedisServer;
+
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("webfilters")
+@TestConfiguration
+public class RedisWebFilterFactoriesLiveTest {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(RedisWebFilterFactoriesLiveTest.class);
+    
+    private RedisServer redisServer;
+    
+    public RedisWebFilterFactoriesLiveTest() {
+    }
+
+    @Before
+    public void postConstruct() {
+        this.redisServer = new RedisServer(6379);
+        redisServer.start();    
+    }
+    
+    @LocalServerPort
+    String port;
+
+    @Autowired
+    private TestRestTemplate restTemplate;
+
+    @Autowired
+    TestRestTemplate template;
+ 
+    @RepeatedTest(25)
+    public void whenCallRedisGetThroughGateway_thenOKStatusOrIsReceived() {
+        String url = "http://localhost:" + port + "/redis/get";
+
+        ResponseEntity<String> r = restTemplate.getForEntity(url, String.class);
+        // assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+
+        LOGGER.info("Received: status->{}, reason->{}, remaining->{}", 
+          r.getStatusCodeValue(), r.getStatusCode().getReasonPhrase(), 
+          r.getHeaders().get("X-RateLimit-Remaining"));
+    }
+    
+    @After
+    public void preDestroy() {
+        redisServer.stop();
+    }
+
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml b/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml
index 6fcdb6317f..6980d119b1 100644
--- a/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml
+++ b/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml
@@ -3,7 +3,15 @@
     <appender name="LISTAPPENDER"
         class="com.baeldung.springcloudgateway.customfilters.gatewayapp.utils.LoggerListAppender">
     </appender>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
     <root level="info">
         <appender-ref ref="LISTAPPENDER" />
     </root>
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
 </configuration> 
\ No newline at end of file

From f1283f2424cc85aa6459898767c3f62be816d01b Mon Sep 17 00:00:00 2001
From: Belma Jakupovic <jakupovicbelma1@gmail.com>
Date: Mon, 27 Apr 2020 06:57:38 +0200
Subject: [PATCH 094/404] bjakupovic - single responsibility principle example
 (#9191)

---
 .../java/com/baeldung/s/TextManipulator.java  | 35 +++++++++++++++++++
 .../main/java/com/baeldung/s/TextPrinter.java | 23 ++++++++++++
 2 files changed, 58 insertions(+)
 create mode 100644 patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java
 create mode 100644 patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java

diff --git a/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java b/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java
new file mode 100644
index 0000000000..a6b32a0ff9
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java
@@ -0,0 +1,35 @@
+package com.baeldung.s;
+
+public class TextManipulator {
+    private String text;
+
+    public TextManipulator(String text) {
+        this.text = text;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void appendText(String newText) {
+        text = text.concat(newText);
+    }
+
+    public void findWordAndReplace(String word, String replacementWord) {
+        if (text.contains(word)) {
+            text = text.replace(word, replacementWord);
+        } else System.out.println("Word you want to replace is not found in the text");
+    }
+
+    public void findWordAndDelete(String word) {
+        if (text.contains(word)) {
+            text = text.replace(word, "");
+        } else System.out.println("Word you want to delete is not found in the text");
+    }
+
+ /*
+  * Bad practice when implementing SRP principle, not in the scope of this class
+    public void printText() {
+        System.out.println(textManipulator.getText());
+    }*/
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java b/patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java
new file mode 100644
index 0000000000..d6a413e7ac
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java
@@ -0,0 +1,23 @@
+package com.baeldung.s;
+
+import java.util.Arrays;
+
+public class TextPrinter {
+    TextManipulator textManipulator;
+
+    public TextPrinter(TextManipulator textManipulator) {
+        this.textManipulator = textManipulator;
+    }
+
+    public void printText() {
+        System.out.println(textManipulator.getText());
+    }
+
+    public void printOutEachWordOfText() {
+        System.out.println(Arrays.toString(textManipulator.getText().split(" ")));
+    }
+
+    public void printRangeOfCharacters(int startingIndex, int endIndex) {
+        System.out.println(textManipulator.getText().substring(startingIndex, endIndex));
+    }
+}

From e24cc4d7b0a9d34c0c091512f875df24b947b134 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Mon, 27 Apr 2020 11:34:36 +0530
Subject: [PATCH 095/404] JAVA-926: Upgraded spring boot version

---
 .../greeter-spring-boot-autoconfigure/pom.xml                   | 2 +-
 .../greeter-spring-boot-starter/pom.xml                         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
index 0bba2936a7..532f45cf3e 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
@@ -63,7 +63,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <spring-boot.version>1.5.2.RELEASE</spring-boot.version>
+        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
         <greeter.version>0.0.1-SNAPSHOT</greeter.version>
     </properties>
 
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
index ba2b4101e8..0e8fb4cbc9 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
@@ -51,7 +51,7 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <greeter.version>0.0.1-SNAPSHOT</greeter.version>
-        <spring-boot.version>1.5.2.RELEASE</spring-boot.version>
+        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
     </properties>
 
 </project>
\ No newline at end of file

From f22de7eecf89b63b7cfc73fd6308c4a7da406666 Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Mon, 27 Apr 2020 12:33:39 +0200
Subject: [PATCH 096/404] Codecov

---
 .../.mvn/wrapper/MavenWrapperDownloader.java  | 117 ++++++++++++++++++
 spring-boot-ci-cd/.travis.yml                 |   7 +-
 spring-boot-ci-cd/pom.xml                     |  20 +++
 3 files changed, 142 insertions(+), 2 deletions(-)
 create mode 100644 spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java

diff --git a/spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java b/spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000000..b901097f2d
--- /dev/null
+++ b/spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed 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.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}
diff --git a/spring-boot-ci-cd/.travis.yml b/spring-boot-ci-cd/.travis.yml
index b932f8969c..46333d2680 100644
--- a/spring-boot-ci-cd/.travis.yml
+++ b/spring-boot-ci-cd/.travis.yml
@@ -9,5 +9,8 @@ before_install:
   - docker pull openjdk:11-jre-slim-sid
 
 script:
-  - ./mvnw clean install
-  - ./mvnw heroku:deploy -P deploy-heroku,deploy-docker
\ No newline at end of file
+  - ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent install
+  - ./mvnw heroku:deploy -P deploy-heroku,deploy-docker
+
+after_success:
+  - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file
diff --git a/spring-boot-ci-cd/pom.xml b/spring-boot-ci-cd/pom.xml
index 982abd6ff8..5e32fe105e 100644
--- a/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-ci-cd/pom.xml
@@ -33,6 +33,26 @@
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>0.8.5</version>
+        <executions>
+          <execution>
+            <id>default-prepare-agent</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>report</id>
+            <phase>test</phase>
+            <goals>
+              <goal>report</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 

From d5d6236ae1639f6bb662e1e28782672fd0b2f26f Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Mon, 27 Apr 2020 12:51:31 +0200
Subject: [PATCH 097/404] BAEL-3751: Add integration test

---
 .../cicd/CiCdApplicationIntegrationTest.java      | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java

diff --git a/spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java b/spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java
new file mode 100644
index 0000000000..7ab246faf8
--- /dev/null
+++ b/spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.cicd;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CiCdApplicationIntegrationTest {
+
+    @Test
+    public void contextLoads() {
+
+    }
+}
\ No newline at end of file

From f3ce1554c9dbdbcc8aef2d09665ca115ede478e6 Mon Sep 17 00:00:00 2001
From: Tyrell Flurry <tyrellflurry@gmail.com>
Date: Mon, 27 Apr 2020 10:47:52 -0400
Subject: [PATCH 098/404] BAEL-3929: made changes per code/article review.

---
 maven-all/maven-unused-dependencies/pom.xml   | 14 ++++++-------
 .../src/main/java/com/baeldung/Main.java      | 20 -------------------
 .../java/com/baeldung/ReflectionMain.java     | 15 --------------
 .../UnusedDependenciesExample.java            | 17 ++++++++++++++++
 4 files changed, 24 insertions(+), 42 deletions(-)
 delete mode 100644 maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
 delete mode 100644 maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java
 create mode 100644 maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java

diff --git a/maven-all/maven-unused-dependencies/pom.xml b/maven-all/maven-unused-dependencies/pom.xml
index 19a06fc605..c8f6c1f04b 100644
--- a/maven-all/maven-unused-dependencies/pom.xml
+++ b/maven-all/maven-unused-dependencies/pom.xml
@@ -6,6 +6,13 @@
     <artifactId>maven-unused-dependencies</artifactId>
     <version>0.0.1-SNAPSHOT</version>
 
+    <properties>
+        <commons-collections.version>3.2.2</commons-collections.version>
+        <slf4j-api.version>1.7.25</slf4j-api.version>
+        <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
+        <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>commons-collections</groupId>
@@ -37,11 +44,4 @@
         </plugins>
     </build>
 
-    <properties>
-        <commons-collections.version>3.2.2</commons-collections.version>
-        <slf4j-api.version>1.7.25</slf4j-api.version>
-        <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
-        <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
-    </properties>
-
 </project>
\ No newline at end of file
diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
deleted file mode 100644
index 2626bb30a3..0000000000
--- a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/Main.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.slf4j.LoggerFactory;
-
-public class Main {
-
-    public static void main(String[] args) {
-        Map<String, String> map = new HashMap<>();
-        map.put("Dallas", "Texas");
-        map.put("Green Bay", "Wisconsin");
-        map.put("Seattle", "Washington");
-
-        LoggerFactory.getLogger(Main.class)
-            .info("Map: {}", map);
-    }
-
-}
diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java
deleted file mode 100644
index 48e42f7c66..0000000000
--- a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/ReflectionMain.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.baeldung;
-
-public class ReflectionMain {
-
-    public static void main(String[] args) {
-        ClassLoader classLoader = Main.class.getClassLoader();
-        try {
-            System.out.println(classLoader.loadClass("org.apache.commons.collections.CollectionUtils")
-                .getSimpleName());
-        } catch (ClassNotFoundException e) {
-            e.printStackTrace();
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java
new file mode 100644
index 0000000000..c9390880ed
--- /dev/null
+++ b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java
@@ -0,0 +1,17 @@
+package com.baeldung.mavendependencyplugin;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UnusedDependenciesExample {
+
+    /**
+     * When the Maven dependency analyzer analyzes the code, it will see that the slf4j dependency is being used in this method. 
+     * 
+     * @return the slf4j {@link Logger}.
+     */
+    public Logger getLogger() {
+        return LoggerFactory.getLogger(UnusedDependenciesExample.class);
+    }
+
+}

From debb7dace50ee0ebe67e41872c132eafe83d8cbe Mon Sep 17 00:00:00 2001
From: Yevgen Pikus <4037842+gindex@users.noreply.github.com>
Date: Mon, 27 Apr 2020 23:25:33 +0200
Subject: [PATCH 099/404] Add fold and reduce examples (#9188)

Co-authored-by: Yevgen Pikus <yevgen.pikus@eon.com>
---
 .../foldvsreduce/FoldAndReduceTest.kt         | 59 +++++++++++++++++++
 1 file changed, 59 insertions(+)
 create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt

diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt
new file mode 100644
index 0000000000..7b263914c6
--- /dev/null
+++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt
@@ -0,0 +1,59 @@
+package com.baeldung.foldvsreduce
+
+import org.junit.Test
+import org.junit.jupiter.api.assertThrows
+import java.lang.RuntimeException
+import kotlin.test.assertEquals
+
+class FoldAndReduceTest {
+
+    @Test
+    fun testReduceLimitations() {
+        val numbers: List<Int> = listOf(1, 2, 3)
+        val sum: Number = numbers.reduce { acc, next -> acc + next }
+        assertEquals(6, sum)
+
+        val emptyList = listOf<Int>()
+        assertThrows<RuntimeException> { emptyList.reduce { acc, next -> acc + next } }
+
+        // doesn't compile
+        // val sum = numbers.reduce { acc, next -> acc.toLong() + next.toLong()}
+    }
+
+    @Test
+    fun testFold() {
+
+        val numbers: List<Int> = listOf(1, 2, 3)
+        val sum: Int = numbers.fold(0, { acc, next -> acc + next })
+        assertEquals(6, sum)
+
+        //change result type
+        val sumLong: Long = numbers.fold(0L, { acc, next -> acc + next.toLong() })
+        assertEquals(6L, sumLong)
+
+        val emptyList = listOf<Int>()
+        val emptySum = emptyList.fold(0, { acc, next -> acc + next })
+        assertEquals(0, emptySum)
+
+        //power of changing result type
+        val (even, odd) = numbers.fold(Pair(listOf<Int>(), listOf<Int>()), { acc, next ->
+            if (next % 2 == 0) Pair(acc.first + next, acc.second)
+            else Pair(acc.first, acc.second + next)
+        })
+
+        assertEquals(listOf(2), even)
+        assertEquals(listOf(1, 3), odd)
+    }
+
+    @Test
+    fun testVariationsOfFold() {
+        val numbers = listOf(1, 2, 3)
+        val reversed = numbers.foldRight(listOf<Int>(), { next, acc -> acc + next})
+        assertEquals(listOf(3,2,1), reversed)
+
+        val reversedIndexes = numbers.foldRightIndexed(listOf<Int>(), { i, _, acc -> acc + i })
+        assertEquals(listOf(2,1,0), reversedIndexes)
+    }
+
+
+}
\ No newline at end of file

From ac794a722f32fbb1252e84f9b75d28586d2ef42a Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Mon, 27 Apr 2020 18:58:15 -0400
Subject: [PATCH 100/404] Resolved Conflicts with master

---
 libraries-3/pom.xml | 33 ---------------------------------
 1 file changed, 33 deletions(-)

diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index a72dbcba50..5334bfba70 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -70,25 +70,6 @@
             <artifactId>velocity-engine-core</artifactId>
             <version>${velocity-engine-core.version}</version>
         </dependency>
-<<<<<<< HEAD
-	<dependency>
-            <groupId>com.uber.nullaway</groupId>
-            <artifactId>nullaway</artifactId>
-            <version>0.3.0</version>
-	</dependency>
-	<dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-compiler-javac-errorprone</artifactId>
-            <version>2.8</version>
-	</dependency>
-	<!-- override plexus-compiler-javac-errorprone's dependency on
-             Error Prone with the latest version -->
-	<dependency>
-            <groupId>com.google.errorprone</groupId>
-            <artifactId>error_prone_core</artifactId>
-            <version>2.1.3</version>
-	</dependency>
-=======
           <dependency>
             <groupId>com.uber.nullaway</groupId>
             <artifactId>nullaway</artifactId>
@@ -106,7 +87,6 @@
             <artifactId>error_prone_core</artifactId>
             <version>2.1.3</version>
         </dependency>
->>>>>>> upstream/master
     </dependencies>
 
     <repositories>
@@ -143,20 +123,11 @@
                     </dependency>
                 </dependencies>
             </plugin>
-<<<<<<< HEAD
-			
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-		<artifactId>maven-compiler-plugin</artifactId>
-		<version>3.5</version>
-		<configuration>
-=======
                <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.5</version>
                 <configuration>
->>>>>>> upstream/master
                     <compilerId>javac-with-errorprone</compilerId>
                     <forceJavacCompilerUse>true</forceJavacCompilerUse>
                     <source>1.8</source>
@@ -172,11 +143,7 @@
                     <compilerArgs>
                         <!-- NullAway will warn by default, uncomment the next line to make the build fail -->
                         <!-- <arg>-Xep:NullAway:ERROR</arg> -->
-<<<<<<< HEAD
-                        <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*|(.*)/jcabi/.*</arg>
-=======
                         <arg>-XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.*</arg>
->>>>>>> upstream/master
                         <arg>-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway</arg>
                     </compilerArgs>
                 </configuration>

From 491e2d84933ee0c876e38c956edd5e888f1398fc Mon Sep 17 00:00:00 2001
From: Greg Martin <gmartin@opaq.com>
Date: Mon, 27 Apr 2020 19:02:40 -0400
Subject: [PATCH 101/404] Synced with master

---
 libraries-3/README.md                         |  1 -
 .../java/com/baeldung/distinct/Person.java    | 65 -------------------
 2 files changed, 66 deletions(-)
 delete mode 100644 libraries-3/src/main/java/com/baeldung/distinct/Person.java

diff --git a/libraries-3/README.md b/libraries-3/README.md
index 922ce1bd1a..ec433960ef 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -12,7 +12,6 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos)
 - [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline)
 - [Introduction to cache2k](https://www.baeldung.com/java-cache2k)
-- [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
 - [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects)
 - [Introduction to Takes](https://www.baeldung.com/java-takes)
 - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
diff --git a/libraries-3/src/main/java/com/baeldung/distinct/Person.java b/libraries-3/src/main/java/com/baeldung/distinct/Person.java
deleted file mode 100644
index 8a2a5f7a45..0000000000
--- a/libraries-3/src/main/java/com/baeldung/distinct/Person.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.baeldung.distinct;
-
-public class Person {
-    int age;
-    String name;
-    String email;
-
-    public Person(int age, String name, String email) {
-        super();
-        this.age = age;
-        this.name = name;
-        this.email = email;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("Person [age=");
-        builder.append(age);
-        builder.append(", name=");
-        builder.append(name);
-        builder.append(", email=");
-        builder.append(email);
-        builder.append("]");
-        return builder.toString();
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((email == null) ? 0 : email.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Person other = (Person) obj;
-        if (email == null) {
-            if (other.email != null)
-                return false;
-        } else if (!email.equals(other.email))
-            return false;
-        return true;
-    }
-
-}

From 57519b9daebdbb82d6ca96c3f7af87f304c0dbd6 Mon Sep 17 00:00:00 2001
From: Kumar Chandrakant <kchandrakant@gmail.com>
Date: Tue, 28 Apr 2020 09:48:00 +0530
Subject: [PATCH 102/404] Testing multithreading (#9193)

---
 .../core-java-concurrency-2/README.md         |  1 +
 .../core-java-concurrency-2/pom.xml           | 77 +++++++++++++++
 .../com/baeldung/concurrent/MyCounter.java    |  0
 .../concurrent/MyCounterJCStressUnitTest.java |  0
 .../MyCounterMultithreadedTCUnitTest.java     |  4 +-
 .../concurrent/MyCounterSimpleUnitTest.java   |  7 +-
 .../MyCounterTempusFugitUnitTest.java         |  2 +
 .../MyCounterThreadWeaverUnitTest.java        |  2 +
 .../core-java-concurrency-testing/README.md   |  7 --
 .../core-java-concurrency-testing/pom.xml     | 93 -------------------
 .../src/main/resources/logback.xml            | 19 ----
 .../src/test/resources/.gitignore             | 13 ---
 12 files changed, 90 insertions(+), 135 deletions(-)
 rename core-java-modules/{core-java-concurrency-testing => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/MyCounter.java (100%)
 rename core-java-modules/{core-java-concurrency-testing => core-java-concurrency-2}/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java (100%)
 rename core-java-modules/{core-java-concurrency-testing => core-java-concurrency-2}/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java (90%)
 rename core-java-modules/{core-java-concurrency-testing => core-java-concurrency-2}/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java (96%)
 rename core-java-modules/{core-java-concurrency-testing => core-java-concurrency-2}/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java (96%)
 rename core-java-modules/{core-java-concurrency-testing => core-java-concurrency-2}/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java (96%)
 delete mode 100644 core-java-modules/core-java-concurrency-testing/README.md
 delete mode 100644 core-java-modules/core-java-concurrency-testing/pom.xml
 delete mode 100644 core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml
 delete mode 100644 core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore

diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md
index 749d174968..ab7eebc26a 100644
--- a/core-java-modules/core-java-concurrency-2/README.md
+++ b/core-java-modules/core-java-concurrency-2/README.md
@@ -4,4 +4,5 @@
 
 ### Relevant Articles: 
 - [Using a Mutex Object in Java](https://www.baeldung.com/java-mutex)
+- [Testing Multi-Threaded Code in Java] (https://www.baeldung.com/java-testing-multithreaded)
 
diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml
index a9a01b70f3..dfb5674c8e 100644
--- a/core-java-modules/core-java-concurrency-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-2/pom.xml
@@ -15,6 +15,38 @@
         <version>0.0.1-SNAPSHOT</version>
         <relativePath>../../parent-java</relativePath>
     </parent>
+	
+	<dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.thread-weaver</groupId>
+            <artifactId>threadweaver</artifactId>
+            <version>0.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.tempus-fugit</groupId>
+            <artifactId>tempus-fugit</artifactId>
+            <version>1.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.multithreadedtc</groupId>
+            <artifactId>multithreadedtc</artifactId>
+            <version>1.01</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jcstress</groupId>
+            <artifactId>jcstress-core</artifactId>
+            <version>0.5</version>
+        </dependency>
+    </dependencies>
 
     <build>
         <finalName>core-java-concurrency-2</finalName>
@@ -24,6 +56,51 @@
                 <filtering>true</filtering>
             </resource>
         </resources>
+		
+		<plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <compilerVersion>${javac.target}</compilerVersion>
+                    <source>${javac.target}</source>
+                    <target>${javac.target}</target>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.2</version>
+                <executions>
+                    <execution>
+                        <id>main</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <finalName>jcstress</finalName>
+                            <transformers>
+                                <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>org.openjdk.jcstress.Main</mainClass>
+                                </transformer>
+                                <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/TestList</resource>
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
     </build>
+    
+    <properties>
+        <javac.target>1.8</javac.target>
+    </properties>
 
 </project>
diff --git a/core-java-modules/core-java-concurrency-testing/src/main/java/com/baeldung/concurrent/MyCounter.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/MyCounter.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-testing/src/main/java/com/baeldung/concurrent/MyCounter.java
rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/MyCounter.java
diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java
rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java
rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java
index eb4e77cae9..8a0bedf6c2 100644
--- a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java
+++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java
@@ -1,5 +1,6 @@
 package com.baeldung.concurrent;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
 import edu.umd.cs.mtc.MultithreadedTestCase;
@@ -25,9 +26,10 @@ public class MyCounterMultithreadedTCUnitTest extends MultithreadedTestCase {
     @SuppressWarnings("deprecation")
     @Override
     public void finish() {
-        assertEquals(2, counter.getCount());
+    	assertEquals(2, counter.getCount());
     }
 
+    @Ignore
     @Test
     public void testCounter() throws Throwable {
         TestFramework.runManyTimes(new MyCounterMultithreadedTCUnitTest(), 1000);
diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java
rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java
index 4f3409b923..9a405e7e24 100644
--- a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java
+++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java
@@ -6,6 +6,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class MyCounterSimpleUnitTest {
@@ -18,7 +19,8 @@ public class MyCounterSimpleUnitTest {
         assertEquals(500, counter.getCount());
     }
 
-    // @Test
+    @Ignore
+    @Test
     public void testCounterWithConcurrency() throws InterruptedException {
         int numberOfThreads = 100;
         ExecutorService service = Executors.newFixedThreadPool(10);
@@ -34,7 +36,8 @@ public class MyCounterSimpleUnitTest {
         assertEquals(numberOfThreads, counter.getCount());
     }
 
-    // @Test
+    @Ignore
+    @Test
     public void testSummationWithConcurrencyAndWait() throws InterruptedException {
         int numberOfThreads = 2;
         ExecutorService service = Executors.newFixedThreadPool(10);
diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java
rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java
index 360c61b4f4..36a2031e78 100644
--- a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java
+++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java
@@ -3,6 +3,7 @@ package com.baeldung.concurrent;
 import static org.junit.Assert.assertEquals;
 
 import org.junit.AfterClass;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -20,6 +21,7 @@ public class MyCounterTempusFugitUnitTest {
 
     private static MyCounter counter = new MyCounter();
 
+    @Ignore
     @Test
     @Concurrent(count = 2)
     @Repeating(repetition = 10)
diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java
rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java
index 29b08996cd..e65a963584 100644
--- a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java
+++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java
@@ -2,6 +2,7 @@ package com.baeldung.concurrent;
 
 import static org.junit.Assert.assertEquals;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.testing.threadtester.AnnotatedTestRunner;
@@ -34,6 +35,7 @@ public class MyCounterThreadWeaverUnitTest {
         assertEquals(2, counter.getCount());
     }
 
+    @Ignore
     @Test
     public void testCounter() {
         new AnnotatedTestRunner().runTests(this.getClass(), MyCounter.class);
diff --git a/core-java-modules/core-java-concurrency-testing/README.md b/core-java-modules/core-java-concurrency-testing/README.md
deleted file mode 100644
index fef74a6750..0000000000
--- a/core-java-modules/core-java-concurrency-testing/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-=========
-
-## Core Java Concurrency Testing Examples
-
-### Relevant Articles: 
-- [Testing Multi-Threaded Code in Java](https://www.baeldung.com/java-testing-multithreaded)
-
diff --git a/core-java-modules/core-java-concurrency-testing/pom.xml b/core-java-modules/core-java-concurrency-testing/pom.xml
deleted file mode 100644
index 51de83f67c..0000000000
--- a/core-java-modules/core-java-concurrency-testing/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>core-java-concurrency-testing</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
-    <name>core-java-concurrency-testing</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
-    </parent>
-	
-    <dependencies>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.13</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.googlecode.thread-weaver</groupId>
-            <artifactId>threadweaver</artifactId>
-            <version>0.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.google.code.tempus-fugit</groupId>
-            <artifactId>tempus-fugit</artifactId>
-            <version>1.1</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.googlecode.multithreadedtc</groupId>
-            <artifactId>multithreadedtc</artifactId>
-            <version>1.01</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.openjdk.jcstress</groupId>
-            <artifactId>jcstress-core</artifactId>
-            <version>0.5</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.1</version>
-                <configuration>
-                    <compilerVersion>${javac.target}</compilerVersion>
-                    <source>${javac.target}</source>
-                    <target>${javac.target}</target>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>2.2</version>
-                <executions>
-                    <execution>
-                        <id>main</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <finalName>jcstress</finalName>
-                            <transformers>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>org.openjdk.jcstress.Main</mainClass>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/TestList</resource>
-                                </transformer>
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml
deleted file mode 100644
index 56af2d397e..0000000000
--- a/core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration>
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-            </pattern>
-        </encoder>
-    </appender>
-
-    <logger name="org.springframework" level="WARN" />
-    <logger name="org.springframework.transaction" level="WARN" />
-
-    <!-- in order to debug some marshalling issues, this needs to be TRACE -->
-    <logger name="org.springframework.web.servlet.mvc" level="WARN" />
-
-    <root level="INFO">
-        <appender-ref ref="STDOUT" />
-    </root>
-</configuration>
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore b/core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.class
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
\ No newline at end of file

From 41a9f46cad51b12d57b8ecd815cc5dcb769f23b7 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Tue, 28 Apr 2020 07:49:49 +0200
Subject: [PATCH 103/404] [JAVA-616] Fixed link to article by using HTTPS

---
 core-java-modules/core-java-arrays-sorting/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core-java-modules/core-java-arrays-sorting/README.md b/core-java-modules/core-java-arrays-sorting/README.md
index f83dd43526..dedc0340c0 100644
--- a/core-java-modules/core-java-arrays-sorting/README.md
+++ b/core-java-modules/core-java-arrays-sorting/README.md
@@ -5,5 +5,5 @@ This module contains articles about sorting arrays in Java
 ### Relevant Articles: 
 - [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays)
 - [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array)
-- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array)
+- [How to Reverse an Array in Java](https://www.baeldung.com/java-invert-array)
 - [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort)

From 5e1b86e79e2f6ad3898198b5ced790eb054e7d5b Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Tue, 28 Apr 2020 07:55:51 +0200
Subject: [PATCH 104/404] [JAVA-630] Fixing indent of vavr* modules

---
 pom.xml | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/pom.xml b/pom.xml
index f2c23a94ae..2f4579c999 100644
--- a/pom.xml
+++ b/pom.xml
@@ -813,8 +813,8 @@
                 <module>libraries</module> <!-- very long running -->
 
                 <module>vaadin</module>
-		<module>vavr</module>
-		<module>vavr-2</module>
+                <module>vavr</module>
+                <module>vavr-2</module>
             </modules>
         </profile>
 
@@ -1313,12 +1313,12 @@
                 <module>libraries</module> <!-- very long running -->
 
                 <module>vaadin</module>
-		<module>vavr</module>
-		<module>vavr-2</module>
+                <module>vavr</module>
+                <module>vavr-2</module>
             </modules>
 
         </profile>
-        
+
         <profile>
             <id>live-all</id>
 
@@ -1342,7 +1342,7 @@
                             </includes>
                         </configuration>
                     </plugin>
-                    
+
                 </plugins>
             </build>
 

From e25ce92d5ed5a00e32f136a6f5f7b575495484cd Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Thu, 2 Apr 2020 20:51:41 +0200
Subject: [PATCH 105/404] [JAVA-621] Creating core-java-lang-oop-modules module

---
 .../core-java-lang-oop-modules/pom.xml            | 15 +++++++++++++++
 core-java-modules/pom.xml                         |  1 +
 2 files changed, 16 insertions(+)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/pom.xml

diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
new file mode 100644
index 0000000000..0e7e474258
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-oop-modules</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index b7454cc737..4d64f7e6ba 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -85,6 +85,7 @@
         <module>core-java-lang-2</module>
         <module>core-java-lang-math</module>
         <module>core-java-lang-math-2</module>
+        <module>core-java-lang-oop-modules</module>
         <module>core-java-lang-oop</module>
         <module>core-java-lang-oop-2</module>
         <module>core-java-lang-oop-3</module>

From 117cb9ce46e33a664bc383f757b9208274527875 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Thu, 2 Apr 2020 21:04:24 +0200
Subject: [PATCH 106/404] [JAVA-621] core-java-lang-oop-constructors module

* Creation

* Moved code from https://www.baeldung.com/java-constructors

* Moved code from https://www.baeldung.com/java-copy-constructor

* Moved code from https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error

* Moved article references to the new README.md
---
 .../core-java-lang-oop-2/README.md            |  3 --
 .../core-java-lang-oop-constructors/README.md |  8 ++++++
 .../core-java-lang-oop-constructors/pom.xml   | 28 +++++++++++++++++++
 .../baeldung/constructors/BankAccount.java    |  7 ++---
 .../baeldung/constructors/Transaction.java    |  0
 .../baeldung/copyconstructor/Employee.java    |  0
 .../com/baeldung/copyconstructor/Manager.java |  0
 .../supertypecompilerexception/MyClass.java   |  0
 .../MyClassSolution1.java                     |  0
 .../MyClassSolution2.java                     |  0
 .../MyClassSolution3.java                     |  0
 .../MyException.java                          |  0
 .../constructors/ConstructorUnitTest.java     | 13 ++++-----
 .../copyconstructor/EmployeeUnitTest.java     |  0
 .../copyconstructor/ManagerUnitTest.java      |  0
 .../core-java-lang-oop-modules/pom.xml        |  9 ++++--
 16 files changed, 52 insertions(+), 16 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/constructors/BankAccount.java (99%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/constructors/Transaction.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/copyconstructor/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/copyconstructor/Manager.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/main/java/com/baeldung/supertypecompilerexception/MyException.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java (88%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-constructors}/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index c48a3f5cd9..fc5b5944f8 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -4,15 +4,12 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors)
-- [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error)
 - [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
 - [Raw Types in Java](https://www.baeldung.com/raw-types-java)
 - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
 - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
 - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object)
 - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition)
-- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
 - [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
-- [Java Copy Constructor](https://www.baeldung.com/java-copy-constructor)
 - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/README.md
new file mode 100644
index 0000000000..0082969807
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/README.md
@@ -0,0 +1,8 @@
+## Core Java Lang OOP - Constructors
+
+This module contains article about constructors in Java
+
+### Relevant Articles:
+- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
+- [Java Copy Constructor](https://www.baeldung.com/java-copy-constructor)
+- [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml
new file mode 100644
index 0000000000..e961d68f11
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-constructors</artifactId>
+    <name>core-java-lang-oop-constructors</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <assertj-core.version>3.10.0</assertj-core.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java
similarity index 99%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java
index b78b5937e1..b198492129 100644
--- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java
@@ -6,7 +6,7 @@ class BankAccount {
     String name;
     LocalDateTime opened;
     double balance;
-    
+
     @Override
     public String toString() {
         return String.format("%s, %s, %f", this.name, this.opened.toString(), this.balance);
@@ -47,14 +47,13 @@ class BankAccountCopyConstructor extends BankAccount {
         this.opened = opened;
         this.balance = balance;
     }
-        
+
     public BankAccountCopyConstructor(BankAccount other) {
         this.name = other.name;
         this.opened = LocalDateTime.now();
         this.balance = 0.0f;
     }
 }
-
 class BankAccountChainedConstructors extends BankAccount {
     public BankAccountChainedConstructors(String name, LocalDateTime opened, double balance) {
         this.name = name;
@@ -65,4 +64,4 @@ class BankAccountChainedConstructors extends BankAccount {
     public BankAccountChainedConstructors(String name) {
         this(name, LocalDateTime.now(), 0.0f);
     }
-}
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyException.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/supertypecompilerexception/MyException.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
similarity index 88%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
index 274fe77764..e207afec57 100644
--- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
@@ -1,20 +1,19 @@
 package com.baeldung.constructors;
 
+import org.assertj.core.api.Assertions;
 import org.junit.Test;
 
 import java.time.LocalDateTime;
 import java.time.Month;
-import java.util.logging.Logger;
 
-import static org.assertj.core.api.Assertions.*;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class ConstructorUnitTest {
-    final static Logger LOGGER = Logger.getLogger(ConstructorUnitTest.class.getName());
-
+    
     @Test
     public void givenNoExplicitContructor_whenUsed_thenFails() {
         BankAccount account = new BankAccount();
-        assertThatThrownBy(() -> {
+        Assertions.assertThatThrownBy(() -> {
             account.toString();
         }).isInstanceOf(Exception.class);
     }
@@ -22,7 +21,7 @@ public class ConstructorUnitTest {
     @Test
     public void givenNoArgumentConstructor_whenUsed_thenSucceeds() {
         BankAccountEmptyConstructor account = new BankAccountEmptyConstructor();
-        assertThatCode(() -> {
+        Assertions.assertThatCode(() -> {
             account.toString();
         }).doesNotThrowAnyException();
     }
@@ -33,7 +32,7 @@ public class ConstructorUnitTest {
         BankAccountParameterizedConstructor account =
                 new BankAccountParameterizedConstructor("Tom", opened, 1000.0f);
 
-        assertThatCode(() -> {
+        Assertions.assertThatCode(() -> {
             account.toString();
         }).doesNotThrowAnyException();
     }
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index 0e7e474258..c8bad11b13 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -9,7 +9,12 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>core-java-oop-modules</artifactId>
-
+    <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+    <artifactId>core-java-lang-oop-modules</artifactId>
+    <name>core-java-lang-oop-modules</name>
+    <packaging>pom</packaging>
 
+    <modules>
+        <module>core-java-lang-oop-constructors</module>
+    </modules>
 </project>
\ No newline at end of file

From c0169519adf7520da194b19b224beca25430e84e Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Thu, 2 Apr 2020 21:24:31 +0200
Subject: [PATCH 107/404] [JAVA-621] core-java-lang-oop-patterns module

* Creation

* Moved code from https://www.baeldung.com/java-composition-aggregation-association

* Moved code from https://www.baeldung.com/java-inheritance-composition

* Moved code from https://www.baeldung.com/java-immutable-object

* Moved code from https://www.baeldung.com/java-deep-copy

* Moved article references to the new README.md
---
 .../core-java-lang-oop-2/README.md            |  2 -
 .../core-java-lang-oop-3/README.md            |  1 -
 .../core-java-lang-oop-patterns/README.md     |  9 ++++
 .../core-java-lang-oop-patterns/pom.xml       | 45 +++++++++++++++++++
 .../java/com/baeldung/deepcopy/Address.java   |  0
 .../main/java/com/baeldung/deepcopy/User.java |  0
 .../baeldung/immutableobjects/Currency.java   |  0
 .../com/baeldung/immutableobjects/Money.java  |  0
 .../application/Application.java              |  0
 .../inheritancecomposition/model/Actress.java |  0
 .../model/Computer.java                       |  0
 .../inheritancecomposition/model/Memory.java  |  0
 .../inheritancecomposition/model/Person.java  |  0
 .../model/Processor.java                      |  0
 .../model/SoundCard.java                      |  0
 .../model/StandardMemory.java                 |  0
 .../model/StandardProcessor.java              |  0
 .../model/StandardSoundCard.java              |  0
 .../model/Waitress.java                       |  0
 .../relationships/aggregation/Car.java        |  0
 .../aggregation/CarWithStaticInnerWheel.java  |  0
 .../relationships/aggregation/Wheel.java      |  0
 .../relationships/association/Child.java      |  0
 .../relationships/association/Mother.java     |  0
 .../relationships/composition/Building.java   |  0
 .../BuildingWithDefinitionRoomInMethod.java   |  0
 .../relationships/university/Department.java  |  0
 .../relationships/university/Professor.java   |  0
 .../relationships/university/University.java  |  0
 .../baeldung/deepcopy/DeepCopyUnitTest.java   |  0
 .../deepcopy/ShallowCopyUnitTest.java         |  0
 .../ImmutableObjectsUnitTest.java             |  0
 .../ActressUnitTest.java                      |  0
 .../CompositionUnitTest.java                  |  0
 .../InheritanceUnitTest.java                  |  0
 .../PersonUnitTest.java                       |  0
 .../WaitressUnitTest.java                     |  0
 .../core-java-lang-oop-modules/pom.xml        |  1 +
 38 files changed, 55 insertions(+), 3 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/deepcopy/Address.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/deepcopy/User.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/immutableobjects/Currency.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/immutableobjects/Money.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/Person.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/aggregation/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/aggregation/Wheel.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/association/Child.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/association/Mother.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/composition/Building.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/university/Department.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/university/Professor.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/main/java/com/baeldung/relationships/university/University.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-patterns}/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index fc5b5944f8..d482b0a78d 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -8,8 +8,6 @@ This module contains articles about Object-oriented programming (OOP) in Java
 - [Raw Types in Java](https://www.baeldung.com/raw-types-java)
 - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
 - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
-- [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object)
-- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition)
 - [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
 - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
index 3a0e588ad4..78725b0f02 100644
--- a/core-java-modules/core-java-lang-oop-3/README.md
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -8,7 +8,6 @@ This module contains articles about Object-oriented programming (OOP) in Java
 - [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
 - [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
 - [Java ‘public’ Access Modifier](https://www.baeldung.com/java-public-keyword)
-- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
 - [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
 - [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
 - [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/README.md
new file mode 100644
index 0000000000..178a556a96
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/README.md
@@ -0,0 +1,9 @@
+## Core Java Lang OOP - Patterns
+
+This module contains articles about Object-oriented programming (OOP) patterns in Java
+
+### Relevant Articles: 
+- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
+- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition)
+- [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object)
+- [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml
new file mode 100644
index 0000000000..5bd3c70542
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-patterns</artifactId>
+    <name>core-java-lang-oop-patterns</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <gson.version>2.8.2</gson.version>
+        <assertj-core.version>3.10.0</assertj-core.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index c8bad11b13..ad86c1ef3c 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -16,5 +16,6 @@
 
     <modules>
         <module>core-java-lang-oop-constructors</module>
+        <module>core-java-lang-oop-patterns</module>
     </modules>
 </project>
\ No newline at end of file

From f23c60568c93f773dfa4d23cf86e218244b05217 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 09:29:47 +0200
Subject: [PATCH 108/404] [JAVA-621] core-java-lang-oop-generics module

* Creation

* Moved code from https://www.baeldung.com/raw-types-java

* Moved code from https://www.baeldung.com/java-generic-constructors

* Moved code from https://www.baeldung.com/java-type-erasure

* Moved article references to the new README.md
---
 core-java-modules/core-java-lang-oop-2/README.md |  2 --
 .../core-java-lang-oop-generics/README.md        |  8 ++++++++
 .../core-java-lang-oop-generics/pom.xml          | 16 ++++++++++++++++
 .../main/java/com/baeldung/generics/Entry.java   |  0
 .../java/com/baeldung/generics/GenericEntry.java |  0
 .../java/com/baeldung/generics/MapEntry.java     |  0
 .../main/java/com/baeldung/generics/Product.java |  0
 .../java/com/baeldung/generics/Rankable.java     |  0
 .../java/com/baeldung/rawtype/RawTypeDemo.java   |  0
 .../typeerasure/ArrayContentPrintUtil.java       |  0
 .../com/baeldung/typeerasure/BoundStack.java     |  0
 .../com/baeldung/typeerasure/IntegerStack.java   |  0
 .../java/com/baeldung/typeerasure/Stack.java     |  0
 .../generics/GenericConstructorUnitTest.java     |  0
 .../typeerasure/TypeErasureUnitTest.java         |  0
 .../core-java-lang-oop-modules/pom.xml           |  1 +
 16 files changed, 25 insertions(+), 2 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/generics/Entry.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/generics/GenericEntry.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/generics/MapEntry.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/generics/Product.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/generics/Rankable.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/rawtype/RawTypeDemo.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/typeerasure/BoundStack.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/typeerasure/IntegerStack.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/main/java/com/baeldung/typeerasure/Stack.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-generics}/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index d482b0a78d..8417c89c7a 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -3,9 +3,7 @@
 This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
-- [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors)
 - [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
-- [Raw Types in Java](https://www.baeldung.com/raw-types-java)
 - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
 - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
 - [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/README.md
new file mode 100644
index 0000000000..f0213c5659
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/README.md
@@ -0,0 +1,8 @@
+## Core Java Lang OOP - Generics
+
+This module contains articles about generics in Java
+
+### Relevant Articles: 
+- [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors)
+- [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
+- [Raw Types in Java](https://www.baeldung.com/raw-types-java)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml
new file mode 100644
index 0000000000..167aa695e0
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-generics</artifactId>
+    <name>core-java-lang-oop-generics</name>
+    <packaging>jar</packaging>
+
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/Entry.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/Entry.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/GenericEntry.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/GenericEntry.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/MapEntry.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/MapEntry.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/Product.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/Product.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/Rankable.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/generics/Rankable.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/rawtype/RawTypeDemo.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/rawtype/RawTypeDemo.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index ad86c1ef3c..c32e276a89 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -17,5 +17,6 @@
     <modules>
         <module>core-java-lang-oop-constructors</module>
         <module>core-java-lang-oop-patterns</module>
+        <module>core-java-lang-oop-generics</module>
     </modules>
 </project>
\ No newline at end of file

From 1ddd56978bb4af967f2b0c5d6e1bcb0e1146179e Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 09:42:08 +0200
Subject: [PATCH 109/404] [JAVA-621] core-java-lang-oop-modifiers module

* Creation

* Moved code from https://www.baeldung.com/java-static

* Moved code from https://www.baeldung.com/java-final

* Moved code from https://www.baeldung.com/java-public-keyword

* Moved code from https://www.baeldung.com/java-access-modifiers

* Moved code from https://www.baeldung.com/java-private-keyword

* Moved code from https://www.baeldung.com/java-static-default-methods

* Moved code from https://www.baeldung.com/java-strictfp

* Moved article references to the new README.md
---
 .../core-java-lang-oop-2/README.md            |  3 --
 .../core-java-lang-oop-3/README.md            |  2 --
 .../core-java-lang-oop-modifiers/README.md    | 12 +++++++
 .../core-java-lang-oop-modifiers/pom.xml      | 34 +++++++++++++++++++
 .../com/baeldung/accessmodifiers/Public.java  |  0
 .../baeldung/accessmodifiers/SubClass.java    |  0
 .../baeldung/accessmodifiers/SuperPublic.java |  0
 .../another/AnotherPublic.java                |  0
 .../another/AnotherSubClass.java              |  0
 .../another/AnotherSuperPublic.java           |  0
 .../publicmodifier/ListOfThree.java           |  0
 .../publicmodifier/SpecialCharacters.java     |  0
 .../publicmodifier/Student.java               |  0
 .../core/privatemodifier/Employee.java        |  0
 .../core/privatemodifier/ExampleClass.java    |  0
 .../privatemodifier/PublicOuterClass.java     |  0
 .../application/Application.java              |  0
 .../model/Alarm.java                          |  0
 .../model/Car.java                            |  0
 .../model/Motorbike.java                      |  0
 .../model/MultiAlarmCar.java                  |  0
 .../model/Vehicle.java                        |  0
 .../com/baeldung/finalkeyword/BlackCat.java   |  0
 .../com/baeldung/finalkeyword/BlackDog.java   |  0
 .../java/com/baeldung/finalkeyword/Cat.java   |  0
 .../java/com/baeldung/finalkeyword/Dog.java   |  0
 .../java/com/baeldung/staticdemo/Car.java     |  0
 .../com/baeldung/staticdemo/Singleton.java    |  0
 .../com/baeldung/staticdemo/StaticBlock.java  |  0
 .../com/baeldung/strictfpUsage/Circle.java    |  0
 .../strictfpUsage/ScientificCalculator.java   |  0
 .../PublicAccessModifierUnitTest.java         |  2 +-
 .../StaticDefaulInterfaceMethodUnitTest.java  |  2 +-
 .../baeldung/finalkeyword/FinalUnitTest.java  |  0
 .../com/baeldung/staticdemo/CarUnitTest.java} |  2 +-
 .../staticdemo/SingletonUnitTest.java}        |  2 +-
 .../staticdemo/StaticBlockUnitTest.java}      |  2 +-
 .../ScientificCalculatorUnitTest.java         |  0
 .../core-java-lang-oop-modules/pom.xml        |  1 +
 .../core-java-lang-oop/README.md              |  2 --
 40 files changed, 52 insertions(+), 12 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/Public.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/SubClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/core/privatemodifier/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/finalkeyword/BlackCat.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/finalkeyword/BlackDog.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/finalkeyword/Cat.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/finalkeyword/Dog.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/staticdemo/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/staticdemo/Singleton.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/staticdemo/StaticBlock.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/strictfpUsage/Circle.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java (100%)
 rename core-java-modules/{core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers => core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier}/PublicAccessModifierUnitTest.java (98%)
 rename core-java-modules/{core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods => core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods}/test/StaticDefaulInterfaceMethodUnitTest.java (97%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java => core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java} (89%)
 rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java => core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java} (90%)
 rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java => core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java} (91%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-modifiers}/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index 8417c89c7a..76da66c7ab 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -4,8 +4,5 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
-- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
 - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
-- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
-- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
index 78725b0f02..3b57ece635 100644
--- a/core-java-modules/core-java-lang-oop-3/README.md
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -4,10 +4,8 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
-- [Access Modifiers in Java](https://www.baeldung.com/java-access-modifiers)
 - [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
 - [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
-- [Java ‘public’ Access Modifier](https://www.baeldung.com/java-public-keyword)
 - [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
 - [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
 - [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/README.md
new file mode 100644
index 0000000000..eef905fa0e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/README.md
@@ -0,0 +1,12 @@
+## Core Java Lang OOP - Modifiers
+
+This module contains articles about modifiers in Java
+
+### Relevant Articles: 
+- [Access Modifiers in Java](https://www.baeldung.com/java-access-modifiers)
+- [Java ‘public’ Access Modifier](https://www.baeldung.com/java-public-keyword)
+- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword)
+- [The “final” Keyword in Java](https://www.baeldung.com/java-final)
+- [A Guide to the Static Keyword in Java](https://www.baeldung.com/java-static)
+- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
+- [The strictfp Keyword in Java](https://www.baeldung.com/java-strictfp)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml
new file mode 100644
index 0000000000..11e0296266
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-modifiers</artifactId>
+    <name>core-java-lang-oop-modifiers</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>${h2.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <assertj-core.version>3.10.0</assertj-core.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/core/privatemodifier/Employee.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/core/privatemodifier/Employee.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/strictfpUsage/Circle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/strictfpUsage/Circle.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
index ed8fb4f45a..c2897e7434 100644
--- a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.accessmodifiers;
+package com.baeldung.accessmodifiers.publicmodifier;
 
 import com.baeldung.accessmodifiers.publicmodifier.ListOfThree;
 import com.baeldung.accessmodifiers.publicmodifier.Student;
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
index 7d4b06908a..e90f239756 100644
--- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.defaultistaticinterfacemethods.test;
+package com.baeldung.defaultstaticinterfacemethods.test;
 
 import com.baeldung.defaultstaticinterfacemethods.model.Car;
 import com.baeldung.defaultstaticinterfacemethods.model.Motorbike;
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
similarity index 89%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
index 3150627269..3deec6f41c 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
@@ -4,7 +4,7 @@ import static org.junit.Assert.*;
 
 import org.junit.Test;
 
-public class CarIntegrationTest {
+public class CarUnitTest {
     @Test
     public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases() {
         new Car("Jaguar", "V8");
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
index 28d864073a..c1a1e1abe4 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
@@ -3,7 +3,7 @@ package com.baeldung.staticdemo;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class SingletonIntegrationTest {
+public class SingletonUnitTest {
 
     @Test
     public void givenStaticInnerClass_whenMultipleTimesInstanceCalled_thenOnlyOneTimeInitialized() {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
index f98e3e14db..79ba4427bf 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
@@ -7,7 +7,7 @@ import java.util.List;
 
 import org.junit.Test;
 
-public class StaticBlockIntegrationTest {
+public class StaticBlockUnitTest {
 
     @Test
     public void whenAddedListElementsThroughStaticBlock_thenEnsureCorrectOrder() {
diff --git a/core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index c32e276a89..a77079bc06 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -18,5 +18,6 @@
         <module>core-java-lang-oop-constructors</module>
         <module>core-java-lang-oop-patterns</module>
         <module>core-java-lang-oop-generics</module>
+        <module>core-java-lang-oop-modifiers</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
index 2be3d0cab1..c09ed6048d 100644
--- a/core-java-modules/core-java-lang-oop/README.md
+++ b/core-java-modules/core-java-lang-oop/README.md
@@ -4,13 +4,11 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
-- [A Guide to the Static Keyword in Java](https://www.baeldung.com/java-static)
 - [Polymorphism in Java](https://www.baeldung.com/java-polymorphism)
 - [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override)
 - [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
 - [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
 - [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
-- [The “final” Keyword in Java](https://www.baeldung.com/java-final)
 - [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
 - [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
 - [Object-Oriented-Programming Concepts in Java](https://www.baeldung.com/java-oop)

From a6846bb1caa9f52e80141ca778c7561c5965ba35 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 10:18:15 +0200
Subject: [PATCH 110/404] [JAVA-621] core-java-lang-oop-types module

* Creation

* Moved code from https://www.baeldung.com/java-marker-interfaces

* Moved code from https://www.baeldung.com/java-abstract-class

* Moved code from https://www.baeldung.com/java-this

* Moved code from https://www.baeldung.com/java-nested-classes

* Moved code from https://www.baeldung.com/java-inner-interfaces

* Moved code from https://www.baeldung.com/java-classes-objects

* Moved article references to the new README.md
---
 .../core-java-lang-oop-3/README.md            |  4 ---
 .../com/baeldung/keyword/KeywordDemo.java     |  3 --
 .../core-java-lang-oop-types/README.md        | 11 ++++++++
 .../core-java-lang-oop-types/pom.xml          | 28 +++++++++++++++++++
 .../application/Application.java              |  0
 .../filereaders/BaseFileReader.java           |  0
 .../filereaders/LowercaseFileReader.java      |  0
 .../filereaders/UppercaseFileReader.java      |  0
 .../CommaSeparatedCustomers.java              |  0
 .../baeldung/innerinterfaces/Customer.java    |  0
 .../keyword/thiskeyword/KeywordUnitTest.java  |  0
 .../markerinterface/DeletableShape.java       |  0
 .../baeldung/markerinterface/Rectangle.java   |  0
 .../com/baeldung/markerinterface/Shape.java   |  0
 .../baeldung/markerinterface/ShapeDao.java    |  0
 .../main/java/com/baeldung/objects/Car.java   |  0
 .../src/main/resources/files/test.txt         | 10 +++++++
 .../test/LowercaseFileReaderUnitTest.java     |  0
 .../test/UppercaseFileReaderUnitTest.java     |  0
 .../InnerInterfaceUnitTest.java               |  0
 .../MarkerInterfaceUnitTest.java              |  0
 .../baeldung/nestedclass/AnonymousInner.java  |  0
 .../com/baeldung/nestedclass/Enclosing.java   |  0
 .../baeldung/nestedclass/NewEnclosing.java    |  0
 .../com/baeldung/nestedclass/NewOuter.java    |  0
 .../java/com/baeldung/nestedclass/Outer.java  |  0
 .../com/baeldung/objects/ObjectsUnitTest.java |  0
 .../core-java-lang-oop-modules/pom.xml        |  1 +
 28 files changed, 50 insertions(+), 7 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/abstractclasses/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/innerinterfaces/Customer.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/markerinterface/DeletableShape.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/markerinterface/Rectangle.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/markerinterface/Shape.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/markerinterface/ShapeDao.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/main/java/com/baeldung/objects/Car.java (100%)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/resources/files/test.txt
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/nestedclass/AnonymousInner.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/nestedclass/Enclosing.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/nestedclass/NewEnclosing.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/nestedclass/NewOuter.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/nestedclass/Outer.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-types}/src/test/java/com/baeldung/objects/ObjectsUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
index 3b57ece635..0c9faf9a6d 100644
--- a/core-java-modules/core-java-lang-oop-3/README.md
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -5,9 +5,5 @@ This module contains articles about Object-oriented programming (OOP) in Java
 ### Relevant Articles: 
 - [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
 - [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
-- [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
-- [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
-- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
-- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
 - [Java Interfaces](https://www.baeldung.com/java-interfaces)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)[[More -->]](/core-java-modules/core-java-lang-oop-4)
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
index fd608b424c..ed421a9089 100644
--- a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
@@ -1,7 +1,6 @@
 package com.baeldung.keyword;
 
 import com.baeldung.keyword.superkeyword.SuperSub;
-import com.baeldung.keyword.thiskeyword.KeywordUnitTest;
 
 /**
  * Created by Gebruiker on 5/14/2018.
@@ -9,8 +8,6 @@ import com.baeldung.keyword.thiskeyword.KeywordUnitTest;
 public class KeywordDemo {
 
     public static void main(String[] args) {
-        KeywordUnitTest keyword = new KeywordUnitTest();
-
         SuperSub child = new SuperSub("message from the child class");
     }
 }
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
new file mode 100644
index 0000000000..330a74be9b
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
@@ -0,0 +1,11 @@
+## Core Java Lang OOP - Types
+
+This module contains articles about types in Java
+
+### Relevant Articles: 
+- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
+- [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
+- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
+- [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
+- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
+- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
new file mode 100644
index 0000000000..ce6b74bd3e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-types</artifactId>
+    <name>core-java-lang-oop-types</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <assertj-core.version>3.10.0</assertj-core.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/application/Application.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/application/Application.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/Customer.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/Customer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/Customer.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/Customer.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/objects/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/objects/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/resources/files/test.txt b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/resources/files/test.txt
new file mode 100644
index 0000000000..08e53af69d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/resources/files/test.txt
@@ -0,0 +1,10 @@
+This is line 1
+This is line 2
+This is line 3
+This is line 4
+This is line 5
+This is line 6
+This is line 7
+This is line 8
+This is line 9
+This is line 10
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Enclosing.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewOuter.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Outer.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/objects/ObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index a77079bc06..a443c0cb29 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -19,5 +19,6 @@
         <module>core-java-lang-oop-patterns</module>
         <module>core-java-lang-oop-generics</module>
         <module>core-java-lang-oop-modifiers</module>
+        <module>core-java-lang-oop-types</module>
     </modules>
 </project>
\ No newline at end of file

From 654de59bbf3dfb84961991882826bf150429fc55 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 11:09:04 +0200
Subject: [PATCH 111/404] [JAVA-621] core-java-lang-oop-inheritance module

* Creation

* Moved code from https://www.baeldung.com/java-anonymous-classes

* Moved code from www.baeldung.com/java-polymorphism

* Moved code from www.baeldung.com/java-inheritance

* Moved code from www.baeldung.com/java-variable-method-hiding

* Moved code from https://www.baeldung.com/java-type-casting

* Moved code from https://www.baeldung.com/java-super

* Moved code from www.baeldung.com/java-interfaces

* Moved code from www.baeldung.com/java-abstract-class

* Moved code from www.baeldung.com/java-inner-interfaces

* Moved article references to the new README.md
---
 .../core-java-lang-oop-2/README.md            |  1 -
 .../core-java-lang-oop-3/README.md            |  2 --
 .../core-java-lang-oop-inheritance/README.md  | 14 ++++++++++
 .../core-java-lang-oop-inheritance/pom.xml    | 28 +++++++++++++++++++
 .../application/Application.java              |  0
 .../filereaders/BaseFileReader.java           |  0
 .../filereaders/LowercaseFileReader.java      |  0
 .../filereaders/UppercaseFileReader.java      |  0
 .../java/com/baeldung/anonymous/Book.java     |  0
 .../java/com/baeldung/anonymous/Main.java     |  0
 .../java/com/baeldung/casting/Animal.java     |  0
 .../com/baeldung/casting/AnimalFeeder.java    |  0
 .../baeldung/casting/AnimalFeederGeneric.java |  0
 .../main/java/com/baeldung/casting/Cat.java   |  0
 .../main/java/com/baeldung/casting/Dog.java   |  0
 .../main/java/com/baeldung/casting/Mew.java   |  0
 .../com/baeldung/inheritance/ArmoredCar.java  |  0
 .../java/com/baeldung/inheritance/BMW.java    |  0
 .../java/com/baeldung/inheritance/Car.java    |  0
 .../com/baeldung/inheritance/Employee.java    |  0
 .../com/baeldung/inheritance/Floatable.java   |  0
 .../com/baeldung/inheritance/Flyable.java     |  0
 .../com/baeldung/inheritance/SpaceCar.java    |  0
 .../baeldung/inheritance/SpaceTraveller.java  |  0
 .../CommaSeparatedCustomers.java              |  0
 .../baeldung/innerinterfaces/Customer.java    |  0
 .../java/com/baeldung/interfaces/Box.java     |  0
 .../com/baeldung/interfaces/Employee.java     |  0
 .../interfaces/EmployeeSalaryComparator.java  |  0
 .../com/baeldung/interfaces/HasColor.java     |  0
 .../interfaces/multiinheritance/Car.java      |  0
 .../interfaces/multiinheritance/Fly.java      |  0
 .../multiinheritance/Transform.java           |  0
 .../interfaces/multiinheritance/Vehicle.java  |  0
 .../interfaces/polymorphysim/Circle.java      |  0
 .../polymorphysim/MainTestClass.java          |  0
 .../interfaces/polymorphysim/Shape.java       |  0
 .../interfaces/polymorphysim/Square.java      |  0
 .../keyword/superkeyword}/KeywordDemo.java    |  4 +--
 .../keyword/superkeyword/SuperBase.java       |  0
 .../keyword/superkeyword/SuperSub.java        |  0
 .../baeldung/polymorphism/FileManager.java    |  0
 .../baeldung/polymorphism/GenericFile.java    |  0
 .../com/baeldung/polymorphism/ImageFile.java  |  0
 .../com/baeldung/polymorphism/TextFile.java   |  0
 .../scope/method/BaseMethodClass.java         |  0
 .../scope/method/ChildMethodClass.java        |  0
 .../scope/method/MethodHidingDemo.java        |  0
 .../scope/variable/ChildVariable.java         |  0
 .../baeldung/scope/variable/HideVariable.java |  0
 .../scope/variable/ParentVariable.java        |  0
 .../scope/variable/VariableHidingDemo.java    |  0
 .../src/main/resources/files/test.txt         |  0
 .../test/LowercaseFileReaderUnitTest.java     |  0
 .../test/UppercaseFileReaderUnitTest.java     |  0
 .../com/baeldung/casting/CastingUnitTest.java |  0
 .../com/baeldung/inheritance/AppUnitTest.java |  0
 .../InnerInterfaceUnitTest.java               |  0
 .../polymorphism/PolymorphismUnitTest.java    |  0
 .../core-java-lang-oop-types/README.md        |  2 --
 .../core-java-lang-oop-types/pom.xml          | 13 ---------
 .../core-java-lang-oop-modules/pom.xml        |  1 +
 .../core-java-lang-oop/README.md              |  4 ---
 63 files changed, 44 insertions(+), 25 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/java/com/baeldung/abstractclasses/application/Application.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/anonymous/Book.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/anonymous/Main.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/casting/Animal.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/casting/AnimalFeeder.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/casting/Cat.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/casting/Dog.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/casting/Mew.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/ArmoredCar.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/BMW.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/Floatable.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/Flyable.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/SpaceCar.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/inheritance/SpaceTraveller.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/java/com/baeldung/innerinterfaces/Customer.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/Box.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/HasColor.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java (100%)
 rename core-java-modules/{core-java-lang-oop-3/src/main/java/com/baeldung/keyword => core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword}/KeywordDemo.java (70%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/polymorphism/FileManager.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/polymorphism/GenericFile.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/polymorphism/ImageFile.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/polymorphism/TextFile.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/method/BaseMethodClass.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/method/ChildMethodClass.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/variable/ChildVariable.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/variable/HideVariable.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/variable/ParentVariable.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/main/resources/files/test.txt (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/test/java/com/baeldung/casting/CastingUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/test/java/com/baeldung/inheritance/AppUnitTest.java (100%)
 rename core-java-modules/core-java-lang-oop-modules/{core-java-lang-oop-types => core-java-lang-oop-inheritance}/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-inheritance}/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index 76da66c7ab..2f122ab624 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -3,6 +3,5 @@
 This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
-- [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
 - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
index 0c9faf9a6d..2d9085c036 100644
--- a/core-java-modules/core-java-lang-oop-3/README.md
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -4,6 +4,4 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
-- [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
-- [Java Interfaces](https://www.baeldung.com/java-interfaces)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)[[More -->]](/core-java-modules/core-java-lang-oop-4)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/README.md
new file mode 100644
index 0000000000..e264f9fae4
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/README.md
@@ -0,0 +1,14 @@
+## Core Java Lang OOP - Types
+
+This module contains articles about types in Java
+
+### Relevant Articles: 
+- [Java Interfaces](https://www.baeldung.com/java-interfaces)
+- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
+- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
+- [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
+- [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
+- [Polymorphism in Java](https://www.baeldung.com/java-polymorphism)
+- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
+- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
+- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml
new file mode 100644
index 0000000000..8e7e8e374d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-inheritance</artifactId>
+    <name>core-java-lang-oop-inheritance</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <assertj-core.version>3.10.0</assertj-core.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/application/Application.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/application/Application.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/anonymous/Book.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/anonymous/Book.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/anonymous/Main.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/anonymous/Main.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/Customer.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/innerinterfaces/Customer.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Box.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Box.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Employee.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/HasColor.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
similarity index 70%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
index ed421a9089..7414e52b1c 100644
--- a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
@@ -1,6 +1,4 @@
-package com.baeldung.keyword;
-
-import com.baeldung.keyword.superkeyword.SuperSub;
+package com.baeldung.keyword.superkeyword;
 
 /**
  * Created by Gebruiker on 5/14/2018.
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/resources/files/test.txt b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/resources/files/test.txt
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/resources/files/test.txt
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/resources/files/test.txt
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
index 330a74be9b..80344c70fa 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
@@ -5,7 +5,5 @@ This module contains articles about types in Java
 ### Relevant Articles: 
 - [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
 - [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
-- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
 - [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
-- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
 - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
index ce6b74bd3e..156ff89ccd 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
@@ -12,17 +12,4 @@
     <artifactId>core-java-lang-oop-types</artifactId>
     <name>core-java-lang-oop-types</name>
     <packaging>jar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>${assertj-core.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <properties>
-        <assertj-core.version>3.10.0</assertj-core.version>
-    </properties>
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index a443c0cb29..3f33150424 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -20,5 +20,6 @@
         <module>core-java-lang-oop-generics</module>
         <module>core-java-lang-oop-modifiers</module>
         <module>core-java-lang-oop-types</module>
+        <module>core-java-lang-oop-inheritance</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
index c09ed6048d..7855fb7b7e 100644
--- a/core-java-modules/core-java-lang-oop/README.md
+++ b/core-java-modules/core-java-lang-oop/README.md
@@ -4,12 +4,8 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
-- [Polymorphism in Java](https://www.baeldung.com/java-polymorphism)
 - [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override)
 - [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
-- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
-- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
 - [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
-- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
 - [Object-Oriented-Programming Concepts in Java](https://www.baeldung.com/java-oop)
 - [[More -->]](/core-java-modules/core-java-lang-oop-2)

From b1e507d44c3c44d2b1625d27a75dc4726926b38e Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 11:38:22 +0200
Subject: [PATCH 112/404] [JAVA-621] core-java-lang-oop-methods module

* Creation

* Moved code from https://www.baeldung.com/java-equals-hashcode-contracts

* Moved code from www.baeldung.com/java-hashcode

* Moved code from https://www.baeldung.com/java-method-overload-override

* Moved code from www.baeldung.com/java-methods

* Moved article references to the new README.md
---
 .../core-java-lang-oop-2/README.md            |  1 -
 .../core-java-lang-oop-4/README.md            |  1 -
 .../core-java-lang-oop-methods/README.md      |  9 +++++
 .../core-java-lang-oop-methods/pom.xml        | 35 +++++++++++++++++++
 .../com/baeldung/basicmethods/PersonName.java |  0
 .../com/baeldung/equalshashcode/Money.java    |  0
 .../com/baeldung/equalshashcode/Team.java     |  0
 .../com/baeldung/equalshashcode/Voucher.java  |  0
 .../baeldung/equalshashcode/WrongTeam.java    |  0
 .../baeldung/equalshashcode/WrongVoucher.java |  0
 .../com/baeldung/hashcode/entities/User.java  |  0
 .../application/Application.java              |  0
 .../model/Car.java                            |  0
 .../model/Vehicle.java                        |  0
 .../util/Multiplier.java                      |  0
 .../equalshashcode/MoneyUnitTest.java         |  0
 .../baeldung/equalshashcode/TeamUnitTest.java |  0
 .../application/ApplicationUnitTest.java      |  0
 .../hashcode/entities/UserUnitTest.java       |  0
 .../test/MethodOverloadingUnitTest.java       |  0
 .../test/MethodOverridingUnitTest.java        |  0
 .../core-java-lang-oop-modules/pom.xml        |  1 +
 .../core-java-lang-oop/README.md              |  2 --
 23 files changed, 45 insertions(+), 4 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/basicmethods/PersonName.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/equalshashcode/Money.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/equalshashcode/Team.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/equalshashcode/Voucher.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/equalshashcode/WrongTeam.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/hashcode/entities/User.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-modules/core-java-lang-oop-methods}/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index 2f122ab624..5385977ef0 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -3,5 +3,4 @@
 This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
-- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-4/README.md b/core-java-modules/core-java-lang-oop-4/README.md
index 51650dc1f6..efddf9df8a 100644
--- a/core-java-modules/core-java-lang-oop-4/README.md
+++ b/core-java-modules/core-java-lang-oop-4/README.md
@@ -4,6 +4,5 @@ This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
 - [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
-- [Methods in Java](https://www.baeldung.com/java-methods)
 - [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword)
 - [[<-- Prev]](/core-java-modules/core-java-lang-oop-3)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/README.md
new file mode 100644
index 0000000000..fa474c9795
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/README.md
@@ -0,0 +1,9 @@
+## Core Java Lang OOP - Methods
+
+This module contains articles about methods in Java
+
+### Relevant Articles: 
+- [Methods in Java](https://www.baeldung.com/java-methods)
+- [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override)
+- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
+- [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml
new file mode 100644
index 0000000000..062af9c3cd
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-methods</artifactId>
+    <name>core-java-lang-oop-methods</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>nl.jqno.equalsverifier</groupId>
+            <artifactId>equalsverifier</artifactId>
+            <version>${equalsverifier.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <assertj-core.version>3.10.0</assertj-core.version>
+        <equalsverifier.version>3.0.3</equalsverifier.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/basicmethods/PersonName.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index 3f33150424..369195d477 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -21,5 +21,6 @@
         <module>core-java-lang-oop-modifiers</module>
         <module>core-java-lang-oop-types</module>
         <module>core-java-lang-oop-inheritance</module>
+        <module>core-java-lang-oop-methods</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
index 7855fb7b7e..f7e00e44eb 100644
--- a/core-java-modules/core-java-lang-oop/README.md
+++ b/core-java-modules/core-java-lang-oop/README.md
@@ -3,8 +3,6 @@
 This module contains articles about Object-oriented programming (OOP) in Java
 
 ### Relevant Articles: 
-- [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
-- [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override)
 - [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
 - [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
 - [Object-Oriented-Programming Concepts in Java](https://www.baeldung.com/java-oop)

From f6d3dc711fde92b6f05bc2aaad029baf8e7c0b6f Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 12:05:22 +0200
Subject: [PATCH 113/404] [JAVA-621] core-java-lang-oop-others module

* Creation

* Moved code from www.baeldung.com/java-static-dynamic-binding

* Recreated code for https://www.baeldung.com/java-oop as none was
matching anymore

* Moved code from https://www.baeldung.com/java-pass-by-value-or-pass-by-reference

* Moved article references to the new README.md
---
 .../core-java-lang-oop-others/README.md       |  8 +++
 .../core-java-lang-oop-others/pom.xml         | 16 +++++
 .../java/com/baeldung/binding/Animal.java     |  0
 .../com/baeldung/binding/AnimalActivity.java  |  4 +-
 .../main/java/com/baeldung/binding/Dog.java}  |  4 +-
 .../java/com/baeldung/oop/ArmoredCar.java     | 13 ++++
 .../src/main/java/com/baeldung/oop/Car.java   | 58 +++++++++++++++++
 .../java/com/baeldung/oop/GenericFile.java    | 63 +++++++++++++++++++
 .../main/java/com/baeldung/oop/ImageFile.java | 41 ++++++++++++
 .../main/java/com/baeldung/oop/TextFile.java  | 44 +++++++++++++
 .../main/java/com/baeldung/oop/Vehicle.java   | 23 +++++++
 .../parameterpassing/NonPrimitives.java       |  0
 .../baeldung/parameterpassing/Primitives.java |  0
 .../binding/AnimalActivityUnitTest.java       |  6 +-
 .../com/baeldung/binding/AnimalUnitTest.java  |  0
 .../com/baeldung/binding/DogUnitTest.java}    |  6 +-
 .../NonPrimitivesUnitTest.java                |  0
 .../parameterpassing/PrimitivesUnitTest.java  |  0
 .../core-java-lang-oop-modules/pom.xml        |  1 +
 .../core-java-lang-oop/README.md              |  1 -
 20 files changed, 277 insertions(+), 11 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/README.md
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/main/java/com/baeldung/binding/Animal.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/main/java/com/baeldung/binding/AnimalActivity.java (90%)
 rename core-java-modules/{core-java-lang-oop-4/src/main/java/com/baeldung/binding/Cat.java => core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java} (68%)
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java
 create mode 100644 core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/main/java/com/baeldung/parameterpassing/Primitives.java (100%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java (96%)
 rename core-java-modules/{core-java-lang-oop-4 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/test/java/com/baeldung/binding/AnimalUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-4/src/test/java/com/baeldung/binding/CatUnitTest.java => core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java} (94%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-3 => core-java-lang-oop-modules/core-java-lang-oop-others}/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/README.md b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/README.md
new file mode 100644
index 0000000000..d3909c0014
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/README.md
@@ -0,0 +1,8 @@
+## Core Java Lang OOP - Others
+
+This module contains articles about Object Oriented Programming (OOP) in Java
+
+### Relevant Articles: 
+- [Object-Oriented-Programming Concepts in Java](https://www.baeldung.com/java-oop)
+- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
+- [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml
new file mode 100644
index 0000000000..21699cd582
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>core-java-lang-oop-modules</artifactId>
+        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>core-java-lang-oop-others</artifactId>
+    <name>core-java-lang-oop-others</name>
+    <packaging>jar</packaging>
+
+</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/Animal.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/Animal.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/AnimalActivity.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java
similarity index 90%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/AnimalActivity.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java
index 1bd36123e3..a30c3acd00 100644
--- a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/AnimalActivity.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java
@@ -15,7 +15,7 @@ public class AnimalActivity {
         logger.info("Animal is sleeping");
     }
 
-    public static void sleep(Cat cat) {
+    public static void sleep(Dog dog) {
         logger.info("Cat is sleeping");
     }
 
@@ -30,7 +30,7 @@ public class AnimalActivity {
 
 
         //assigning a dog object to reference of type Animal
-        Animal catAnimal = new Cat();
+        Animal catAnimal = new Dog();
 
         catAnimal.makeNoise();
 
diff --git a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/Cat.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java
similarity index 68%
rename from core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/Cat.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java
index bbe740e412..b6924569d0 100644
--- a/core-java-modules/core-java-lang-oop-4/src/main/java/com/baeldung/binding/Cat.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java
@@ -6,9 +6,9 @@ import org.slf4j.LoggerFactory;
 /**
  * Created by madhumita.g on 25-07-2018.
  */
-public class Cat extends Animal {
+public class Dog extends Animal {
 
-    final static Logger logger = LoggerFactory.getLogger(Cat.class);
+    final static Logger logger = LoggerFactory.getLogger(Dog.class);
 
     public void makeNoise() {
 
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java
new file mode 100644
index 0000000000..29cba3702a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java
@@ -0,0 +1,13 @@
+package com.baeldung.oop;
+
+public class ArmoredCar extends Car {
+    private int bulletProofWindows;
+
+    public ArmoredCar(String type, String model, String color) {
+        super(type, model, color);
+    }
+
+    public void remoteStartCar() {
+        // this vehicle can be started by using a remote control
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java
new file mode 100644
index 0000000000..8ea4d779b6
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java
@@ -0,0 +1,58 @@
+package com.baeldung.oop;
+
+public class Car extends Vehicle {
+
+    private String type;
+    private String color;
+    private int speed;
+    private int numberOfGears;
+
+    public Car(String type, String model, String color) {
+        super(4, model);
+        this.type = type;
+        this.color = color;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public int getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(int speed) {
+        this.speed = speed;
+    }
+
+    public int increaseSpeed(int increment) {
+        if (increment > 0) {
+            this.speed += increment;
+        } else {
+            System.out.println("Increment can't be negative.");
+        }
+        return this.speed;
+    }
+    
+    public int decreaseSpeed(int decrement) {
+        if (decrement > 0 && decrement <= this.speed) {
+            this.speed -= decrement;
+        } else {
+            System.out.println("Decrement can't be negative or greater than current speed.");
+        }
+        return this.speed;
+    }
+
+    public void openDoors() {
+        // process to open the doors
+    }
+
+    @Override
+    public void honk() {
+        // produces car-specific honk
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java
new file mode 100644
index 0000000000..812a3f1d63
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java
@@ -0,0 +1,63 @@
+package com.baeldung.oop;
+
+import java.util.Date;
+
+public class GenericFile {
+    private String name;
+    private String extension;
+    private Date dateCreated;
+    private String version;
+    private byte[] content;
+
+    public GenericFile() {
+        this.setDateCreated(new Date());
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getExtension() {
+        return extension;
+    }
+
+    public void setExtension(String extension) {
+        this.extension = extension;
+    }
+
+    public Date getDateCreated() {
+        return dateCreated;
+    }
+
+    public void setDateCreated(Date dateCreated) {
+        this.dateCreated = dateCreated;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public byte[] getContent() {
+        return content;
+    }
+
+    public void setContent(byte[] content) {
+        this.content = content;
+    }
+
+    public String getFileInfo() {
+        return "Generic File Impl";
+    }
+
+    public Object read() {
+        return content;
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java
new file mode 100644
index 0000000000..2e2b9b4129
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java
@@ -0,0 +1,41 @@
+package com.baeldung.oop;
+
+public class ImageFile extends GenericFile {
+    private int height;
+    private int width;
+
+    public ImageFile(String name, int height, int width, byte[] content, String version) {
+        this.setHeight(height);
+        this.setWidth(width);
+        this.setContent(content);
+        this.setName(name);
+        this.setVersion(version);
+        this.setExtension(".jpg");
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public void setHeight(int height) {
+        this.height = height;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public String getFileInfo() {
+        return "Image File Impl";
+    }
+
+    public String read() {
+        return this.getContent()
+            .toString();
+    }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java
new file mode 100644
index 0000000000..0d7b8e4192
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java
@@ -0,0 +1,44 @@
+package com.baeldung.oop;
+
+public class TextFile extends GenericFile {
+    private int wordCount;
+
+    public TextFile(String name, String content, String version) {
+        String[] words = content.split(" ");
+        this.setWordCount(words.length > 0 ? words.length : 1);
+        this.setContent(content.getBytes());
+        this.setName(name);
+        this.setVersion(version);
+        this.setExtension(".txt");
+    }
+
+    public int getWordCount() {
+        return wordCount;
+    }
+
+    public void setWordCount(int wordCount) {
+        this.wordCount = wordCount;
+    }
+
+    public String getFileInfo() {
+        return "Text File Impl";
+    }
+
+    public String read() {
+        return this.getContent()
+            .toString();
+    }
+
+    public String read(int limit) {
+        return this.getContent()
+            .toString()
+            .substring(0, limit);
+    }
+
+    public String read(int start, int stop) {
+        return this.getContent()
+            .toString()
+            .substring(start, stop);
+    }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java
new file mode 100644
index 0000000000..d5ef05bc31
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java
@@ -0,0 +1,23 @@
+package com.baeldung.oop;
+
+public class Vehicle {
+    private int wheels;
+    private String model;
+
+    public Vehicle(int wheels, String model) {
+        this.wheels = wheels;
+        this.model = model;
+    }
+
+    public void start() {
+        // the process of starting the vehicle
+    }
+
+    public void stop() {
+        // process to stop the vehicle
+    }
+
+    public void honk() {
+        // produces a default honk
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/Primitives.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/Primitives.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
index 41c67ff389..6ef9b51818 100644
--- a/core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
@@ -62,9 +62,9 @@ public class AnimalActivityUnitTest {
     @Test
     public void givenDogReference__whenRefersCatObject_shouldCallFunctionWithAnimalParam() {
 
-        Cat cat = new Cat();
+        Dog dog = new Dog();
 
-        AnimalActivity.sleep(cat);
+        AnimalActivity.sleep(dog);
 
         verify(mockAppender).doAppend(captorLoggingEvent.capture());
 
@@ -79,7 +79,7 @@ public class AnimalActivityUnitTest {
     @Test
     public void givenAnimaReference__whenRefersDogObject_shouldCallFunctionWithAnimalParam() {
 
-        Animal cat = new Cat();
+        Animal cat = new Dog();
 
         AnimalActivity.sleep(cat);
 
diff --git a/core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/AnimalUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/AnimalUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/CatUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/CatUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java
index 76ccfb7719..977c5d65e6 100644
--- a/core-java-modules/core-java-lang-oop-4/src/test/java/com/baeldung/binding/CatUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java
@@ -22,7 +22,7 @@ import static org.mockito.Mockito.verify;
  * Created by madhumita.g on 01-08-2018.
  */
 @RunWith(MockitoJUnitRunner.class)
-public class CatUnitTest {
+public class DogUnitTest {
 
     @Mock
     private Appender mockAppender;
@@ -45,9 +45,9 @@ public class CatUnitTest {
     @Test
     public void makeNoiseTest() {
 
-        Cat cat = new Cat();
+        Dog dog = new Dog();
 
-        cat.makeNoise();
+        dog.makeNoise();
 
         verify(mockAppender).doAppend(captorLoggingEvent.capture());
 
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
index 369195d477..39dfe16b17 100644
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modules/pom.xml
@@ -22,5 +22,6 @@
         <module>core-java-lang-oop-types</module>
         <module>core-java-lang-oop-inheritance</module>
         <module>core-java-lang-oop-methods</module>
+        <module>core-java-lang-oop-others</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
index f7e00e44eb..1af957b532 100644
--- a/core-java-modules/core-java-lang-oop/README.md
+++ b/core-java-modules/core-java-lang-oop/README.md
@@ -5,5 +5,4 @@ This module contains articles about Object-oriented programming (OOP) in Java
 ### Relevant Articles: 
 - [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
 - [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
-- [Object-Oriented-Programming Concepts in Java](https://www.baeldung.com/java-oop)
 - [[More -->]](/core-java-modules/core-java-lang-oop-2)

From fc303de35fd62000f901db6608c2d708abd6ea0d Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 4 Apr 2020 12:24:39 +0200
Subject: [PATCH 114/404] [JAVA-621] Obsolete modules deletion

* Delete core-java-lang-oop module (remaining code
was duplicate of core-java-lang-syntax where it really belonged)

* Moved code from https://www.baeldung.com/java-eclipse-equals-and-hashcode to core-java-lang where it belong

* Delete core-java-lang-oop-2 module

* Delete core-java-lang-oop-3 module

* Delete core-java-lang-oop-4 module
---
 .../core-java-lang-oop-2/.gitignore           |  4 --
 .../core-java-lang-oop-2/README.md            |  6 --
 .../core-java-lang-oop-2/pom.xml              | 51 ---------------
 .../src/main/resources/files/test.txt         | 10 ---
 .../core-java-lang-oop-3/README.md            |  7 ---
 .../core-java-lang-oop-3/pom.xml              | 60 ------------------
 .../core-java-lang-oop-4/README.md            |  8 ---
 .../core-java-lang-oop-4/pom.xml              | 60 ------------------
 .../core-java-lang-oop/.gitignore             | 26 --------
 .../core-java-lang-oop/README.md              |  8 ---
 core-java-modules/core-java-lang-oop/pom.xml  | 62 -------------------
 .../baeldung/initializationguide/User.java    | 53 ----------------
 .../src/main/resources/logback.xml            | 19 ------
 .../initializationguide/UserUnitTest.java     | 37 -----------
 .../src/test/resources/.gitignore             | 13 ----
 .../equalshashcode/entities/ComplexClass.java |  0
 .../entities/PrimitiveClass.java              |  0
 .../equalshashcode/entities/Rectangle.java    |  0
 .../equalshashcode/entities/Shape.java        |  0
 .../equalshashcode/entities/Square.java       |  0
 .../entities/ComplexClassUnitTest.java        |  0
 .../entities/PrimitiveClassUnitTest.java      |  0
 .../entities/SquareClassUnitTest.java         |  0
 core-java-modules/pom.xml                     |  4 --
 24 files changed, 428 deletions(-)
 delete mode 100644 core-java-modules/core-java-lang-oop-2/.gitignore
 delete mode 100644 core-java-modules/core-java-lang-oop-2/README.md
 delete mode 100644 core-java-modules/core-java-lang-oop-2/pom.xml
 delete mode 100644 core-java-modules/core-java-lang-oop-2/src/main/resources/files/test.txt
 delete mode 100644 core-java-modules/core-java-lang-oop-3/README.md
 delete mode 100644 core-java-modules/core-java-lang-oop-3/pom.xml
 delete mode 100644 core-java-modules/core-java-lang-oop-4/README.md
 delete mode 100644 core-java-modules/core-java-lang-oop-4/pom.xml
 delete mode 100644 core-java-modules/core-java-lang-oop/.gitignore
 delete mode 100644 core-java-modules/core-java-lang-oop/README.md
 delete mode 100644 core-java-modules/core-java-lang-oop/pom.xml
 delete mode 100644 core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java
 delete mode 100644 core-java-modules/core-java-lang-oop/src/main/resources/logback.xml
 delete mode 100644 core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
 delete mode 100644 core-java-modules/core-java-lang-oop/src/test/resources/.gitignore
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/main/java/com/baeldung/equalshashcode/entities/Shape.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/main/java/com/baeldung/equalshashcode/entities/Square.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-2 => core-java-lang}/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-2/.gitignore b/core-java-modules/core-java-lang-oop-2/.gitignore
deleted file mode 100644
index 36aba1c242..0000000000
--- a/core-java-modules/core-java-lang-oop-2/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-target/
-.idea/
-bin/
-*.iml
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
deleted file mode 100644
index 5385977ef0..0000000000
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## Core Java Lang OOP (Part 2)
-
-This module contains articles about Object-oriented programming (OOP) in Java
-
-### Relevant Articles: 
-- [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml
deleted file mode 100644
index ccacaf7116..0000000000
--- a/core-java-modules/core-java-lang-oop-2/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>core-java-lang-oop-2</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
-    <name>core-java-lang-oop-2</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
-    </parent>
-
-    <dependencies>
-        <!-- test scoped -->
-        <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>${assertj-core.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>nl.jqno.equalsverifier</groupId>
-            <artifactId>equalsverifier</artifactId>
-            <version>${equalsverifier.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <finalName>core-java-lang-oop-2</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-    <properties>
-        <!-- testing -->
-        <assertj-core.version>3.10.0</assertj-core.version>
-        <equalsverifier.version>3.0.3</equalsverifier.version>
-    </properties>
-
-</project>
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/resources/files/test.txt b/core-java-modules/core-java-lang-oop-2/src/main/resources/files/test.txt
deleted file mode 100644
index 08e53af69d..0000000000
--- a/core-java-modules/core-java-lang-oop-2/src/main/resources/files/test.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This is line 1
-This is line 2
-This is line 3
-This is line 4
-This is line 5
-This is line 6
-This is line 7
-This is line 8
-This is line 9
-This is line 10
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
deleted file mode 100644
index 2d9085c036..0000000000
--- a/core-java-modules/core-java-lang-oop-3/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## Core Java Lang OOP (Part 3)
-
-This module contains articles about Object-oriented programming (OOP) in Java
-
-### Relevant Articles: 
-- [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
-- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)[[More -->]](/core-java-modules/core-java-lang-oop-4)
diff --git a/core-java-modules/core-java-lang-oop-3/pom.xml b/core-java-modules/core-java-lang-oop-3/pom.xml
deleted file mode 100644
index cc9b473d03..0000000000
--- a/core-java-modules/core-java-lang-oop-3/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>core-java-lang-oop-3</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
-    <name>core-java-lang-oop-3</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
-    </parent>
-
-    <dependencies>
-        <!-- logging -->
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <version>${log4j.version}</version>
-        </dependency>
-        <dependency> <!-- needed to bridge to slf4j for projects that use the log4j APIs directly -->
-            <groupId>org.slf4j</groupId>
-            <artifactId>log4j-over-slf4j</artifactId>
-            <version>${org.slf4j.version}</version>
-        </dependency>
-        <!-- test scoped -->
-        <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>${assertj-core.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>${h2.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <finalName>core-java-lang-oop-3</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-    <properties>
-        <assertj-core.version>3.10.0</assertj-core.version>
-    </properties>
-
-</project>
diff --git a/core-java-modules/core-java-lang-oop-4/README.md b/core-java-modules/core-java-lang-oop-4/README.md
deleted file mode 100644
index efddf9df8a..0000000000
--- a/core-java-modules/core-java-lang-oop-4/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-## Core Java Lang OOP (Part 4)
-
-This module contains articles about Object-oriented programming (OOP) in Java
-
-### Relevant Articles: 
-- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
-- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword)
-- [[<-- Prev]](/core-java-modules/core-java-lang-oop-3)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-4/pom.xml b/core-java-modules/core-java-lang-oop-4/pom.xml
deleted file mode 100644
index 3c7e4f446d..0000000000
--- a/core-java-modules/core-java-lang-oop-4/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>core-java-lang-oop-4</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
-    <name>core-java-lang-oop-4</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
-    </parent>
-
-    <dependencies>
-        <!-- logging -->
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <version>${log4j.version}</version>
-        </dependency>
-        <dependency> <!-- needed to bridge to slf4j for projects that use the log4j APIs directly -->
-            <groupId>org.slf4j</groupId>
-            <artifactId>log4j-over-slf4j</artifactId>
-            <version>${org.slf4j.version}</version>
-        </dependency>
-        <!-- test scoped -->
-        <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>${assertj-core.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>${h2.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <finalName>core-java-lang-oop-4</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-    <properties>
-        <assertj-core.version>3.10.0</assertj-core.version>
-    </properties>
-
-</project>
diff --git a/core-java-modules/core-java-lang-oop/.gitignore b/core-java-modules/core-java-lang-oop/.gitignore
deleted file mode 100644
index 3de4cc647e..0000000000
--- a/core-java-modules/core-java-lang-oop/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-*.class
-
-0.*
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-.resourceCache
-
-# Packaged files #
-*.jar
-*.war
-*.ear
-
-# Files generated by integration tests
-*.txt
-backup-pom.xml
-/bin/
-/temp
-
-#IntelliJ specific
-.idea/
-*.iml
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
deleted file mode 100644
index 1af957b532..0000000000
--- a/core-java-modules/core-java-lang-oop/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-## Core Java Lang OOP
-
-This module contains articles about Object-oriented programming (OOP) in Java
-
-### Relevant Articles: 
-- [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
-- [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
-- [[More -->]](/core-java-modules/core-java-lang-oop-2)
diff --git a/core-java-modules/core-java-lang-oop/pom.xml b/core-java-modules/core-java-lang-oop/pom.xml
deleted file mode 100644
index 4415784f85..0000000000
--- a/core-java-modules/core-java-lang-oop/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>core-java-lang-oop</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
-    <name>core-java-lang-oop</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
-        <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>${commons-lang3.version}</version>
-        </dependency>
-        <!-- web -->
-        <!-- marshalling -->
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <version>${jackson.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>${gson.version}</version>
-        </dependency>
-        <!-- test scoped -->
-        <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>${assertj-core.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <finalName>core-java-lang-oop</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-    <properties>
-        <gson.version>2.8.2</gson.version>
-        <!-- testing -->
-        <assertj-core.version>3.10.0</assertj-core.version>
-    </properties>
-
-</project>
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java b/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java
deleted file mode 100644
index 1d9a872d69..0000000000
--- a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.baeldung.initializationguide;
-
-import java.io.Serializable;
-
-public class User implements Serializable, Cloneable {
-    private static final long serialVersionUID = 1L;
-    static String forum;
-    private String name;
-    private int id;
-
-    {
-        id = 0;
-        System.out.println("Instance Initializer");
-    }
-
-    static {
-    	forum = "Java";
-        System.out.println("Static Initializer");
-    }
-
-    public User(String name, int id) {
-        super();
-        this.name = name;
-        this.id = id;
-    }
-
-    public User() {
-        System.out.println("Constructor");
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    @Override
-    protected Object clone() throws CloneNotSupportedException {
-        return this;
-    }
-
-}
-
diff --git a/core-java-modules/core-java-lang-oop/src/main/resources/logback.xml b/core-java-modules/core-java-lang-oop/src/main/resources/logback.xml
deleted file mode 100644
index 56af2d397e..0000000000
--- a/core-java-modules/core-java-lang-oop/src/main/resources/logback.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration>
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-            </pattern>
-        </encoder>
-    </appender>
-
-    <logger name="org.springframework" level="WARN" />
-    <logger name="org.springframework.transaction" level="WARN" />
-
-    <!-- in order to debug some marshalling issues, this needs to be TRACE -->
-    <logger name="org.springframework.web.servlet.mvc" level="WARN" />
-
-    <root level="INFO">
-        <appender-ref ref="STDOUT" />
-    </root>
-</configuration>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
deleted file mode 100644
index a26b602609..0000000000
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.baeldung.initializationguide;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.*;
-
-import java.lang.reflect.InvocationTargetException;
-
-public class UserUnitTest {
-
-    @Test
-    public void givenUserInstance_whenIntializedWithNew_thenInstanceIsNotNull() {
-        User user = new User("Alice", 1);
-        assertThat(user).isNotNull();
-    }
-
-    @Test
-    public void givenUserInstance_whenInitializedWithReflection_thenInstanceIsNotNull() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
-        User user = User.class.getConstructor(String.class, int.class)
-            .newInstance("Alice", 2);
-        assertThat(user).isNotNull();
-    }
-
-    @Test
-    public void givenUserInstance_whenCopiedWithClone_thenExactMatchIsCreated() throws CloneNotSupportedException {
-        User user = new User("Alice", 3);
-        User clonedUser = (User) user.clone();
-        assertThat(clonedUser).isEqualTo(user);
-    }
-
-    @Test
-    public void givenUserInstance_whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault() {
-        User user = new User();
-        assertThat(user.getName()).isNull();
-        assertThat(user.getId() == 0);
-    }
-}
diff --git a/core-java-modules/core-java-lang-oop/src/test/resources/.gitignore b/core-java-modules/core-java-lang-oop/src/test/resources/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/core-java-modules/core-java-lang-oop/src/test/resources/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.class
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 4d64f7e6ba..995700d32c 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -86,10 +86,6 @@
         <module>core-java-lang-math</module>
         <module>core-java-lang-math-2</module>
         <module>core-java-lang-oop-modules</module>
-        <module>core-java-lang-oop</module>
-        <module>core-java-lang-oop-2</module>
-        <module>core-java-lang-oop-3</module>
-        <module>core-java-lang-oop-4</module>
         <module>core-java-lang-operators</module>
         <module>core-java-lang-syntax</module>
         <module>core-java-lang-syntax-2</module>

From b117f4ccd644385b4bda5269ae33ace4c90f70b8 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Tue, 7 Apr 2020 21:28:45 +0200
Subject: [PATCH 115/404] [JAVA-621] Flattened modules hierarchy

---
 .../core-java-lang-oop-constructors/README.md |  0
 .../core-java-lang-oop-constructors/pom.xml   |  4 +--
 .../baeldung/constructors/BankAccount.java    |  0
 .../baeldung/constructors/Transaction.java    |  0
 .../baeldung/copyconstructor/Employee.java    |  0
 .../com/baeldung/copyconstructor/Manager.java |  0
 .../supertypecompilerexception/MyClass.java   |  0
 .../MyClassSolution1.java                     |  0
 .../MyClassSolution2.java                     |  0
 .../MyClassSolution3.java                     |  0
 .../MyException.java                          |  0
 .../constructors/ConstructorUnitTest.java     |  0
 .../copyconstructor/EmployeeUnitTest.java     |  0
 .../copyconstructor/ManagerUnitTest.java      |  0
 .../core-java-lang-oop-generics/README.md     |  0
 .../core-java-lang-oop-generics/pom.xml       |  4 +--
 .../java/com/baeldung/generics/Entry.java     |  0
 .../com/baeldung/generics/GenericEntry.java   |  0
 .../java/com/baeldung/generics/MapEntry.java  |  0
 .../java/com/baeldung/generics/Product.java   |  0
 .../java/com/baeldung/generics/Rankable.java  |  0
 .../com/baeldung/rawtype/RawTypeDemo.java     |  0
 .../typeerasure/ArrayContentPrintUtil.java    |  0
 .../com/baeldung/typeerasure/BoundStack.java  |  0
 .../baeldung/typeerasure/IntegerStack.java    |  0
 .../java/com/baeldung/typeerasure/Stack.java  |  0
 .../generics/GenericConstructorUnitTest.java  |  0
 .../typeerasure/TypeErasureUnitTest.java      |  0
 .../core-java-lang-oop-inheritance/README.md  |  0
 .../core-java-lang-oop-inheritance/pom.xml    |  4 +--
 .../application/Application.java              |  0
 .../filereaders/BaseFileReader.java           |  0
 .../filereaders/LowercaseFileReader.java      |  0
 .../filereaders/UppercaseFileReader.java      |  0
 .../java/com/baeldung/anonymous/Book.java     |  0
 .../java/com/baeldung/anonymous/Main.java     |  0
 .../java/com/baeldung/casting/Animal.java     |  0
 .../com/baeldung/casting/AnimalFeeder.java    |  0
 .../baeldung/casting/AnimalFeederGeneric.java |  0
 .../main/java/com/baeldung/casting/Cat.java   |  0
 .../main/java/com/baeldung/casting/Dog.java   |  0
 .../main/java/com/baeldung/casting/Mew.java   |  0
 .../com/baeldung/inheritance/ArmoredCar.java  |  0
 .../java/com/baeldung/inheritance/BMW.java    |  0
 .../java/com/baeldung/inheritance/Car.java    |  0
 .../com/baeldung/inheritance/Employee.java    |  0
 .../com/baeldung/inheritance/Floatable.java   |  0
 .../com/baeldung/inheritance/Flyable.java     |  0
 .../com/baeldung/inheritance/SpaceCar.java    |  0
 .../baeldung/inheritance/SpaceTraveller.java  |  0
 .../CommaSeparatedCustomers.java              |  0
 .../baeldung/innerinterfaces/Customer.java    |  0
 .../java/com/baeldung/interfaces/Box.java     |  0
 .../com/baeldung/interfaces/Employee.java     |  0
 .../interfaces/EmployeeSalaryComparator.java  |  0
 .../com/baeldung/interfaces/HasColor.java     |  0
 .../interfaces/multiinheritance/Car.java      |  0
 .../interfaces/multiinheritance/Fly.java      |  0
 .../multiinheritance/Transform.java           |  0
 .../interfaces/multiinheritance/Vehicle.java  |  0
 .../interfaces/polymorphysim/Circle.java      |  0
 .../polymorphysim/MainTestClass.java          |  0
 .../interfaces/polymorphysim/Shape.java       |  0
 .../interfaces/polymorphysim/Square.java      |  0
 .../keyword/superkeyword/KeywordDemo.java     |  0
 .../keyword/superkeyword/SuperBase.java       |  0
 .../keyword/superkeyword/SuperSub.java        |  0
 .../baeldung/polymorphism/FileManager.java    |  0
 .../baeldung/polymorphism/GenericFile.java    |  0
 .../com/baeldung/polymorphism/ImageFile.java  |  0
 .../com/baeldung/polymorphism/TextFile.java   |  0
 .../scope/method/BaseMethodClass.java         |  0
 .../scope/method/ChildMethodClass.java        |  0
 .../scope/method/MethodHidingDemo.java        |  0
 .../scope/variable/ChildVariable.java         |  0
 .../baeldung/scope/variable/HideVariable.java |  0
 .../scope/variable/ParentVariable.java        |  0
 .../scope/variable/VariableHidingDemo.java    |  0
 .../src/main/resources/files/test.txt         |  0
 .../test/LowercaseFileReaderUnitTest.java     |  0
 .../test/UppercaseFileReaderUnitTest.java     |  0
 .../com/baeldung/casting/CastingUnitTest.java |  0
 .../com/baeldung/inheritance/AppUnitTest.java |  0
 .../InnerInterfaceUnitTest.java               |  0
 .../polymorphism/PolymorphismUnitTest.java    |  0
 .../core-java-lang-oop-methods/README.md      |  0
 .../core-java-lang-oop-methods/pom.xml        |  4 +--
 .../com/baeldung/basicmethods/PersonName.java |  0
 .../com/baeldung/equalshashcode/Money.java    |  0
 .../com/baeldung/equalshashcode/Team.java     |  0
 .../com/baeldung/equalshashcode/Voucher.java  |  0
 .../baeldung/equalshashcode/WrongTeam.java    |  0
 .../baeldung/equalshashcode/WrongVoucher.java |  0
 .../com/baeldung/hashcode/entities/User.java  |  0
 .../application/Application.java              |  0
 .../model/Car.java                            |  0
 .../model/Vehicle.java                        |  0
 .../util/Multiplier.java                      |  0
 .../equalshashcode/MoneyUnitTest.java         |  0
 .../baeldung/equalshashcode/TeamUnitTest.java |  0
 .../application/ApplicationUnitTest.java      |  0
 .../hashcode/entities/UserUnitTest.java       |  0
 .../test/MethodOverloadingUnitTest.java       |  0
 .../test/MethodOverridingUnitTest.java        |  0
 .../core-java-lang-oop-modifiers/README.md    |  0
 .../core-java-lang-oop-modifiers/pom.xml      |  4 +--
 .../com/baeldung/accessmodifiers/Public.java  |  0
 .../baeldung/accessmodifiers/SubClass.java    |  0
 .../baeldung/accessmodifiers/SuperPublic.java |  0
 .../another/AnotherPublic.java                |  0
 .../another/AnotherSubClass.java              |  0
 .../another/AnotherSuperPublic.java           |  0
 .../publicmodifier/ListOfThree.java           |  0
 .../publicmodifier/SpecialCharacters.java     |  0
 .../publicmodifier/Student.java               |  0
 .../core/privatemodifier/Employee.java        |  0
 .../core/privatemodifier/ExampleClass.java    |  0
 .../privatemodifier/PublicOuterClass.java     |  0
 .../application/Application.java              |  0
 .../model/Alarm.java                          |  0
 .../model/Car.java                            |  0
 .../model/Motorbike.java                      |  0
 .../model/MultiAlarmCar.java                  |  0
 .../model/Vehicle.java                        |  0
 .../com/baeldung/finalkeyword/BlackCat.java   |  0
 .../com/baeldung/finalkeyword/BlackDog.java   |  0
 .../java/com/baeldung/finalkeyword/Cat.java   |  0
 .../java/com/baeldung/finalkeyword/Dog.java   |  0
 .../java/com/baeldung/staticdemo/Car.java     |  0
 .../com/baeldung/staticdemo/Singleton.java    |  0
 .../com/baeldung/staticdemo/StaticBlock.java  |  0
 .../com/baeldung/strictfpUsage/Circle.java    |  0
 .../strictfpUsage/ScientificCalculator.java   |  0
 .../PublicAccessModifierUnitTest.java         |  0
 .../StaticDefaulInterfaceMethodUnitTest.java  |  0
 .../baeldung/finalkeyword/FinalUnitTest.java  |  0
 .../com/baeldung/staticdemo/CarUnitTest.java  |  0
 .../staticdemo/SingletonUnitTest.java         |  0
 .../staticdemo/StaticBlockUnitTest.java       |  0
 .../ScientificCalculatorUnitTest.java         |  0
 .../core-java-lang-oop-modules/pom.xml        | 27 -------------------
 .../core-java-lang-oop-others/README.md       |  0
 .../core-java-lang-oop-others/pom.xml         |  4 +--
 .../java/com/baeldung/binding/Animal.java     |  0
 .../com/baeldung/binding/AnimalActivity.java  |  0
 .../main/java/com/baeldung/binding/Dog.java   |  0
 .../java/com/baeldung/oop/ArmoredCar.java     |  0
 .../src/main/java/com/baeldung/oop/Car.java   |  0
 .../java/com/baeldung/oop/GenericFile.java    |  0
 .../main/java/com/baeldung/oop/ImageFile.java |  0
 .../main/java/com/baeldung/oop/TextFile.java  |  0
 .../main/java/com/baeldung/oop/Vehicle.java   |  0
 .../parameterpassing/NonPrimitives.java       |  0
 .../baeldung/parameterpassing/Primitives.java |  0
 .../binding/AnimalActivityUnitTest.java       |  0
 .../com/baeldung/binding/AnimalUnitTest.java  |  0
 .../com/baeldung/binding/DogUnitTest.java     |  0
 .../NonPrimitivesUnitTest.java                |  0
 .../parameterpassing/PrimitivesUnitTest.java  |  0
 .../core-java-lang-oop-patterns/README.md     |  0
 .../core-java-lang-oop-patterns/pom.xml       |  4 +--
 .../java/com/baeldung/deepcopy/Address.java   |  0
 .../main/java/com/baeldung/deepcopy/User.java |  0
 .../baeldung/immutableobjects/Currency.java   |  0
 .../com/baeldung/immutableobjects/Money.java  |  0
 .../application/Application.java              |  0
 .../inheritancecomposition/model/Actress.java |  0
 .../model/Computer.java                       |  0
 .../inheritancecomposition/model/Memory.java  |  0
 .../inheritancecomposition/model/Person.java  |  0
 .../model/Processor.java                      |  0
 .../model/SoundCard.java                      |  0
 .../model/StandardMemory.java                 |  0
 .../model/StandardProcessor.java              |  0
 .../model/StandardSoundCard.java              |  0
 .../model/Waitress.java                       |  0
 .../relationships/aggregation/Car.java        |  0
 .../aggregation/CarWithStaticInnerWheel.java  |  0
 .../relationships/aggregation/Wheel.java      |  0
 .../relationships/association/Child.java      |  0
 .../relationships/association/Mother.java     |  0
 .../relationships/composition/Building.java   |  0
 .../BuildingWithDefinitionRoomInMethod.java   |  0
 .../relationships/university/Department.java  |  0
 .../relationships/university/Professor.java   |  0
 .../relationships/university/University.java  |  0
 .../baeldung/deepcopy/DeepCopyUnitTest.java   |  0
 .../deepcopy/ShallowCopyUnitTest.java         |  0
 .../ImmutableObjectsUnitTest.java             |  0
 .../ActressUnitTest.java                      |  0
 .../CompositionUnitTest.java                  |  0
 .../InheritanceUnitTest.java                  |  0
 .../PersonUnitTest.java                       |  0
 .../WaitressUnitTest.java                     |  0
 .../core-java-lang-oop-types/README.md        |  0
 .../core-java-lang-oop-types/pom.xml          |  4 +--
 .../keyword/thiskeyword/KeywordUnitTest.java  |  0
 .../markerinterface/DeletableShape.java       |  0
 .../baeldung/markerinterface/Rectangle.java   |  0
 .../com/baeldung/markerinterface/Shape.java   |  0
 .../baeldung/markerinterface/ShapeDao.java    |  0
 .../main/java/com/baeldung/objects/Car.java   |  0
 .../MarkerInterfaceUnitTest.java              |  0
 .../baeldung/nestedclass/AnonymousInner.java  |  0
 .../com/baeldung/nestedclass/Enclosing.java   |  0
 .../baeldung/nestedclass/NewEnclosing.java    |  0
 .../com/baeldung/nestedclass/NewOuter.java    |  0
 .../java/com/baeldung/nestedclass/Outer.java  |  0
 .../com/baeldung/objects/ObjectsUnitTest.java |  0
 core-java-modules/pom.xml                     |  9 ++++++-
 210 files changed, 24 insertions(+), 44 deletions(-)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/pom.xml (86%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/pom.xml (78%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/pom.xml (86%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/main/resources/files/test.txt (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/pom.xml (89%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/pom.xml (88%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java (100%)
 delete mode 100644 core-java-modules/core-java-lang-oop-modules/pom.xml
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/pom.xml (78%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/pom.xml (91%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/README.md (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/pom.xml (78%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java (100%)
 rename core-java-modules/{core-java-lang-oop-modules => }/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java (100%)

diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/README.md b/core-java-modules/core-java-lang-oop-constructors/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/README.md
rename to core-java-modules/core-java-lang-oop-constructors/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml b/core-java-modules/core-java-lang-oop-constructors/pom.xml
similarity index 86%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml
rename to core-java-modules/core-java-lang-oop-constructors/pom.xml
index e961d68f11..76507103ea 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/pom.xml
+++ b/core-java-modules/core-java-lang-oop-constructors/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/BankAccount.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/constructors/Transaction.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/copyconstructor/Manager.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution1.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution2.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyClassSolution3.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java
rename to core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/supertypecompilerexception/MyException.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
rename to core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
rename to core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
rename to core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/README.md b/core-java-modules/core-java-lang-oop-generics/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/README.md
rename to core-java-modules/core-java-lang-oop-generics/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml b/core-java-modules/core-java-lang-oop-generics/pom.xml
similarity index 78%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml
rename to core-java-modules/core-java-lang-oop-generics/pom.xml
index 167aa695e0..ae141ecda2 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/pom.xml
+++ b/core-java-modules/core-java-lang-oop-generics/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Entry.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/GenericEntry.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/MapEntry.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Product.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/generics/Rankable.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/rawtype/RawTypeDemo.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/BoundStack.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/IntegerStack.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java
rename to core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Stack.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java
rename to core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/generics/GenericConstructorUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
rename to core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/README.md b/core-java-modules/core-java-lang-oop-inheritance/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/README.md
rename to core-java-modules/core-java-lang-oop-inheritance/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
similarity index 86%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml
rename to core-java-modules/core-java-lang-oop-inheritance/pom.xml
index 8e7e8e374d..a48b28a289 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/pom.xml
+++ b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Book.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/anonymous/Main.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Animal.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeeder.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Cat.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Dog.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/casting/Mew.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/ArmoredCar.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/BMW.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Floatable.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/Flyable.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceCar.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/innerinterfaces/Customer.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Box.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/HasColor.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/FileManager.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/GenericFile.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/ImageFile.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/polymorphism/TextFile.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/resources/files/test.txt b/core-java-modules/core-java-lang-oop-inheritance/src/main/resources/files/test.txt
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/main/resources/files/test.txt
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/resources/files/test.txt
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/casting/CastingUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/inheritance/AppUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/README.md b/core-java-modules/core-java-lang-oop-methods/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/README.md
rename to core-java-modules/core-java-lang-oop-methods/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml
similarity index 89%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml
rename to core-java-modules/core-java-lang-oop-methods/pom.xml
index 062af9c3cd..77e8ded8e7 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/pom.xml
+++ b/core-java-modules/core-java-lang-oop-methods/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Money.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Team.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/Voucher.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/README.md b/core-java-modules/core-java-lang-oop-modifiers/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/README.md
rename to core-java-modules/core-java-lang-oop-modifiers/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
similarity index 88%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml
rename to core-java-modules/core-java-lang-oop-modifiers/pom.xml
index 11e0296266..615e20690f 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackCat.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/BlackDog.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Cat.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/finalkeyword/Dog.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/Circle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/strictfpUsage/ScientificCalculator.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/strictfpUsage/ScientificCalculatorUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/pom.xml b/core-java-modules/core-java-lang-oop-modules/pom.xml
deleted file mode 100644
index 39dfe16b17..0000000000
--- a/core-java-modules/core-java-lang-oop-modules/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>core-java-modules</artifactId>
-        <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
-    <artifactId>core-java-lang-oop-modules</artifactId>
-    <name>core-java-lang-oop-modules</name>
-    <packaging>pom</packaging>
-
-    <modules>
-        <module>core-java-lang-oop-constructors</module>
-        <module>core-java-lang-oop-patterns</module>
-        <module>core-java-lang-oop-generics</module>
-        <module>core-java-lang-oop-modifiers</module>
-        <module>core-java-lang-oop-types</module>
-        <module>core-java-lang-oop-inheritance</module>
-        <module>core-java-lang-oop-methods</module>
-        <module>core-java-lang-oop-others</module>
-    </modules>
-</project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/README.md b/core-java-modules/core-java-lang-oop-others/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/README.md
rename to core-java-modules/core-java-lang-oop-others/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml b/core-java-modules/core-java-lang-oop-others/pom.xml
similarity index 78%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml
rename to core-java-modules/core-java-lang-oop-others/pom.xml
index 21699cd582..8eab301748 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/pom.xml
+++ b/core-java-modules/core-java-lang-oop-others/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Animal.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/AnimalActivity.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/binding/Dog.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ArmoredCar.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/GenericFile.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/ImageFile.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/TextFile.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/oop/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java
rename to core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/parameterpassing/Primitives.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
rename to core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java
rename to core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/AnimalUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java
rename to core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/binding/DogUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/README.md b/core-java-modules/core-java-lang-oop-patterns/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/README.md
rename to core-java-modules/core-java-lang-oop-patterns/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml b/core-java-modules/core-java-lang-oop-patterns/pom.xml
similarity index 91%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml
rename to core-java-modules/core-java-lang-oop-patterns/pom.xml
index 5bd3c70542..0102ef2653 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/pom.xml
+++ b/core-java-modules/core-java-lang-oop-patterns/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/Address.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopy/User.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Child.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/association/Mother.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/Building.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Department.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/Professor.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java
rename to core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/relationships/university/University.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
rename to core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-types/README.md
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/README.md
rename to core-java-modules/core-java-lang-oop-types/README.md
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml b/core-java-modules/core-java-lang-oop-types/pom.xml
similarity index 78%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
rename to core-java-modules/core-java-lang-oop-types/pom.xml
index 156ff89ccd..f73434a9ff 100644
--- a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/pom.xml
+++ b/core-java-modules/core-java-lang-oop-types/pom.xml
@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>core-java-lang-oop-modules</artifactId>
-        <groupId>com.baeldung.core-java-lang-oop-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/DeletableShape.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/Shape.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/markerinterface/ShapeDao.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/objects/Car.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Enclosing.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/NewOuter.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/Outer.java
diff --git a/core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-modules/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 995700d32c..c6cc3726e1 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -85,7 +85,14 @@
         <module>core-java-lang-2</module>
         <module>core-java-lang-math</module>
         <module>core-java-lang-math-2</module>
-        <module>core-java-lang-oop-modules</module>
+        <module>core-java-lang-oop-constructors</module>
+        <module>core-java-lang-oop-patterns</module>
+        <module>core-java-lang-oop-generics</module>
+        <module>core-java-lang-oop-modifiers</module>
+        <module>core-java-lang-oop-types</module>
+        <module>core-java-lang-oop-inheritance</module>
+        <module>core-java-lang-oop-methods</module>
+        <module>core-java-lang-oop-others</module>
         <module>core-java-lang-operators</module>
         <module>core-java-lang-syntax</module>
         <module>core-java-lang-syntax-2</module>

From c02e57fe7e1a00244bd8f83959498f5547ec1388 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sat, 11 Apr 2020 10:27:16 +0200
Subject: [PATCH 116/404] [JAVA-621] Fixes due to minor article changes

* Renamed KeywordUnitTest to Keyword as it's the chosen name for the
article now
---
 .../{KeywordUnitTest.java => Keyword.java}         | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
 rename core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/{KeywordUnitTest.java => Keyword.java} (68%)

diff --git a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/Keyword.java
similarity index 68%
rename from core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/Keyword.java
index 35fd7358af..0c45f61e1d 100644
--- a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/Keyword.java
@@ -1,17 +1,17 @@
 package com.baeldung.keyword.thiskeyword;
 
-public class KeywordUnitTest {
+public class Keyword {
 
     private String name;
     private int age;
 
-    public KeywordUnitTest() {
+    public Keyword() {
         this("John", 27);
         this.printMessage();
         printInstance(this);
     }
 
-    public KeywordUnitTest(String name, int age) {
+    public Keyword(String name, int age) {
         this.name = name;
         this.age = age;
     }
@@ -20,11 +20,11 @@ public class KeywordUnitTest {
         System.out.println("invoked by this");
     }
 
-    public void printInstance(KeywordUnitTest thisKeyword) {
+    public void printInstance(Keyword thisKeyword) {
         System.out.println(thisKeyword);
     }
 
-    public KeywordUnitTest getCurrentInstance() {
+    public Keyword getCurrentInstance() {
         return this;
     }
 
@@ -33,8 +33,8 @@ public class KeywordUnitTest {
         boolean isInnerClass = true;
 
         public ThisInnerClass() {
-            KeywordUnitTest thisKeyword = KeywordUnitTest.this;
-            String outerString = KeywordUnitTest.this.name;
+            Keyword thisKeyword = Keyword.this;
+            String outerString = Keyword.this.name;
             System.out.println(this.isInnerClass);
         }
     }

From 4f75f2d5b0e4c93df9ba6f48662467f96bf066bb Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Tue, 21 Apr 2020 08:52:04 +0200
Subject: [PATCH 117/404] [JAVA-621] Ensuring each article has its own package

* Putting test classes directly under abstractclasses package (no need
for test subpackage, we're already in test sources)

* Removed unnecessary keyword package to just let superkeyword

* Renamed scope package to variableandmethodhiding

* Renamed package basicmethods into methods

* Putting test classes directly under methodoverloadingoverriding package (no need for test subpackage, we're already in test sources)

* Moved publicmodifier package under com.baeldung as it contains code from a separate article

* Moved privatemodifier under com.baeldung as it was under an unnecessary core package

* Renamed staticdemo package into staticmodifier (was more adequate with other modifiers articles)

* Putting test classes directly under defaultstaticinterfacemethods package (no need for test subpackage, we're already in test sources)

* Moved thiskeyword package to com.baeldung instead of under keywords package
---
 .../com/baeldung/{keyword => }/superkeyword/KeywordDemo.java  | 2 +-
 .../com/baeldung/{keyword => }/superkeyword/SuperBase.java    | 2 +-
 .../com/baeldung/{keyword => }/superkeyword/SuperSub.java     | 2 +-
 .../method/BaseMethodClass.java                               | 2 +-
 .../method/ChildMethodClass.java                              | 2 +-
 .../method/MethodHidingDemo.java                              | 2 +-
 .../variable/ChildVariable.java                               | 2 +-
 .../variable/HideVariable.java                                | 2 +-
 .../variable/ParentVariable.java                              | 2 +-
 .../variable/VariableHidingDemo.java                          | 2 +-
 .../{test => }/LowercaseFileReaderUnitTest.java               | 2 +-
 .../{test => }/UppercaseFileReaderUnitTest.java               | 2 +-
 .../com/baeldung/{basicmethods => methods}/PersonName.java    | 2 +-
 .../{test => }/MethodOverloadingUnitTest.java                 | 2 +-
 .../{test => }/MethodOverridingUnitTest.java                  | 2 +-
 .../com/baeldung/{core => }/privatemodifier/Employee.java     | 2 +-
 .../com/baeldung/{core => }/privatemodifier/ExampleClass.java | 2 +-
 .../baeldung/{core => }/privatemodifier/PublicOuterClass.java | 2 +-
 .../{accessmodifiers => }/publicmodifier/ListOfThree.java     | 2 +-
 .../publicmodifier/SpecialCharacters.java                     | 2 +-
 .../{accessmodifiers => }/publicmodifier/Student.java         | 2 +-
 .../java/com/baeldung/{staticdemo => staticmodifier}/Car.java | 2 +-
 .../baeldung/{staticdemo => staticmodifier}/Singleton.java    | 2 +-
 .../baeldung/{staticdemo => staticmodifier}/StaticBlock.java  | 2 +-
 .../{test => }/StaticDefaulInterfaceMethodUnitTest.java       | 2 +-
 .../publicmodifier/PublicAccessModifierUnitTest.java          | 4 +---
 .../baeldung/{staticdemo => staticmodifier}/CarUnitTest.java  | 2 +-
 .../{staticdemo => staticmodifier}/SingletonUnitTest.java     | 2 +-
 .../{staticdemo => staticmodifier}/StaticBlockUnitTest.java   | 2 +-
 .../java/com/baeldung/{keyword => }/thiskeyword/Keyword.java  | 2 +-
 30 files changed, 30 insertions(+), 32 deletions(-)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{keyword => }/superkeyword/KeywordDemo.java (82%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{keyword => }/superkeyword/SuperBase.java (87%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{keyword => }/superkeyword/SuperSub.java (91%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/method/BaseMethodClass.java (71%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/method/ChildMethodClass.java (74%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/method/MethodHidingDemo.java (70%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/variable/ChildVariable.java (81%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/variable/HideVariable.java (89%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/variable/ParentVariable.java (80%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/{scope => variableandmethodhiding}/variable/VariableHidingDemo.java (89%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/{test => }/LowercaseFileReaderUnitTest.java (94%)
 rename core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/{test => }/UppercaseFileReaderUnitTest.java (94%)
 rename core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/{basicmethods => methods}/PersonName.java (96%)
 rename core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/{test => }/MethodOverloadingUnitTest.java (95%)
 rename core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/{test => }/MethodOverridingUnitTest.java (97%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{core => }/privatemodifier/Employee.java (96%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{core => }/privatemodifier/ExampleClass.java (84%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{core => }/privatemodifier/PublicOuterClass.java (90%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{accessmodifiers => }/publicmodifier/ListOfThree.java (92%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{accessmodifiers => }/publicmodifier/SpecialCharacters.java (61%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{accessmodifiers => }/publicmodifier/Student.java (96%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{staticdemo => staticmodifier}/Car.java (96%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{staticdemo => staticmodifier}/Singleton.java (88%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/{staticdemo => staticmodifier}/StaticBlock.java (93%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/{test => }/StaticDefaulInterfaceMethodUnitTest.java (97%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/{accessmodifiers => }/publicmodifier/PublicAccessModifierUnitTest.java (93%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/{staticdemo => staticmodifier}/CarUnitTest.java (88%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/{staticdemo => staticmodifier}/SingletonUnitTest.java (90%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/{staticdemo => staticmodifier}/StaticBlockUnitTest.java (92%)
 rename core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/{keyword => }/thiskeyword/Keyword.java (95%)

diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/KeywordDemo.java
similarity index 82%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/KeywordDemo.java
index 7414e52b1c..0e5bd489bb 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/KeywordDemo.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/KeywordDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.keyword.superkeyword;
+package com.baeldung.superkeyword;
 
 /**
  * Created by Gebruiker on 5/14/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/SuperBase.java
similarity index 87%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/SuperBase.java
index a5304fcef9..ec6a90cb06 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/SuperBase.java
@@ -1,4 +1,4 @@
-package com.baeldung.keyword.superkeyword;
+package com.baeldung.superkeyword;
 
 /**
  * Created by Gebruiker on 5/14/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/SuperSub.java
similarity index 91%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/SuperSub.java
index 83bc04ad0f..ada52e4ff2 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/superkeyword/SuperSub.java
@@ -1,4 +1,4 @@
-package com.baeldung.keyword.superkeyword;
+package com.baeldung.superkeyword;
 
 /**
  * Created by Gebruiker on 5/15/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/BaseMethodClass.java
similarity index 71%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/BaseMethodClass.java
index 46ed5fd99f..7e6b08c000 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/BaseMethodClass.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.method;
+package com.baeldung.variableandmethodhiding.method;
 
 
 public class BaseMethodClass {
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/ChildMethodClass.java
similarity index 74%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/ChildMethodClass.java
index 1d0cff2d6b..30db54cd84 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/ChildMethodClass.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.method;
+package com.baeldung.variableandmethodhiding.method;
 
 
 public class ChildMethodClass extends BaseMethodClass {
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/MethodHidingDemo.java
similarity index 70%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/MethodHidingDemo.java
index 7e0b3ed146..ce1feac665 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/method/MethodHidingDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.method;
+package com.baeldung.variableandmethodhiding.method;
 
 public class MethodHidingDemo {
 
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/ChildVariable.java
similarity index 81%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/ChildVariable.java
index 5730e5e282..83434f7dd3 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ChildVariable.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/ChildVariable.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.variable;
+package com.baeldung.variableandmethodhiding.variable;
 
 /**
  * Created by Gebruiker on 5/7/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/HideVariable.java
similarity index 89%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/HideVariable.java
index 8243fdb249..98a29573b8 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/HideVariable.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/HideVariable.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.variable;
+package com.baeldung.variableandmethodhiding.variable;
 
 /**
  * Created by Gebruiker on 5/6/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/ParentVariable.java
similarity index 80%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/ParentVariable.java
index 7f116b955e..ef17305746 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/ParentVariable.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/ParentVariable.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.variable;
+package com.baeldung.variableandmethodhiding.variable;
 
 /**
  * Created by Gebruiker on 5/7/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/VariableHidingDemo.java
similarity index 89%
rename from core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/VariableHidingDemo.java
index 1ad71bd966..0fd83ad55e 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/variableandmethodhiding/variable/VariableHidingDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope.variable;
+package com.baeldung.variableandmethodhiding.variable;
 
 /**
  * Created by Gebruiker on 5/6/2018.
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
index 45e16f0d25..8e970fc0c7 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.abstractclasses.test;
+package com.baeldung.abstractclasses;
 
 import com.baeldung.abstractclasses.filereaders.BaseFileReader;
 import com.baeldung.abstractclasses.filereaders.LowercaseFileReader;
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
rename to core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
index dc4df900e4..e7b83a97e6 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.abstractclasses.test;
+package com.baeldung.abstractclasses;
 
 import com.baeldung.abstractclasses.filereaders.BaseFileReader;
 import com.baeldung.abstractclasses.filereaders.UppercaseFileReader;
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/PersonName.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/PersonName.java
index 43bbf0dd62..d1f3f58b8c 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/basicmethods/PersonName.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/PersonName.java
@@ -1,4 +1,4 @@
-package com.baeldung.basicmethods;
+package com.baeldung.methods;
 
 import java.io.FileWriter;
 import java.io.IOException;
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/MethodOverloadingUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/MethodOverloadingUnitTest.java
index 081a30c34a..476e70618f 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/MethodOverloadingUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.methodoverloadingoverriding.test;
+package com.baeldung.methodoverloadingoverriding;
 
 import com.baeldung.methodoverloadingoverriding.util.Multiplier;
 import org.junit.BeforeClass;
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/MethodOverridingUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/MethodOverridingUnitTest.java
index 554ac121bc..f4142d7382 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methodoverloadingoverriding/MethodOverridingUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.methodoverloadingoverriding.test;
+package com.baeldung.methodoverloadingoverriding;
 
 import com.baeldung.methodoverloadingoverriding.model.Car;
 import com.baeldung.methodoverloadingoverriding.model.Vehicle;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/Employee.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/Employee.java
index 4598400e93..a0f7829d51 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/Employee.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.core.privatemodifier;
+package com.baeldung.privatemodifier;
 
 public class Employee {
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/ExampleClass.java
similarity index 84%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/ExampleClass.java
index 8659b4ad9c..c87980fbe8 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/ExampleClass.java
@@ -1,4 +1,4 @@
-package com.baeldung.core.privatemodifier;
+package com.baeldung.privatemodifier;
 
 public class ExampleClass {
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/PublicOuterClass.java
similarity index 90%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/PublicOuterClass.java
index 8a9e8a8eb3..082d08b034 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/privatemodifier/PublicOuterClass.java
@@ -1,4 +1,4 @@
-package com.baeldung.core.privatemodifier;
+package com.baeldung.privatemodifier;
 
 public class PublicOuterClass {
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/ListOfThree.java
similarity index 92%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/ListOfThree.java
index 2ded0ba5d3..0e3449f451 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/ListOfThree.java
@@ -1,4 +1,4 @@
-package com.baeldung.accessmodifiers.publicmodifier;
+package com.baeldung.publicmodifier;
 
 import java.util.AbstractList;
 import java.util.Arrays;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/SpecialCharacters.java
similarity index 61%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/SpecialCharacters.java
index 5556e9aa57..633308e707 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/SpecialCharacters.java
@@ -1,4 +1,4 @@
-package com.baeldung.accessmodifiers.publicmodifier;
+package com.baeldung.publicmodifier;
 
 public class SpecialCharacters {
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/Student.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/Student.java
index 83a0dcb30f..5aa80286bf 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/publicmodifier/Student.java
@@ -1,4 +1,4 @@
-package com.baeldung.accessmodifiers.publicmodifier;
+package com.baeldung.publicmodifier;
 
 import java.math.BigDecimal;
 import java.sql.Connection;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java
index cdb3806c35..950f008dcd 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Car.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java
@@ -1,4 +1,4 @@
-package com.baeldung.staticdemo;
+package com.baeldung.staticmodifier;
 
 /**
  * This class demonstrates the use of static fields and static methods
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Singleton.java
similarity index 88%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Singleton.java
index de75af9d9d..6e7dcf7c60 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/Singleton.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Singleton.java
@@ -1,4 +1,4 @@
-package com.baeldung.staticdemo;
+package com.baeldung.staticmodifier;
 
 public class Singleton  {    
     private Singleton() {}
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlock.java
similarity index 93%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlock.java
index fde7afb090..f3eb447bdd 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticdemo/StaticBlock.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlock.java
@@ -1,4 +1,4 @@
-package com.baeldung.staticdemo;
+package com.baeldung.staticmodifier;
 
 import java.util.LinkedList;
 import java.util.List;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/StaticDefaulInterfaceMethodUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/StaticDefaulInterfaceMethodUnitTest.java
index e90f239756..0dffe8f80e 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/defaultstaticinterfacemethods/StaticDefaulInterfaceMethodUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.defaultstaticinterfacemethods.test;
+package com.baeldung.defaultstaticinterfacemethods;
 
 import com.baeldung.defaultstaticinterfacemethods.model.Car;
 import com.baeldung.defaultstaticinterfacemethods.model.Motorbike;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/publicmodifier/PublicAccessModifierUnitTest.java
similarity index 93%
rename from core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/publicmodifier/PublicAccessModifierUnitTest.java
index c2897e7434..8c014e703b 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/accessmodifiers/publicmodifier/PublicAccessModifierUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/publicmodifier/PublicAccessModifierUnitTest.java
@@ -1,7 +1,5 @@
-package com.baeldung.accessmodifiers.publicmodifier;
+package com.baeldung.publicmodifier;
 
-import com.baeldung.accessmodifiers.publicmodifier.ListOfThree;
-import com.baeldung.accessmodifiers.publicmodifier.Student;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInstance;
 import org.junit.jupiter.api.TestInstance.Lifecycle;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java
similarity index 88%
rename from core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java
index 3deec6f41c..f55955caa8 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/CarUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.staticdemo;
+package com.baeldung.staticmodifier;
 
 import static org.junit.Assert.*;
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/SingletonUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/SingletonUnitTest.java
index c1a1e1abe4..6371fd4961 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/SingletonUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/SingletonUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.staticdemo;
+package com.baeldung.staticmodifier;
 
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockUnitTest.java
similarity index 92%
rename from core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockUnitTest.java
index 79ba4427bf..03f3e0440c 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticdemo/StaticBlockUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.staticdemo;
+package com.baeldung.staticmodifier;
 
 import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
 import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/Keyword.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/thiskeyword/Keyword.java
similarity index 95%
rename from core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/Keyword.java
rename to core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/thiskeyword/Keyword.java
index 0c45f61e1d..a09a1ac8e1 100644
--- a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/keyword/thiskeyword/Keyword.java
+++ b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/thiskeyword/Keyword.java
@@ -1,4 +1,4 @@
-package com.baeldung.keyword.thiskeyword;
+package com.baeldung.thiskeyword;
 
 public class Keyword {
 

From f56bf16d112c600fc1c6422341fcf4d91c1a52e0 Mon Sep 17 00:00:00 2001
From: Mrudav Shukla <mrudavshukla@gmail.com>
Date: Sun, 8 Jul 2018 17:41:29 +0530
Subject: [PATCH 118/404] BAEL-1921 - added example code and unit test for
 GlobalExceptionHandler (#4646)

* added example code and unit test for GlobalExceptionHandler

* Code for common exceptions
---
 .../reflection/exceptions/Arithmetic.java     | 20 ++++++
 .../exceptions/ArrayIndexOutOfBounds.java     | 24 +++++++
 .../reflection/exceptions/ClassCast.java      | 36 +++++++++++
 .../reflection/exceptions/FileNotFound.java   | 25 ++++++++
 .../exceptions/GlobalExceptionHandler.java    | 28 ++++++++
 .../exceptions/IllegalArgument.java           | 18 ++++++
 .../reflection/exceptions/IllegalState.java   | 32 ++++++++++
 .../InterruptedExceptionExample.java          | 28 ++++++++
 .../reflection/exceptions/MalformedURL.java   | 25 ++++++++
 .../reflection/exceptions/NullPointer.java    | 36 +++++++++++
 .../reflection/exceptions/NumberFormat.java   | 23 +++++++
 .../exceptions/ParseExceptionExample.java     | 25 ++++++++
 .../exceptions/StringIndexOutOfBounds.java    | 23 +++++++
 .../GlobalExceptionHandlerUnitTest.java       | 64 +++++++++++++++++++
 14 files changed, 407 insertions(+)
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java
 create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java
 create mode 100644 core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java

diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java
new file mode 100644
index 0000000000..138916ec60
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java
@@ -0,0 +1,20 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Arithmetic {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(Arithmetic.class);
+
+    public static void main(String[] args) {
+
+        try {
+            int result = 30 / 0; // Trying to divide by zero
+        } catch (ArithmeticException e) {
+            LOGGER.error("ArithmeticException caught!");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java
new file mode 100644
index 0000000000..93b53f284c
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java
@@ -0,0 +1,24 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ArrayIndexOutOfBounds {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(ArrayIndexOutOfBounds.class);
+
+    public static void main(String[] args) {
+
+        int[] nums = new int[] { 1, 2, 3 };
+
+        try {
+            int numFromNegativeIndex = nums[-1]; // Trying to access at negative index
+            int numFromGreaterIndex = nums[4]; // Trying to access at greater index
+            int numFromLengthIndex = nums[3]; // Trying to access at index equal to size of the array
+        } catch (ArrayIndexOutOfBoundsException e) {
+            LOGGER.error("ArrayIndexOutOfBoundsException caught");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java
new file mode 100644
index 0000000000..183f8f54a3
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java
@@ -0,0 +1,36 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class Animal {
+
+}
+
+class Dog extends Animal {
+
+}
+
+class Lion extends Animal {
+
+}
+
+public class ClassCast {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(ClassCast.class);
+
+    public static void main(String[] args) {
+
+        try {
+            Animal animalOne = new Dog(); // At runtime the instance is dog
+            Dog bruno = (Dog) animalOne; // Downcasting
+
+            Animal animalTwo = new Lion(); // At runtime the instance is animal
+            Dog tommy = (Dog) animalTwo; // Downcasting
+        } catch (ClassCastException e) {
+            LOGGER.error("ClassCastException caught!");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java
new file mode 100644
index 0000000000..bb9e0bf4ac
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java
@@ -0,0 +1,25 @@
+package com.baeldung.exceptions;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FileNotFound {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(FileNotFound.class);
+    
+    public static void main(String[] args) {
+        
+        BufferedReader reader = null;
+        try {
+            reader = new BufferedReader(new FileReader(new File("/invalid/file/location")));
+        } catch (FileNotFoundException e) {
+            LOGGER.error("FileNotFoundException caught!");
+        }
+    }
+    
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java
new file mode 100644
index 0000000000..ab46c83da4
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java
@@ -0,0 +1,28 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GlobalExceptionHandler {
+
+    public static void main(String[] args) {
+
+        Handler globalExceptionHandler = new Handler();
+        Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
+        new GlobalExceptionHandler().performArithmeticOperation(10, 0);
+    }
+
+    public int performArithmeticOperation(int num1, int num2) {
+        return num1/num2;
+    }
+
+}
+
+class Handler implements Thread.UncaughtExceptionHandler {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(Handler.class);
+
+    public void uncaughtException(Thread t, Throwable e) {
+        LOGGER.info("Unhandled exception caught!");
+    }
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java
new file mode 100644
index 0000000000..801536cb2d
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java
@@ -0,0 +1,18 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class IllegalArgument {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(IllegalArgument.class);
+
+    public static void main(String[] args) {
+        try {
+            Thread.sleep(-1000);
+        } catch (InterruptedException e) {
+            LOGGER.error("IllegalArgumentException caught!");
+        }
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java
new file mode 100644
index 0000000000..e8ddcea3c2
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java
@@ -0,0 +1,32 @@
+package com.baeldung.exceptions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class IllegalState {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(IllegalState.class);
+
+    public static void main(String[] args) {
+
+        List<Integer> intList = new ArrayList<>();
+
+        for (int i = 0; i < 10; i++) {
+            intList.add(i);
+        }
+
+        Iterator<Integer> intListIterator = intList.iterator(); // Initialized with index at -1
+
+        try {
+            intListIterator.remove(); // IllegalStateException
+        } catch (IllegalStateException e) {
+            LOGGER.error("IllegalStateException caught!");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java
new file mode 100644
index 0000000000..319fd33591
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java
@@ -0,0 +1,28 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class ChildThread extends Thread {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(ChildThread.class);
+
+    public void run() {
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException e) {
+            LOGGER.error("InterruptedException caught!");
+        }
+    }
+    
+}
+
+public class InterruptedExceptionExample {
+
+    public static void main(String[] args) throws InterruptedException {
+        ChildThread childThread = new ChildThread();
+        childThread.start();
+        childThread.interrupt();
+    }
+    
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java
new file mode 100644
index 0000000000..57fcddf76b
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java
@@ -0,0 +1,25 @@
+package com.baeldung.exceptions;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MalformedURL {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(MalformedURL.class);
+
+    public static void main(String[] args) {
+
+        URL baeldungURL = null;
+
+        try {
+            baeldungURL = new URL("malformedurl");
+        } catch (MalformedURLException e) {
+            LOGGER.error("MalformedURLException caught!");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java
new file mode 100644
index 0000000000..2402a786a9
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java
@@ -0,0 +1,36 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NullPointer {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(NullPointer.class);
+
+    public static void main(String[] args) {
+
+        Person personObj = null;
+
+        try {
+            String name = personObj.personName; // Accessing the field of a null object
+            personObj.personName = "Jon Doe"; // Modifying the field of a null object
+        } catch (NullPointerException e) {
+            LOGGER.error("NullPointerException caught!");
+        }
+
+    }
+}
+
+class Person {
+
+    public String personName;
+
+    public String getPersonName() {
+        return personName;
+    }
+
+    public void setPersonName(String personName) {
+        this.personName = personName;
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java
new file mode 100644
index 0000000000..7050e70aee
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java
@@ -0,0 +1,23 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NumberFormat {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(NumberFormat.class);
+
+    public static void main(String[] args) {
+
+        String str1 = "100ABCD";
+
+        try {
+            int x = Integer.parseInt(str1); // Converting string with inappropriate format
+            int y = Integer.valueOf(str1);
+        } catch (NumberFormatException e) {
+            LOGGER.error("NumberFormatException caught!");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java
new file mode 100644
index 0000000000..f7fb4c91e4
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java
@@ -0,0 +1,25 @@
+package com.baeldung.exceptions;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ParseExceptionExample {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(ParseExceptionExample.class);
+
+    public static void main(String[] args) {
+
+        DateFormat format = new SimpleDateFormat("MM, dd, yyyy");
+
+        try {
+            format.parse("01, , 2010");
+        } catch (ParseException e) {
+            LOGGER.error("ParseException caught!");
+        }
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java
new file mode 100644
index 0000000000..bc297be498
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java
@@ -0,0 +1,23 @@
+package com.baeldung.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class StringIndexOutOfBounds {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(StringIndexOutOfBounds.class);
+    
+    public static void main(String[] args) {
+
+        String str = "Hello World";
+
+        try {
+            char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index
+            char charAtLengthIndex = str.charAt(11); // Trying to access at index equal to size of the string
+        } catch (StringIndexOutOfBoundsException e) {
+           LOGGER.error("StringIndexOutOfBoundsException caught");
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java
new file mode 100644
index 0000000000..394de9c576
--- /dev/null
+++ b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.exceptions;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.slf4j.LoggerFactory;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.Appender;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.verify;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GlobalExceptionHandlerUnitTest {
+
+    @Mock
+    private Appender<ILoggingEvent> mockAppender;
+
+    @Captor
+    private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
+
+    @Before
+    public void setup() {
+        final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+        logger.addAppender(mockAppender);
+
+        Handler globalExceptionHandler = new Handler();
+        Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
+    }
+
+    @After
+    public void teardown() {
+        final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+        logger.detachAppender(mockAppender);
+    }
+
+    @Test
+    public void whenArithmeticException_thenUseUncaughtExceptionHandler() throws InterruptedException {
+
+        Thread globalExceptionHandlerThread = new Thread() {
+            public void run() {
+                GlobalExceptionHandler globalExceptionHandlerObj = new GlobalExceptionHandler();
+                globalExceptionHandlerObj.performArithmeticOperation(99, 0);
+            }
+        };
+
+        globalExceptionHandlerThread.start();
+        globalExceptionHandlerThread.join();
+
+        verify(mockAppender).doAppend(captorLoggingEvent.capture());
+        LoggingEvent loggingEvent = captorLoggingEvent.getValue();
+
+        assertThat(loggingEvent.getLevel()).isEqualTo(Level.INFO);
+        assertThat(loggingEvent.getFormattedMessage()).isEqualTo("Unhandled exception caught!");
+    }
+
+}

From aec4ed2d5c3939b9c21ff84ff2cd34c0f15f1d54 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Tue, 28 Apr 2020 18:20:23 +0530
Subject: [PATCH 119/404] JAVA-928: Migrate property-exp-default-config to
 parent-boot-2

---
 .../property-exp-custom-config/pom.xml                    | 8 +++++++-
 .../java/{org => com}/baeldung/SpringContextTest.java     | 0
 .../property-exp-default-config/pom.xml                   | 4 ++--
 .../java/{org => com}/baeldung/SpringContextTest.java     | 0
 4 files changed, 9 insertions(+), 3 deletions(-)
 rename spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/{org => com}/baeldung/SpringContextTest.java (100%)
 rename spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/{org => com}/baeldung/SpringContextTest.java (100%)

diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml
index 8ea9c8366d..e38a2742d5 100644
--- a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml
+++ b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml
@@ -24,6 +24,12 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <version>${spring-boot.version}</version>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
 
@@ -72,7 +78,7 @@
     </build>
 
     <properties>
-        <spring-boot.version>1.5.10.RELEASE</spring-boot.version>
+        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
         <custom.property>Custom Property Value</custom.property>
         <apache-maven.version>2.7</apache-maven.version>
         <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/com/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/com/baeldung/SpringContextTest.java
diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml
index aa5b8ef34a..79e194a3b5 100644
--- a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml
+++ b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml
@@ -9,9 +9,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../../parent-boot-1</relativePath>
+        <relativePath>../../../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/com/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/com/baeldung/SpringContextTest.java

From aa7daf7901d2951fc05fac9e5c352c1fe87dfc3a Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Tue, 28 Apr 2020 08:05:50 +0200
Subject: [PATCH 120/404] [JAVA-621] Added missing code

* https://www.baeldung.com/java-type-erasure introduction code

* https://www.baeldung.com/java-interfaces Electronic interface and Computer class

* https://www.baeldung.com/java-abstract-class BoardGame and Checkers classes

* https://www.baeldung.com/java-hashcode different ways of implementing hashCode

* https://www.baeldung.com/java-inheritance-composition ComputerBuilder and StandardComputerBuilder classes

* https://www.baeldung.com/java-equals-hashcode-contracts Renamed method to match article

* https://www.baeldung.com/java-static Renamed class to match article

* https://www.baeldung.com/java-nested-classes Renamed class to match article
---
 .../com/baeldung/typeerasure/Example.java     | 13 ++++++
 .../abstractclasses/overview/BoardGame.java   |  9 ++++
 .../abstractclasses/overview/Checkers.java    |  8 ++++
 .../com/baeldung/interfaces/Computer.java     |  9 ++++
 .../com/baeldung/interfaces/Electronic.java   | 22 ++++++++++
 .../core-java-lang-oop-methods/pom.xml        | 14 +++++++
 .../baeldung/hashcode/apachecommons/User.java | 42 +++++++++++++++++++
 .../com/baeldung/hashcode/eclipse/User.java   | 42 +++++++++++++++++++
 .../com/baeldung/hashcode/improved/User.java  | 37 ++++++++++++++++
 .../com/baeldung/hashcode/intellij/User.java  | 40 ++++++++++++++++++
 .../com/baeldung/hashcode/lombok/User.java    | 22 ++++++++++
 .../com/baeldung/hashcode/naive/User.java     | 37 ++++++++++++++++
 .../hashcode/{entities => standard}/User.java |  3 +-
 .../baeldung/equalshashcode/TeamUnitTest.java |  2 +-
 ...{StaticBlock.java => StaticBlockDemo.java} |  4 +-
 ...Test.java => StaticBlockDemoUnitTest.java} |  4 +-
 .../model/ComputerBuilder.java                | 13 ++++++
 .../model/StandardComputerBuilder.java        | 13 ++++++
 ...mousInner.java => AnonymousInnerTest.java} |  2 +-
 19 files changed, 328 insertions(+), 8 deletions(-)
 create mode 100644 core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Example.java
 create mode 100644 core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/BoardGame.java
 create mode 100644 core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/Checkers.java
 create mode 100644 core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Computer.java
 create mode 100644 core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Electronic.java
 create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/apachecommons/User.java
 create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/eclipse/User.java
 create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/improved/User.java
 create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/intellij/User.java
 create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/lombok/User.java
 create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/naive/User.java
 rename core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/{entities => standard}/User.java (89%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/{StaticBlock.java => StaticBlockDemo.java} (87%)
 rename core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/{StaticBlockUnitTest.java => StaticBlockDemoUnitTest.java} (80%)
 create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/ComputerBuilder.java
 create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardComputerBuilder.java
 rename core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/{AnonymousInner.java => AnonymousInnerTest.java} (91%)

diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Example.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Example.java
new file mode 100644
index 0000000000..f816fd6d16
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/typeerasure/Example.java
@@ -0,0 +1,13 @@
+package com.baeldung.typeerasure;
+
+public class Example {
+
+    public static  <E> boolean containsElement(E [] elements, E element){
+        for (E e : elements){
+            if(e.equals(element)){
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/BoardGame.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/BoardGame.java
new file mode 100644
index 0000000000..e0395cec7e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/BoardGame.java
@@ -0,0 +1,9 @@
+package com.baeldung.abstractclasses.overview;
+
+public abstract class BoardGame {
+    //... field declarations, constructors
+
+    public abstract void play();
+
+    //... concrete methods
+}
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/Checkers.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/Checkers.java
new file mode 100644
index 0000000000..5c911649c8
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/abstractclasses/overview/Checkers.java
@@ -0,0 +1,8 @@
+package com.baeldung.abstractclasses.overview;
+
+public class Checkers extends BoardGame {
+    @Override
+    public void play() {
+        //... implementation
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Computer.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Computer.java
new file mode 100644
index 0000000000..94d39e2448
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Computer.java
@@ -0,0 +1,9 @@
+package com.baeldung.interfaces;
+
+public class Computer implements Electronic {
+
+    @Override
+    public int getElectricityUse() {
+        return 1000;
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Electronic.java b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Electronic.java
new file mode 100644
index 0000000000..fcaf67dc3a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-inheritance/src/main/java/com/baeldung/interfaces/Electronic.java
@@ -0,0 +1,22 @@
+package com.baeldung.interfaces;
+
+public interface Electronic {
+    // Constant variable
+    String LED = "LED";
+
+    // Abstract method
+    int getElectricityUse();
+
+    // Static method
+    static boolean isEnergyEfficient(String electtronicType) {
+        if (electtronicType.equals(LED)) {
+            return true;
+        }
+        return false;
+    }
+
+    //Default method
+    default void printDescription() {
+        System.out.println("Electronic Description");
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml
index 77e8ded8e7..3590b85454 100644
--- a/core-java-modules/core-java-lang-oop-methods/pom.xml
+++ b/core-java-modules/core-java-lang-oop-methods/pom.xml
@@ -14,6 +14,17 @@
     <packaging>jar</packaging>
 
     <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>${commons-lang.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
@@ -29,6 +40,9 @@
     </dependencies>
 
     <properties>
+        <lombok.version>1.18.12</lombok.version>
+        <commons-lang.version>2.6</commons-lang.version>
+
         <assertj-core.version>3.10.0</assertj-core.version>
         <equalsverifier.version>3.0.3</equalsverifier.version>
     </properties>
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/apachecommons/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/apachecommons/User.java
new file mode 100644
index 0000000000..4be082019a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/apachecommons/User.java
@@ -0,0 +1,42 @@
+package com.baeldung.hashcode.apachecommons;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class User {
+
+    private final Logger logger = LoggerFactory.getLogger(User.class);
+    private long id;
+    private String name;
+    private String email;
+
+    public User(long id, String name, String email) {
+        this.id = id;
+        this.name = name;
+        this.email = email;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (this.getClass() != o.getClass())
+            return false;
+        User user = (User) o;
+        return id == user.id && (name.equals(user.name) && email.equals(user.email));
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder(17, 37).
+          append(id).
+          append(name).
+          append(email).
+          toHashCode();
+    }
+    // getters and setters here
+    
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/eclipse/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/eclipse/User.java
new file mode 100644
index 0000000000..e852eef96e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/eclipse/User.java
@@ -0,0 +1,42 @@
+package com.baeldung.hashcode.eclipse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class User {
+
+    private final Logger logger = LoggerFactory.getLogger(User.class);
+    private long id;
+    private String name;
+    private String email;
+
+    public User(long id, String name, String email) {
+        this.id = id;
+        this.name = name;
+        this.email = email;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (this.getClass() != o.getClass())
+            return false;
+        User user = (User) o;
+        return id == user.id && (name.equals(user.name) && email.equals(user.email));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((email == null) ? 0 : email.hashCode());
+        result = prime * result + (int) (id ^ (id >>> 32));
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+    // getters and setters here
+    
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/improved/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/improved/User.java
new file mode 100644
index 0000000000..773a2c7e45
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/improved/User.java
@@ -0,0 +1,37 @@
+package com.baeldung.hashcode.improved;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class User {
+
+    private final Logger logger = LoggerFactory.getLogger(User.class);
+    private long id;
+    private String name;
+    private String email;
+
+    public User(long id, String name, String email) {
+        this.id = id;
+        this.name = name;
+        this.email = email;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (this.getClass() != o.getClass())
+            return false;
+        User user = (User) o;
+        return id == user.id && (name.equals(user.name) && email.equals(user.email));
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) id * name.hashCode() * email.hashCode();
+    }
+    // getters and setters here
+    
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/intellij/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/intellij/User.java
new file mode 100644
index 0000000000..f7bf1ab735
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/intellij/User.java
@@ -0,0 +1,40 @@
+package com.baeldung.hashcode.intellij;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class User {
+
+    private final Logger logger = LoggerFactory.getLogger(User.class);
+    private long id;
+    private String name;
+    private String email;
+
+    public User(long id, String name, String email) {
+        this.id = id;
+        this.name = name;
+        this.email = email;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (this.getClass() != o.getClass())
+            return false;
+        User user = (User) o;
+        return id == user.id && (name.equals(user.name) && email.equals(user.email));
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + name.hashCode();
+        result = 31 * result + email.hashCode();
+        return result;
+    }
+    // getters and setters here
+    
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/lombok/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/lombok/User.java
new file mode 100644
index 0000000000..e34246ce24
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/lombok/User.java
@@ -0,0 +1,22 @@
+package com.baeldung.hashcode.lombok;
+
+import lombok.EqualsAndHashCode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@EqualsAndHashCode
+public class User {
+
+    private final Logger logger = LoggerFactory.getLogger(User.class);
+    private long id;
+    private String name;
+    private String email;
+
+    public User(long id, String name, String email) {
+        this.id = id;
+        this.name = name;
+        this.email = email;
+    }
+    // getters and setters here
+    
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/naive/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/naive/User.java
new file mode 100644
index 0000000000..b0a33ad3e9
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/naive/User.java
@@ -0,0 +1,37 @@
+package com.baeldung.hashcode.naive;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class User {
+
+    private final Logger logger = LoggerFactory.getLogger(User.class);
+    private long id;
+    private String name;
+    private String email;
+
+    public User(long id, String name, String email) {
+        this.id = id;
+        this.name = name;
+        this.email = email;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null)
+            return false;
+        if (this.getClass() != o.getClass())
+            return false;
+        User user = (User) o;
+        return id == user.id && (name.equals(user.name) && email.equals(user.email));
+    }
+
+    @Override
+    public int hashCode() {
+        return 1;
+    }
+    // getters and setters here
+    
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/standard/User.java
similarity index 89%
rename from core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
rename to core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/standard/User.java
index 524f176e6b..f8fd5cedbd 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/entities/User.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/hashcode/standard/User.java
@@ -1,4 +1,4 @@
-package com.baeldung.hashcode.entities;
+package com.baeldung.hashcode.standard;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +34,6 @@ public class User {
         hash = 31 * hash + (int) id;
         hash = 31 * hash + (name == null ? 0 : name.hashCode());
         hash = 31 * hash + (email == null ? 0 : email.hashCode());
-        logger.info("hashCode() method called - Computed hash: " + hash);
         return hash;
     }
     // getters and setters here
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
index 7dfc6d47a3..308004452b 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
@@ -38,7 +38,7 @@ public class TeamUnitTest {
     }
 
     @Test
-    public void equalsContract() {
+    public void equalsHashCodeContracts() {
         EqualsVerifier.forClass(Team.class).verify();
     }
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlock.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlockDemo.java
similarity index 87%
rename from core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlock.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlockDemo.java
index f3eb447bdd..637bb5e82a 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlock.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/StaticBlockDemo.java
@@ -3,7 +3,7 @@ package com.baeldung.staticmodifier;
 import java.util.LinkedList;
 import java.util.List;
 
-public class StaticBlock {
+public class StaticBlockDemo {
     private static List<String> ranks = new LinkedList<>();
 
     static {
@@ -23,6 +23,6 @@ public class StaticBlock {
     }
 
     public static void setRanks(List<String> ranks) {
-        StaticBlock.ranks = ranks;
+        StaticBlockDemo.ranks = ranks;
     }
 }
diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockDemoUnitTest.java
similarity index 80%
rename from core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockUnitTest.java
rename to core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockDemoUnitTest.java
index 03f3e0440c..f31a8e8895 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/StaticBlockDemoUnitTest.java
@@ -7,11 +7,11 @@ import java.util.List;
 
 import org.junit.Test;
 
-public class StaticBlockUnitTest {
+public class StaticBlockDemoUnitTest {
 
     @Test
     public void whenAddedListElementsThroughStaticBlock_thenEnsureCorrectOrder() {
-        List<String> actualList = StaticBlock.getRanks();
+        List<String> actualList = StaticBlockDemo.getRanks();
         assertThat(actualList, contains("Lieutenant", "Captain", "Major", "Colonel", "General"));
     }
 }
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/ComputerBuilder.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/ComputerBuilder.java
new file mode 100644
index 0000000000..4d8574e93f
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/ComputerBuilder.java
@@ -0,0 +1,13 @@
+package com.baeldung.inheritancecomposition.model;
+
+public abstract class ComputerBuilder {
+
+    public final void buildComputer() {
+        addProcessor();
+        addMemory();
+    }
+
+    public abstract void addProcessor();
+
+    public abstract void addMemory();
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardComputerBuilder.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardComputerBuilder.java
new file mode 100644
index 0000000000..76c4732ace
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/inheritancecomposition/model/StandardComputerBuilder.java
@@ -0,0 +1,13 @@
+package com.baeldung.inheritancecomposition.model;
+
+public class StandardComputerBuilder extends ComputerBuilder {
+    @Override
+    public void addProcessor() {
+        // method implementation
+    }
+
+    @Override
+    public void addMemory() {
+        // method implementation
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java
similarity index 91%
rename from core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java
index 9fa8ee9cd5..4e49bb5b41 100644
--- a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
+++ b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java
@@ -6,7 +6,7 @@ abstract class SimpleAbstractClass {
     abstract void run();
 }
 
-public class AnonymousInner {
+public class AnonymousInnerTest {
 
     @Test
     public void run() {

From 9e83dbbc854f40b2b7ba6367cf8c3c16431652d3 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Tue, 28 Apr 2020 22:12:00 +0200
Subject: [PATCH 121/404] JAVA-618 Restore code for Global Exception Handler

---
 .../baeldung/exceptions/globalexceptionhandler}/Arithmetic.java | 2 +-
 .../globalexceptionhandler}/ArrayIndexOutOfBounds.java          | 2 +-
 .../baeldung/exceptions/globalexceptionhandler}/ClassCast.java  | 2 +-
 .../exceptions/globalexceptionhandler}/FileNotFound.java        | 2 +-
 .../globalexceptionhandler}/GlobalExceptionHandler.java         | 2 +-
 .../exceptions/globalexceptionhandler}/IllegalArgument.java     | 2 +-
 .../exceptions/globalexceptionhandler}/IllegalState.java        | 2 +-
 .../globalexceptionhandler}/InterruptedExceptionExample.java    | 2 +-
 .../exceptions/globalexceptionhandler}/MalformedURL.java        | 2 +-
 .../exceptions/globalexceptionhandler}/NullPointer.java         | 2 +-
 .../exceptions/globalexceptionhandler}/NumberFormat.java        | 2 +-
 .../globalexceptionhandler}/ParseExceptionExample.java          | 2 +-
 .../globalexceptionhandler}/StringIndexOutOfBounds.java         | 2 +-
 .../globalexceptionhandler}/GlobalExceptionHandlerUnitTest.java | 2 +-
 14 files changed, 14 insertions(+), 14 deletions(-)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/Arithmetic.java (87%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/ArrayIndexOutOfBounds.java (92%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/ClassCast.java (92%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/FileNotFound.java (91%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/GlobalExceptionHandler.java (92%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/IllegalArgument.java (87%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/IllegalState.java (92%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/InterruptedExceptionExample.java (91%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/MalformedURL.java (89%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/NullPointer.java (93%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/NumberFormat.java (90%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/ParseExceptionExample.java (90%)
 rename core-java-modules/{core-java-reflection/src/main/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler}/StringIndexOutOfBounds.java (91%)
 rename core-java-modules/{core-java-reflection/src/test/java/com/baeldung/reflection/exceptions => core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler}/GlobalExceptionHandlerUnitTest.java (97%)

diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/Arithmetic.java
similarity index 87%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/Arithmetic.java
index 138916ec60..db29198b39 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/Arithmetic.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/Arithmetic.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ArrayIndexOutOfBounds.java
similarity index 92%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ArrayIndexOutOfBounds.java
index 93b53f284c..54c95f224c 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ArrayIndexOutOfBounds.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ArrayIndexOutOfBounds.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ClassCast.java
similarity index 92%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ClassCast.java
index 183f8f54a3..8f8a6cf9e6 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ClassCast.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ClassCast.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/FileNotFound.java
similarity index 91%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/FileNotFound.java
index bb9e0bf4ac..a9f2e5ee84 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/FileNotFound.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/FileNotFound.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandler.java
similarity index 92%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandler.java
index ab46c83da4..f2e89f44e3 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/GlobalExceptionHandler.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandler.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalArgument.java
similarity index 87%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalArgument.java
index 801536cb2d..d54757dfac 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalArgument.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalArgument.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalState.java
similarity index 92%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalState.java
index e8ddcea3c2..0a812d2b82 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/IllegalState.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalState.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import java.util.ArrayList;
 import java.util.Iterator;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/InterruptedExceptionExample.java
similarity index 91%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/InterruptedExceptionExample.java
index 319fd33591..d0c8bb2cd0 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/InterruptedExceptionExample.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/InterruptedExceptionExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/MalformedURL.java
similarity index 89%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/MalformedURL.java
index 57fcddf76b..9a02f005fd 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/MalformedURL.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/MalformedURL.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import java.net.MalformedURLException;
 import java.net.URL;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NullPointer.java
similarity index 93%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NullPointer.java
index 2402a786a9..445cbecdc8 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NullPointer.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NullPointer.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NumberFormat.java
similarity index 90%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NumberFormat.java
index 7050e70aee..576fe51f78 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/NumberFormat.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NumberFormat.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ParseExceptionExample.java
similarity index 90%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ParseExceptionExample.java
index f7fb4c91e4..e3b3e04b10 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/ParseExceptionExample.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ParseExceptionExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import java.text.DateFormat;
 import java.text.ParseException;
diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/StringIndexOutOfBounds.java
similarity index 91%
rename from core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/StringIndexOutOfBounds.java
index bc297be498..0ee132e568 100644
--- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/exceptions/StringIndexOutOfBounds.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/StringIndexOutOfBounds.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
index 394de9c576..74ceb3b442 100644
--- a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/exceptions/GlobalExceptionHandlerUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.globalexceptionhandler;
 
 import org.junit.After;
 import org.junit.Before;

From c223b669be5cc7d913aac5821bd9af034a7a543f Mon Sep 17 00:00:00 2001
From: Marcos Lopez Gonzalez <asturcon1234@gmail.com>
Date: Mon, 15 Apr 2019 20:47:23 +0200
Subject: [PATCH 122/404] root cause finder

---
 .../baeldung/exceptions/RootCauseFinder.java  | 61 +++++++++++++++++++
 .../exceptions/RootCauseFinderTest.java       | 51 ++++++++++++++++
 2 files changed, 112 insertions(+)
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
 create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java

diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
new file mode 100644
index 0000000000..a7963c35a8
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
@@ -0,0 +1,61 @@
+package com.baeldung.exceptions;
+
+import java.util.Objects;
+
+/**
+ * Utility class to find root cause exceptions.
+ */
+public class RootCauseFinder {
+
+    public static Throwable findCauseUsingPlainJava(Throwable throwable) {
+        Objects.requireNonNull(throwable);
+        Throwable rootCause = throwable;
+        while (rootCause.getCause() != null) {
+            rootCause = rootCause.getCause();
+        }
+        return rootCause;
+    }
+
+    static class IntParser {
+
+        private IntParser() {
+        }
+
+        public static int parse(String input) throws InvalidNumber {
+            if (input == null || input.isEmpty()) {
+                throw new IllegalArgumentException();
+            }
+
+            try {
+                return new IntParser().stringToInt(input.trim());
+            } catch (NaNException ex) {
+                throw new InvalidNumber(input, ex);
+            }
+        }
+
+        private int stringToInt(String numberAsString) throws NaNException {
+            try {
+                return Integer.valueOf(numberAsString);
+            } catch (NumberFormatException ex) {
+                throw new NaNException(numberAsString, ex);
+            }
+        }
+
+    }
+
+    static class InvalidNumber extends Exception {
+
+        InvalidNumber(String input, Throwable thr) {
+            super("Invalid input for a number: " + input, thr);
+        }
+    }
+
+    static class NaNException extends Exception {
+
+        NaNException(String number, Throwable thr) {
+            super(number + "is not a number", thr);
+        }
+
+    }
+
+}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
new file mode 100644
index 0000000000..1e58e3f602
--- /dev/null
+++ b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.exceptions;
+
+import com.google.common.base.Throwables;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.junit.jupiter.api.Test;
+
+import static com.baeldung.exceptions.RootCauseFinder.*;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Tests the {@link RootCauseFinder}.
+ */
+public class RootCauseFinderTest {
+
+    @Test
+    public void givenNestedException_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+        try {
+            IntParser.parse("text");
+        } catch (InvalidNumber ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof NumberFormatException);
+        }
+    }
+
+    @Test
+    public void givenNonNestedException_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+        try {
+            IntParser.parse(null);
+        } catch (Exception ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
+        }
+    }
+
+    @Test
+    public void givenNestedException_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
+        try {
+            IntParser.parse("text");
+        } catch (InvalidNumber ex) {
+            assertTrue(ExceptionUtils.getRootCause(ex) instanceof NumberFormatException);
+        }
+    }
+
+    @Test
+    public void givenNestedException_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
+        try {
+            IntParser.parse("text");
+        } catch (InvalidNumber ex) {
+            assertTrue(Throwables.getRootCause(ex) instanceof NumberFormatException);
+        }
+    }
+
+}

From c59d9dbf8f886a80d1b1dd2a7b1e3cc2593099e6 Mon Sep 17 00:00:00 2001
From: Marcos Lopez Gonzalez <asturcon1234@gmail.com>
Date: Mon, 29 Apr 2019 19:58:51 +0200
Subject: [PATCH 123/404] changed example for finder of root cause exception

---
 .../baeldung/exceptions/RootCauseFinder.java  | 68 ++++++++++++++-----
 .../exceptions/RootCauseFinderTest.java       | 57 ++++++++++++----
 2 files changed, 94 insertions(+), 31 deletions(-)

diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
index a7963c35a8..11f29a2cf0 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
@@ -1,5 +1,8 @@
 package com.baeldung.exceptions;
 
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.format.DateTimeParseException;
 import java.util.Objects;
 
 /**
@@ -16,44 +19,75 @@ public class RootCauseFinder {
         return rootCause;
     }
 
-    static class IntParser {
+    /**
+     *  Calculates the age of a person from a given date.
+     */
+    static class AgeCalculator {
 
-        private IntParser() {
+        private AgeCalculator() {
         }
 
-        public static int parse(String input) throws InvalidNumber {
-            if (input == null || input.isEmpty()) {
+        public static int calculateAge(String birthDate) throws CalculationException {
+            if (birthDate == null || birthDate.isEmpty()) {
                 throw new IllegalArgumentException();
             }
 
             try {
-                return new IntParser().stringToInt(input.trim());
-            } catch (NaNException ex) {
-                throw new InvalidNumber(input, ex);
+                return calculateDifference(birthDate).getYears();
+            } catch (DateParseException ex) {
+                throw new CalculationException(ex);
             }
         }
 
-        private int stringToInt(String numberAsString) throws NaNException {
+        private static Period calculateDifference(String birthDateAsString) throws DateParseException {
+
+            LocalDate birthDate = null;
             try {
-                return Integer.valueOf(numberAsString);
-            } catch (NumberFormatException ex) {
-                throw new NaNException(numberAsString, ex);
+                birthDate = LocalDate.parse(birthDateAsString);
+            } catch (DateTimeParseException ex) {
+                throw new InvalidFormatException(birthDateAsString, ex);
             }
+
+            LocalDate today = LocalDate.now();
+
+            if (birthDate.isAfter(today)) {
+                throw new DateOutOfRangeException(birthDateAsString);
+            }
+
+            return Period.between(birthDate, today);
         }
 
     }
 
-    static class InvalidNumber extends Exception {
+    static class CalculationException extends Exception {
 
-        InvalidNumber(String input, Throwable thr) {
-            super("Invalid input for a number: " + input, thr);
+        CalculationException(DateParseException ex) {
+            super(ex);
         }
     }
 
-    static class NaNException extends Exception {
+    static class DateParseException extends Exception {
 
-        NaNException(String number, Throwable thr) {
-            super(number + "is not a number", thr);
+        DateParseException(String input) {
+            super(input);
+        }
+
+        DateParseException(String input, Throwable thr) {
+            super(input, thr);
+        }
+    }
+
+    static class InvalidFormatException extends DateParseException {
+
+        InvalidFormatException(String input, Throwable thr) {
+            super("Invalid date format: " + input, thr);
+        }
+    }
+
+    static class DateOutOfRangeException extends DateParseException {
+
+        DateOutOfRangeException(String date) {
+            super("Date out of range: " + date);
         }
 
     }
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
index 1e58e3f602..c333a7ac26 100644
--- a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
+++ b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
@@ -4,6 +4,8 @@ import com.google.common.base.Throwables;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.junit.jupiter.api.Test;
 
+import java.time.format.DateTimeParseException;
+
 import static com.baeldung.exceptions.RootCauseFinder.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -13,38 +15,65 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 public class RootCauseFinderTest {
 
     @Test
-    public void givenNestedException_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+    public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
         try {
-            IntParser.parse("text");
-        } catch (InvalidNumber ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof NumberFormatException);
+            AgeCalculator.calculateAge("010102");
+        } catch (CalculationException ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
         }
     }
 
     @Test
-    public void givenNonNestedException_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+    public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
         try {
-            IntParser.parse(null);
+            AgeCalculator.calculateAge("2020-04-04");
+        } catch (CalculationException ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
+        }
+    }
+
+    @Test
+    public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge(null);
         } catch (Exception ex) {
             assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
         }
     }
 
     @Test
-    public void givenNestedException_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
+    public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
         try {
-            IntParser.parse("text");
-        } catch (InvalidNumber ex) {
-            assertTrue(ExceptionUtils.getRootCause(ex) instanceof NumberFormatException);
+            AgeCalculator.calculateAge("010102");
+        } catch (CalculationException ex) {
+            assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException);
         }
     }
 
     @Test
-    public void givenNestedException_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
+    public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
         try {
-            IntParser.parse("text");
-        } catch (InvalidNumber ex) {
-            assertTrue(Throwables.getRootCause(ex) instanceof NumberFormatException);
+            AgeCalculator.calculateAge("2020-04-04");
+        } catch (CalculationException ex) {
+            assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException);
+        }
+    }
+
+    @Test
+    public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("010102");
+        } catch (CalculationException ex) {
+            assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException);
+        }
+    }
+
+    @Test
+    public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("2020-04-04");
+        } catch (CalculationException ex) {
+            assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException);
         }
     }
 

From cdd14b23f7b491964d0c755d2248f8bf886db80b Mon Sep 17 00:00:00 2001
From: Marcos Lopez Gonzalez <asturcon1234@gmail.com>
Date: Wed, 1 May 2019 13:10:42 +0200
Subject: [PATCH 124/404] AgeCalculator changes

---
 .../com/baeldung/exceptions/RootCauseFinder.java | 14 +++++++-------
 .../baeldung/exceptions/RootCauseFinderTest.java | 16 ++++++++++++++++
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
index 11f29a2cf0..e05dc7a6cd 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/exceptions/RootCauseFinder.java
@@ -33,28 +33,28 @@ public class RootCauseFinder {
             }
 
             try {
-                return calculateDifference(birthDate).getYears();
+                return Period
+                  .between(parseDate(birthDate), LocalDate.now())
+                  .getYears();
             } catch (DateParseException ex) {
                 throw new CalculationException(ex);
             }
         }
 
-        private static Period calculateDifference(String birthDateAsString) throws DateParseException {
+        private static LocalDate parseDate(String birthDateAsString) throws DateParseException {
 
-            LocalDate birthDate = null;
+            LocalDate birthDate;
             try {
                 birthDate = LocalDate.parse(birthDateAsString);
             } catch (DateTimeParseException ex) {
                 throw new InvalidFormatException(birthDateAsString, ex);
             }
 
-            LocalDate today = LocalDate.now();
-
-            if (birthDate.isAfter(today)) {
+            if (birthDate.isAfter(LocalDate.now())) {
                 throw new DateOutOfRangeException(birthDateAsString);
             }
 
-            return Period.between(birthDate, today);
+            return birthDate;
         }
 
     }
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
index c333a7ac26..cfac81b812 100644
--- a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
+++ b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
@@ -2,9 +2,12 @@ package com.baeldung.exceptions;
 
 import com.google.common.base.Throwables;
 import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.time.LocalDate;
 import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoUnit;
 
 import static com.baeldung.exceptions.RootCauseFinder.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -14,6 +17,19 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  */
 public class RootCauseFinderTest {
 
+    @Test
+    public void givenBirthDate_whenCalculatingAge_thenAgeReturned() {
+        try {
+            int age = AgeCalculator.calculateAge("1990-01-01");
+            Assertions.assertEquals(1990, LocalDate
+              .now()
+              .minus(age, ChronoUnit.YEARS)
+              .getYear());
+        } catch (CalculationException e) {
+            Assertions.fail(e.getMessage());
+        }
+    }
+
     @Test
     public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
         try {

From d973864c8b014e3c7db92dd14d6751e8e5980054 Mon Sep 17 00:00:00 2001
From: Marcos Lopez Gonzalez <asturcon1234@gmail.com>
Date: Wed, 1 May 2019 13:10:42 +0200
Subject: [PATCH 125/404] AgeCalculator changesJava-618 Restore RootCauseFinder
 code

---
 .../baeldung/exceptions/RootCauseFinder.java  | 95 ++++++++++++++++++
 .../exceptions/RootCauseFinderTest.java       | 96 +++++++++++++++++++
 2 files changed, 191 insertions(+)
 create mode 100644 core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
 create mode 100644 core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java

diff --git a/core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
new file mode 100644
index 0000000000..e05dc7a6cd
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
@@ -0,0 +1,95 @@
+package com.baeldung.exceptions;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.format.DateTimeParseException;
+import java.util.Objects;
+
+/**
+ * Utility class to find root cause exceptions.
+ */
+public class RootCauseFinder {
+
+    public static Throwable findCauseUsingPlainJava(Throwable throwable) {
+        Objects.requireNonNull(throwable);
+        Throwable rootCause = throwable;
+        while (rootCause.getCause() != null) {
+            rootCause = rootCause.getCause();
+        }
+        return rootCause;
+    }
+
+    /**
+     *  Calculates the age of a person from a given date.
+     */
+    static class AgeCalculator {
+
+        private AgeCalculator() {
+        }
+
+        public static int calculateAge(String birthDate) throws CalculationException {
+            if (birthDate == null || birthDate.isEmpty()) {
+                throw new IllegalArgumentException();
+            }
+
+            try {
+                return Period
+                  .between(parseDate(birthDate), LocalDate.now())
+                  .getYears();
+            } catch (DateParseException ex) {
+                throw new CalculationException(ex);
+            }
+        }
+
+        private static LocalDate parseDate(String birthDateAsString) throws DateParseException {
+
+            LocalDate birthDate;
+            try {
+                birthDate = LocalDate.parse(birthDateAsString);
+            } catch (DateTimeParseException ex) {
+                throw new InvalidFormatException(birthDateAsString, ex);
+            }
+
+            if (birthDate.isAfter(LocalDate.now())) {
+                throw new DateOutOfRangeException(birthDateAsString);
+            }
+
+            return birthDate;
+        }
+
+    }
+
+    static class CalculationException extends Exception {
+
+        CalculationException(DateParseException ex) {
+            super(ex);
+        }
+    }
+
+    static class DateParseException extends Exception {
+
+        DateParseException(String input) {
+            super(input);
+        }
+
+        DateParseException(String input, Throwable thr) {
+            super(input, thr);
+        }
+    }
+
+    static class InvalidFormatException extends DateParseException {
+
+        InvalidFormatException(String input, Throwable thr) {
+            super("Invalid date format: " + input, thr);
+        }
+    }
+
+    static class DateOutOfRangeException extends DateParseException {
+
+        DateOutOfRangeException(String date) {
+            super("Date out of range: " + date);
+        }
+
+    }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java b/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
new file mode 100644
index 0000000000..cfac81b812
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.exceptions;
+
+import com.google.common.base.Throwables;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoUnit;
+
+import static com.baeldung.exceptions.RootCauseFinder.*;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Tests the {@link RootCauseFinder}.
+ */
+public class RootCauseFinderTest {
+
+    @Test
+    public void givenBirthDate_whenCalculatingAge_thenAgeReturned() {
+        try {
+            int age = AgeCalculator.calculateAge("1990-01-01");
+            Assertions.assertEquals(1990, LocalDate
+              .now()
+              .minus(age, ChronoUnit.YEARS)
+              .getYear());
+        } catch (CalculationException e) {
+            Assertions.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("010102");
+        } catch (CalculationException ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
+        }
+    }
+
+    @Test
+    public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("2020-04-04");
+        } catch (CalculationException ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
+        }
+    }
+
+    @Test
+    public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge(null);
+        } catch (Exception ex) {
+            assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
+        }
+    }
+
+    @Test
+    public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("010102");
+        } catch (CalculationException ex) {
+            assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException);
+        }
+    }
+
+    @Test
+    public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("2020-04-04");
+        } catch (CalculationException ex) {
+            assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException);
+        }
+    }
+
+    @Test
+    public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("010102");
+        } catch (CalculationException ex) {
+            assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException);
+        }
+    }
+
+    @Test
+    public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
+        try {
+            AgeCalculator.calculateAge("2020-04-04");
+        } catch (CalculationException ex) {
+            assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException);
+        }
+    }
+
+}

From 491e79bd3ea1f958392d158df85c8015f2e5785c Mon Sep 17 00:00:00 2001
From: Marcos Lopez Gonzalez <asturcon1234@gmail.com>
Date: Sat, 4 May 2019 19:59:12 +0200
Subject: [PATCH 126/404] test renamed to end with UnitTest suffix

---
 .../{RootCauseFinderTest.java => RootCauseFinderUnitTest.java}  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename core-java/src/test/java/com/baeldung/exceptions/{RootCauseFinderTest.java => RootCauseFinderUnitTest.java} (98%)

diff --git a/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java b/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
rename to core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
index cfac81b812..03e6ac0f00 100644
--- a/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
+++ b/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
@@ -15,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 /**
  * Tests the {@link RootCauseFinder}.
  */
-public class RootCauseFinderTest {
+public class RootCauseFinderUnitTest {
 
     @Test
     public void givenBirthDate_whenCalculatingAge_thenAgeReturned() {

From e7cd7da8b8c4635102e64a86ca30c999e33f4b48 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Tue, 28 Apr 2020 23:37:45 +0200
Subject: [PATCH 127/404] Java-618 Restore RootCauseFinder code (move classes
 to core-java-modules)

---
 .../baeldung/exceptions/rootcausefinder}/RootCauseFinder.java   | 2 +-
 .../exceptions/rootcausefinder}/RootCauseFinderUnitTest.java    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
 rename {core-java/src/main/java/com/baeldung/exceptions => core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder}/RootCauseFinder.java (98%)
 rename {core-java/src/test/java/com/baeldung/exceptions => core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder}/RootCauseFinderUnitTest.java (98%)

diff --git a/core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinder.java
similarity index 98%
rename from core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinder.java
index e05dc7a6cd..06610f3874 100644
--- a/core-java/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinder.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.rootcausefinder;
 
 import java.time.LocalDate;
 import java.time.Period;
diff --git a/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
index 03e6ac0f00..f963f23712 100644
--- a/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions;
+package com.baeldung.exceptions.rootcausefinder;
 
 import com.google.common.base.Throwables;
 import org.apache.commons.lang3.exception.ExceptionUtils;

From fe9405607a590555ed525cefa3ac3c0a6ccd175a Mon Sep 17 00:00:00 2001
From: Chirag Dewan <chirag.dewan@ericsson.com>
Date: Wed, 29 Apr 2020 08:29:17 +0530
Subject: [PATCH 128/404] BAEL1731 Log4j2 Plugins

---
 .../plugins/DockerPatternConverter.java       |  30 ++++
 .../logging/log4j2/plugins/KafkaAppender.java | 133 ++++++++++++++++++
 .../logging/log4j2/plugins/KafkaBroker.java   |  38 +++++
 .../logging/log4j2/plugins/KafkaLookup.java   |  24 ++++
 .../log4j2/src/test/resources/log4j2.xml      |   9 ++
 5 files changed, 234 insertions(+)
 create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/DockerPatternConverter.java
 create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaAppender.java
 create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaBroker.java
 create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaLookup.java

diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/DockerPatternConverter.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/DockerPatternConverter.java
new file mode 100644
index 0000000000..c2e40cd565
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/DockerPatternConverter.java
@@ -0,0 +1,30 @@
+package com.baeldung.logging.log4j2.plugins;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.pattern.ConverterKeys;
+import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
+import org.apache.logging.log4j.core.pattern.PatternConverter;
+
+@Plugin(name = "DockerPatternConverter", category = PatternConverter.CATEGORY)
+@ConverterKeys({"docker", "container"})
+public class DockerPatternConverter extends LogEventPatternConverter {
+
+    private DockerPatternConverter(String[] options) {
+        super("Docker", "docker");
+    }
+
+    public static DockerPatternConverter newInstance(String[] options) {
+        return new DockerPatternConverter(options);
+    }
+
+    @Override
+    public void format(LogEvent event, StringBuilder toAppendTo) {
+        toAppendTo.append(dockerContainer());
+    }
+
+    private String dockerContainer() {
+        //get docker container ID inside which application is running here
+        return "container-1";
+    }
+}
diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaAppender.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaAppender.java
new file mode 100644
index 0000000000..3e91aa5e94
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaAppender.java
@@ -0,0 +1,133 @@
+package com.baeldung.logging.log4j2.plugins;
+
+import org.apache.logging.log4j.core.Core;
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+
+import java.io.Serializable;
+
+@Plugin(name = "Kafka2", category = Core.CATEGORY_NAME)
+public class KafkaAppender extends AbstractAppender {
+
+    @PluginBuilderFactory
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+
+    public static class Builder implements org.apache.logging.log4j.core.util.Builder<KafkaAppender> {
+
+        @PluginBuilderAttribute("name")
+        @Required
+        private String name;
+
+        @PluginBuilderAttribute("ip")
+        private String ipAddress;
+
+        @PluginBuilderAttribute("port")
+        private int port;
+
+        @PluginBuilderAttribute("topic")
+        private String topic;
+
+        @PluginBuilderAttribute("partition")
+        private String partition;
+
+        @PluginElement("Layout")
+        private Layout<? extends Serializable> layout;
+
+        @PluginElement("Filter")
+        private Filter filter;
+
+        public Layout<? extends Serializable> getLayout() {
+            return layout;
+        }
+
+        public Builder setLayout(Layout<? extends Serializable> layout) {
+            this.layout = layout;
+            return this;
+        }
+
+        public Filter getFilter() {
+            return filter;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public Builder setName(String name) {
+            this.name = name;
+            return this;
+        }
+
+        public Builder setFilter(Filter filter) {
+            this.filter = filter;
+            return this;
+        }
+
+        public String getIpAddress() {
+            return ipAddress;
+        }
+
+        public Builder setIpAddress(String ipAddress) {
+            this.ipAddress = ipAddress;
+            return this;
+        }
+
+        public int getPort() {
+            return port;
+        }
+
+        public Builder setPort(int port) {
+            this.port = port;
+            return this;
+        }
+
+        public String getTopic() {
+            return topic;
+        }
+
+        public Builder setTopic(String topic) {
+            this.topic = topic;
+            return this;
+        }
+
+        public String getPartition() {
+            return partition;
+        }
+
+        public Builder setPartition(String partition) {
+            this.partition = partition;
+            return this;
+        }
+
+        @Override
+        public KafkaAppender build() {
+            return new KafkaAppender(getName(), getFilter(), getLayout(), true, new KafkaBroker(ipAddress, port, topic, partition));
+        }
+    }
+
+    private KafkaBroker broker;
+
+    private KafkaAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, KafkaBroker broker) {
+        super(name, filter, layout, ignoreExceptions);
+        this.broker = broker;
+    }
+
+    @Override
+    public void append(LogEvent event) {
+
+        connectAndSendToKafka(broker, event);
+    }
+
+    private void connectAndSendToKafka(KafkaBroker broker, LogEvent event) {
+        //send to Kafka
+    }
+}
diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaBroker.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaBroker.java
new file mode 100644
index 0000000000..0479e71c41
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaBroker.java
@@ -0,0 +1,38 @@
+package com.baeldung.logging.log4j2.plugins;
+
+import java.io.Serializable;
+
+public class KafkaBroker implements Serializable {
+
+    private final String ipAddress;
+    private final int port;
+
+    public KafkaBroker(String ipAddress, int port, String topic, String partition) {
+        this.ipAddress = ipAddress;
+        this.port = port;
+        this.topic = topic;
+        this.partition = partition;
+    }
+
+    public String getTopic() {
+        return topic;
+    }
+
+    public String getPartition() {
+        return partition;
+    }
+
+    private final String topic;
+    private final String partition;
+
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+
+}
diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaLookup.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaLookup.java
new file mode 100644
index 0000000000..c2679861c4
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/KafkaLookup.java
@@ -0,0 +1,24 @@
+package com.baeldung.logging.log4j2.plugins;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.lookup.StrLookup;
+
+@Plugin(name = "kafka", category = StrLookup.CATEGORY)
+public class KafkaLookup implements StrLookup {
+
+    @Override
+    public String lookup(String key) {
+        return getFromKafka(key);
+    }
+
+    @Override
+    public String lookup(LogEvent event, String key) {
+        return getFromKafka(key);
+    }
+
+    private String getFromKafka(String topicName) {
+        //kafka search logic should go here
+        return "topic1-p1";
+    }
+}
diff --git a/logging-modules/log4j2/src/test/resources/log4j2.xml b/logging-modules/log4j2/src/test/resources/log4j2.xml
index ee26bcecf2..050e0aa705 100644
--- a/logging-modules/log4j2/src/test/resources/log4j2.xml
+++ b/logging-modules/log4j2/src/test/resources/log4j2.xml
@@ -50,6 +50,12 @@
             </Policies>
         </RollingFile>
         <MapAppender name="MapAppender"/>
+        <Console name="DockerConsoleLogger" target="SYSTEM_OUT">
+            <PatternLayout pattern="%pid %docker" />
+        </Console>
+        <Kafka2 name="KafkaLogger" ip ="127.0.0.1" port="9010" topic="log" partition="p-1">
+            <PatternLayout pattern="%pid%style{%message}{red}%n" />
+        </Kafka2>
     </Appenders>
     <Loggers>
         <Logger name="CONSOLE_PATTERN_APPENDER_MARKER" level="TRACE"
@@ -80,6 +86,9 @@
             additivity="false">
             <AppenderRef ref="ConsoleJSONAppender" />
         </Logger>
+        <Logger name="com.baeldung.logging.log4j2.plugins" level="INFO">
+            <AppenderRef ref="KafkaLogger" />
+        </Logger>
         <Root level="DEBUG">
             <AppenderRef ref="ConsoleAppender" />
             <AppenderRef ref="MapAppender" />

From f01f9f9d86c98e8e61fd55bde798938de93f2a33 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Wed, 29 Apr 2020 09:08:43 +0200
Subject: [PATCH 129/404] [JAVA-621] Used *UnitTest suffix instead of Test for
 compliance with Maven PMD (article need update)

---
 .../{AnonymousInnerTest.java => AnonymousInnerUnitTest.java}    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/{AnonymousInnerTest.java => AnonymousInnerUnitTest.java} (90%)

diff --git a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java
rename to core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerUnitTest.java
index 4e49bb5b41..98917b9e05 100644
--- a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerTest.java
+++ b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/nestedclass/AnonymousInnerUnitTest.java
@@ -6,7 +6,7 @@ abstract class SimpleAbstractClass {
     abstract void run();
 }
 
-public class AnonymousInnerTest {
+public class AnonymousInnerUnitTest {
 
     @Test
     public void run() {

From 666ca1ac69e13b8a20e87aabde9aeb25f066e128 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Wed, 29 Apr 2020 10:13:58 +0200
Subject: [PATCH 130/404] Java-618 Fix build failure

---
 core-java-modules/core-java-exceptions/pom.xml              | 6 ++++++
 .../exceptions/rootcausefinder/RootCauseFinderUnitTest.java | 5 ++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml
index 60c5e2650a..0778b6b5a3 100644
--- a/core-java-modules/core-java-exceptions/pom.xml
+++ b/core-java-modules/core-java-exceptions/pom.xml
@@ -29,6 +29,11 @@
             <version>${lombok.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons.lang3.version}</version>
+        </dependency>
         <!-- test scoped -->
         <dependency>
             <groupId>org.assertj</groupId>
@@ -40,6 +45,7 @@
 
     <properties>
         <javax.mail.version>1.5.0-b01</javax.mail.version>
+        <commons.lang3.version>3.10</commons.lang3.version>
         <!-- testing -->
         <assertj-core.version>3.10.0</assertj-core.version>
     </properties>
diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
index f963f23712..f42388857a 100644
--- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
@@ -1,5 +1,7 @@
 package com.baeldung.exceptions.rootcausefinder;
 
+import com.baeldung.exceptions.rootcausefinder.RootCauseFinder.CalculationException;
+import com.baeldung.exceptions.rootcausefinder.RootCauseFinder.DateOutOfRangeException;
 import com.google.common.base.Throwables;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.junit.jupiter.api.Assertions;
@@ -9,7 +11,8 @@ import java.time.LocalDate;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 
-import static com.baeldung.exceptions.RootCauseFinder.*;
+import static com.baeldung.exceptions.rootcausefinder.RootCauseFinder.AgeCalculator;
+import static com.baeldung.exceptions.rootcausefinder.RootCauseFinder.findCauseUsingPlainJava;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**

From da22d7a839156017cfc815b3fd50e3e6180bf295 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Wed, 29 Apr 2020 10:14:43 +0200
Subject: [PATCH 131/404] [JAVA-621] Fixed package and import

---
 .../com/baeldung/hashcode/{entities => }/UserUnitTest.java     | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
 rename core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/{entities => }/UserUnitTest.java (90%)

diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/UserUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
rename to core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/UserUnitTest.java
index 44ea7efed1..51475acabf 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/UserUnitTest.java
@@ -1,5 +1,6 @@
-package com.baeldung.hashcode.entities;
+package com.baeldung.hashcode;
 
+import com.baeldung.hashcode.standard.User;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;

From 95a29d7e0b889826058564d17b8bcfacdffc23bf Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Wed, 29 Apr 2020 10:24:20 +0200
Subject: [PATCH 132/404] Java-618 Fix build failure (2)

---
 .../exceptions/RootCauseFinderTest.java       | 96 -------------------
 1 file changed, 96 deletions(-)
 delete mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java

diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
deleted file mode 100644
index cfac81b812..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/RootCauseFinderTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.baeldung.exceptions;
-
-import com.google.common.base.Throwables;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeParseException;
-import java.time.temporal.ChronoUnit;
-
-import static com.baeldung.exceptions.RootCauseFinder.*;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Tests the {@link RootCauseFinder}.
- */
-public class RootCauseFinderTest {
-
-    @Test
-    public void givenBirthDate_whenCalculatingAge_thenAgeReturned() {
-        try {
-            int age = AgeCalculator.calculateAge("1990-01-01");
-            Assertions.assertEquals(1990, LocalDate
-              .now()
-              .minus(age, ChronoUnit.YEARS)
-              .getYear());
-        } catch (CalculationException e) {
-            Assertions.fail(e.getMessage());
-        }
-    }
-
-    @Test
-    public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge("010102");
-        } catch (CalculationException ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
-        }
-    }
-
-    @Test
-    public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge("2020-04-04");
-        } catch (CalculationException ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
-        }
-    }
-
-    @Test
-    public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge(null);
-        } catch (Exception ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
-        }
-    }
-
-    @Test
-    public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge("010102");
-        } catch (CalculationException ex) {
-            assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException);
-        }
-    }
-
-    @Test
-    public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge("2020-04-04");
-        } catch (CalculationException ex) {
-            assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException);
-        }
-    }
-
-    @Test
-    public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge("010102");
-        } catch (CalculationException ex) {
-            assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException);
-        }
-    }
-
-    @Test
-    public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
-        try {
-            AgeCalculator.calculateAge("2020-04-04");
-        } catch (CalculationException ex) {
-            assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException);
-        }
-    }
-
-}

From 5aa57193e1328935b4cc1775ae378d846a16fd0b Mon Sep 17 00:00:00 2001
From: Ankur Gupta <ankurguptajec@gmail.com>
Date: Wed, 29 Apr 2020 20:10:16 +0530
Subject: [PATCH 133/404] ankurguptajec@gmail.com (#9192)

* Java Example of Hexagonal Architecture

* removing unnecessary maven files from pull request and spaces in code

* Removing unnecessary lines

* Example code for using Multiple Cache Manager in SpringBoot

* BAEL-3963:Using multiple cache managers in Spring

* removing new module created in last pull request

* Fixes as per editor Suggestions

* fixing spacing issue in pom.xml

* Fixing spacing issue in pom.xml

* Fixing spacing issue 2

* Formatting space issues in pom.xml

Co-authored-by: Ankur Gupta <ankur.gupta@jda.com>
---
 spring-caching/pom.xml | 120 ++++++++++++++++++++---------------------
 1 file changed, 59 insertions(+), 61 deletions(-)

diff --git a/spring-caching/pom.xml b/spring-caching/pom.xml
index f56d3cf328..80644f8a5f 100644
--- a/spring-caching/pom.xml
+++ b/spring-caching/pom.xml
@@ -2,66 +2,64 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<artifactId>spring-caching</artifactId>
-	<version>0.1-SNAPSHOT</version>
-	<name>spring-caching</name>
-	<packaging>war</packaging>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>spring-caching</artifactId>
+    <version>0.1-SNAPSHOT</version>
+    <name>spring-caching</name>
+    <packaging>war</packaging>
 
-	<parent>
-		<groupId>com.baeldung</groupId>
-		<artifactId>parent-boot-2</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../parent-boot-2</relativePath>
-	</parent>
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../parent-boot-2</relativePath>
+    </parent>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-context</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-cache</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-web</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-webmvc</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.ehcache</groupId>
-			<artifactId>ehcache</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.github.ben-manes.caffeine</groupId>
-			<artifactId>caffeine</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.h2database</groupId>
-			<artifactId>h2</artifactId>
-			<scope>runtime</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-jdbc</artifactId>
-		</dependency>
-	</dependencies>
-
-	<properties>
-		<ehcache.version>3.5.2</ehcache.version>
-	</properties>
-
-</project>
\ No newline at end of file
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ehcache</groupId>
+            <artifactId>ehcache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+    </dependencies>
+    <properties>
+        <ehcache.version>3.5.2</ehcache.version>
+    </properties>
+</project>

From 299effed3e9559f021b75a2f2e68d278b7b1ac07 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Wed, 29 Apr 2020 20:49:15 +0200
Subject: [PATCH 134/404] Java-1470 Split libraries module

---
 libraries-4/README.md                         |  44 +--
 libraries-5/README.md                         |  21 ++
 libraries-5/pom.xml                           | 132 ++++++-
 .../java/com/baeldung/akka/FirstActor.java    |   0
 .../main/java/com/baeldung/akka/MyActor.java  |   0
 .../java/com/baeldung/akka/PrinterActor.java  |   0
 .../java/com/baeldung/akka/ReadingActor.java  |   0
 .../com/baeldung/akka/WordCounterActor.java   |   0
 .../main/java/com/baeldung/bytebuddy/Bar.java |   0
 .../main/java/com/baeldung/bytebuddy/Foo.java |   0
 .../com/baeldung/caffeine/DataObject.java     |   0
 .../com/baeldung/jctools/MpmcBenchmark.java   |   0
 .../main/java/com/baeldung/jctools/README.md  |   0
 .../java/com/baeldung/jnats/NatsClient.java   |   0
 .../main/java/com/baeldung/streamex/Role.java |   0
 .../java/com/baeldung/streamex/StreamEX.java  |   0
 .../main/java/com/baeldung/streamex/User.java |   0
 .../com/baeldung/akka/AkkaActorsUnitTest.java |   0
 .../baeldung/bytebuddy/ByteBuddyUnitTest.java |   0
 .../baeldung/caffeine/CaffeineUnitTest.java   |  21 +-
 .../baeldung/dockerapi/ContainerLiveTest.java |   6 +-
 .../dockerapi/DockerClientLiveTest.java       |   0
 .../com/baeldung/dockerapi/ImageLiveTest.java |   4 +-
 .../baeldung/dockerapi/NetworkLiveTest.java   |   3 +-
 .../baeldung/dockerapi/VolumeLiveTest.java    |   5 +-
 .../com/baeldung}/fugue/FugueUnitTest.java    |   2 +-
 .../com/baeldung/jctools/JCToolsUnitTest.java |   9 +-
 .../baeldung/jnats/NatsClientLiveTest.java    |   0
 .../java/com/baeldung/jool/JOOLUnitTest.java  |   0
 .../PactConsumerDrivenContractUnitTest.java   |   0
 .../StreamExMergeStreamsUnitTest.java         |   2 +-
 .../src/test/resources/dockerapi/Dockerfile   |   0
 libraries-6/README.md                         |  17 +
 libraries-6/pom.xml                           |  96 +++++
 .../com/baeldung/fj/FunctionalJavaIOMain.java |  86 ++---
 .../com/baeldung/fj/FunctionalJavaMain.java   |  96 ++---
 .../main/java/com/baeldung/ftp/FtpClient.java |   0
 .../baeldung/javapoet/PersonGenerator.java    |   0
 .../kafka/TransactionalMessageProducer.java   |   0
 .../kafka/TransactionalWordCount.java         |   0
 .../main/java/com/baeldung/kafka/Tuple.java   |   0
 .../baeldung/reflections/ReflectionsApp.java  | 142 ++++----
 .../baeldung/fj/FunctionalJavaUnitTest.java   |   7 +-
 .../ftp/FtpClientIntegrationTest.java         |   0
 .../ftp/JdkFtpClientIntegrationTest.java      |   0
 .../test/PersonGeneratorUnitTest.java         |   0
 .../baeldung/javapoet/test/person/Gender.java |   0
 .../baeldung/javapoet/test/person/Person.java |   0
 .../javapoet/test/person/Student.java         |   0
 .../kafkastreams/KafkaStreamsLiveTest.java    |   0
 .../reflections/ReflectionsUnitTest.java      | 100 +++---
 .../resilence4j}/Resilience4jUnitTest.java    |   2 +-
 .../src/test/resources/ftp/baz.txt            |   0
 libraries/pom.xml                             | 332 +++++++++---------
 54 files changed, 689 insertions(+), 438 deletions(-)
 create mode 100644 libraries-5/README.md
 rename {libraries => libraries-5}/src/main/java/com/baeldung/akka/FirstActor.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/akka/MyActor.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/akka/PrinterActor.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/akka/ReadingActor.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/akka/WordCounterActor.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/bytebuddy/Bar.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/bytebuddy/Foo.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/caffeine/DataObject.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/jctools/MpmcBenchmark.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/jctools/README.md (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/jnats/NatsClient.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/streamex/Role.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/streamex/StreamEX.java (100%)
 rename {libraries => libraries-5}/src/main/java/com/baeldung/streamex/User.java (100%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java (100%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java (100%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java (88%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java (94%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java (100%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java (96%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java (95%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java (92%)
 rename {libraries/src/test/java/com/baeldung/atlassian => libraries-5/src/test/java/com/baeldung}/fugue/FugueUnitTest.java (99%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java (88%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java (100%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/jool/JOOLUnitTest.java (100%)
 rename {libraries => libraries-5}/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java (100%)
 rename {libraries/src/test/java/com/baeldung/stream => libraries-5/src/test/java/com/baeldung/streamex}/StreamExMergeStreamsUnitTest.java (98%)
 rename {libraries => libraries-5}/src/test/resources/dockerapi/Dockerfile (100%)
 create mode 100644 libraries-6/README.md
 rename {libraries => libraries-6}/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java (96%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/fj/FunctionalJavaMain.java (96%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/ftp/FtpClient.java (100%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/javapoet/PersonGenerator.java (100%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java (100%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/kafka/TransactionalWordCount.java (100%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/kafka/Tuple.java (100%)
 rename {libraries => libraries-6}/src/main/java/com/baeldung/reflections/ReflectionsApp.java (97%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java (95%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/javapoet/test/person/Gender.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/javapoet/test/person/Person.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/javapoet/test/person/Student.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java (100%)
 rename {libraries => libraries-6}/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java (96%)
 rename {libraries/src/test/java/com/baeldung/resilience4j => libraries-6/src/test/java/com/baeldung/resilence4j}/Resilience4jUnitTest.java (99%)
 rename {libraries => libraries-6}/src/test/resources/ftp/baz.txt (100%)

diff --git a/libraries-4/README.md b/libraries-4/README.md
index f650c073a7..9cda07bdf5 100644
--- a/libraries-4/README.md
+++ b/libraries-4/README.md
@@ -1,4 +1,4 @@
-## Libraries
+## Libraries-4
 
 This module contains articles about various Java libraries. 
 These are small libraries that are relatively easy to use and do not require any separate module of their own.
@@ -8,36 +8,14 @@ The code examples related to different libraries are each in their own module.
 Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
 
 ### Relevant articles
-
-- [Introduction to Javatuples](https://www.baeldung.com/java-tuples)
-- [Introduction to Javassist](https://www.baeldung.com/javassist)
-- [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink)
-- [Intro to JaVers](https://www.baeldung.com/javers)
-- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams)
-- [Introduction to Quartz](https://www.baeldung.com/quartz)
-- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup)
-- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
-- [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
-- [Introduction to Neuroph](https://www.baeldung.com/neuroph)
-
-#5
-- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
-- [Introduction to StreamEx](https://www.baeldung.com/streamex)
-- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
-- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
-- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
-- [Introduction to jOOL](https://www.baeldung.com/jool)
-- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
-- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
-- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
-- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
-
-#6
-- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
-- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
-- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
-- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
-- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
-
-- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
+- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
+- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
+- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
+- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
+- [Introduction to NoException](https://www.baeldung.com/no-exception)
+- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
+- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
+- [Guide to JDeferred](https://www.baeldung.com/jdeferred)
+- [Introduction to MBassador](https://www.baeldung.com/mbassador)
+- [Using Pairs in Java](https://www.baeldung.com/java-pairs)
 - More articles [[next -->]](/libraries-2)
diff --git a/libraries-5/README.md b/libraries-5/README.md
new file mode 100644
index 0000000000..f1e749b293
--- /dev/null
+++ b/libraries-5/README.md
@@ -0,0 +1,21 @@
+## Libraries-5
+
+This module contains articles about various Java libraries. 
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
+- [Introduction to StreamEx](https://www.baeldung.com/streamex)
+- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
+- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
+- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
+- [Introduction to jOOL](https://www.baeldung.com/jool)
+- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
+- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
+- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
+- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
+- More articles [[<-- prev]](/libraries-4) [[next -->]](/libraries-6)
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index b5a1ecd49c..41c92e54c3 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -7,9 +7,139 @@
         <groupId>com.baeldung</groupId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
-    <modelVersion>4.0.0</modelVersion>
 
     <artifactId>libraries-5</artifactId>
+    <modelVersion>4.0.0</modelVersion>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jooq</groupId>
+            <artifactId>jool</artifactId>
+            <version>${jool.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>au.com.dius</groupId>
+            <artifactId>pact-jvm-consumer-junit_2.11</artifactId>
+            <version>${pact.version}</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.codehaus.groovy</groupId>
+                    <artifactId>groovy-all</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.typesafe.akka/akka-actor -->
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-actor_2.12</artifactId>
+            <version>${typesafe-akka.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.typesafe.akka</groupId>
+            <artifactId>akka-testkit_2.12</artifactId>
+            <version>${typesafe-akka.version}</version>
+            <scope>test</scope>
+
+        </dependency>
+                <dependency>
+                    <groupId>one.util</groupId>
+                    <artifactId>streamex</artifactId>
+                    <version>${streamex.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+            <version>${bytebuddy.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy-agent</artifactId>
+            <version>${bytebuddy.version}</version>
+        </dependency>
+
+        <!--Java Docker API Client -->
+        <dependency>
+            <groupId>com.github.docker-java</groupId>
+            <artifactId>docker-java</artifactId>
+            <version>${docker.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>jcl-over-slf4j</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--Java Docker API Client -->
+
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>${caffeine.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+            <version>${findbugs.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Atlassian Fugue -->
+        <dependency>
+            <groupId>io.atlassian.fugue</groupId>
+            <artifactId>fugue</artifactId>
+            <version>${fugue.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.nats</groupId>
+            <artifactId>jnats</artifactId>
+            <version>${jnats.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jctools</groupId>
+            <artifactId>jctools-core</artifactId>
+            <version>${jctools.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>${jmh.version}</version>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <pact.version>3.5.0</pact.version>
+        <jool.version>0.9.12</jool.version>
+        <spring.version>4.3.8.RELEASE</spring.version>
+        <assertj.version>3.6.2</assertj.version>
+        <typesafe-akka.version>2.5.26</typesafe-akka.version>
+        <streamex.version>0.6.5</streamex.version>
+        <bytebuddy.version>1.7.1</bytebuddy.version>
+        <docker.version>3.0.14</docker.version>
+        <caffeine.version>2.5.5</caffeine.version>
+        <findbugs.version>3.0.2</findbugs.version>
+        <fugue.version>4.5.1</fugue.version>
+        <jnats.version>1.0</jnats.version>
+        <jctools.version>2.1.2</jctools.version>
+        <jmh.version>1.19</jmh.version>
+    </properties>
 
 </project>
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/akka/FirstActor.java b/libraries-5/src/main/java/com/baeldung/akka/FirstActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/FirstActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/FirstActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/MyActor.java b/libraries-5/src/main/java/com/baeldung/akka/MyActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/MyActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/MyActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/PrinterActor.java b/libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/PrinterActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/ReadingActor.java b/libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/ReadingActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/WordCounterActor.java b/libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/WordCounterActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java
diff --git a/libraries/src/main/java/com/baeldung/bytebuddy/Bar.java b/libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/bytebuddy/Bar.java
rename to libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java
diff --git a/libraries/src/main/java/com/baeldung/bytebuddy/Foo.java b/libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/bytebuddy/Foo.java
rename to libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java
diff --git a/libraries/src/main/java/com/baeldung/caffeine/DataObject.java b/libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/caffeine/DataObject.java
rename to libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java
diff --git a/libraries/src/main/java/com/baeldung/jctools/MpmcBenchmark.java b/libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
rename to libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
diff --git a/libraries/src/main/java/com/baeldung/jctools/README.md b/libraries-5/src/main/java/com/baeldung/jctools/README.md
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jctools/README.md
rename to libraries-5/src/main/java/com/baeldung/jctools/README.md
diff --git a/libraries/src/main/java/com/baeldung/jnats/NatsClient.java b/libraries-5/src/main/java/com/baeldung/jnats/NatsClient.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jnats/NatsClient.java
rename to libraries-5/src/main/java/com/baeldung/jnats/NatsClient.java
diff --git a/libraries/src/main/java/com/baeldung/streamex/Role.java b/libraries-5/src/main/java/com/baeldung/streamex/Role.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/streamex/Role.java
rename to libraries-5/src/main/java/com/baeldung/streamex/Role.java
diff --git a/libraries/src/main/java/com/baeldung/streamex/StreamEX.java b/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/streamex/StreamEX.java
rename to libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java
diff --git a/libraries/src/main/java/com/baeldung/streamex/User.java b/libraries-5/src/main/java/com/baeldung/streamex/User.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/streamex/User.java
rename to libraries-5/src/main/java/com/baeldung/streamex/User.java
diff --git a/libraries/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java b/libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java b/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java b/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
similarity index 88%
rename from libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
index d523d0ff8b..65c441c50d 100644
--- a/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
@@ -8,6 +8,7 @@ import java.util.concurrent.TimeUnit;
 
 import javax.annotation.Nonnull;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import com.github.benmanes.caffeine.cache.*;
@@ -65,43 +66,43 @@ public class CaffeineUnitTest {
             assertEquals("Data for " + key, dataObject.getData());
         });
 
-        cache.getAll(Arrays.asList("A", "B", "C")).thenAccept(dataObjectMap -> assertEquals(3, dataObjectMap.size()));
+        cache.getAll(Arrays.asList("A", "B", "C")).thenAccept(dataObjectMap -> Assert.assertEquals(3, dataObjectMap.size()));
     }
 
     @Test
     public void givenLoadingCacheWithSmallSize_whenPut_thenSizeIsConstant() {
         LoadingCache<String, DataObject> cache = Caffeine.newBuilder().maximumSize(1).refreshAfterWrite(10, TimeUnit.MINUTES).build(k -> DataObject.get("Data for " + k));
 
-        assertEquals(0, cache.estimatedSize());
+        Assert.assertEquals(0, cache.estimatedSize());
 
         cache.get("A");
 
-        assertEquals(1, cache.estimatedSize());
+        Assert.assertEquals(1, cache.estimatedSize());
 
         cache.get("B");
         cache.cleanUp();
 
-        assertEquals(1, cache.estimatedSize());
+        Assert.assertEquals(1, cache.estimatedSize());
     }
 
     @Test
     public void givenLoadingCacheWithWeigher_whenPut_thenSizeIsConstant() {
         LoadingCache<String, DataObject> cache = Caffeine.newBuilder().maximumWeight(10).weigher((k, v) -> 5).build(k -> DataObject.get("Data for " + k));
 
-        assertEquals(0, cache.estimatedSize());
+        Assert.assertEquals(0, cache.estimatedSize());
 
         cache.get("A");
 
-        assertEquals(1, cache.estimatedSize());
+        Assert.assertEquals(1, cache.estimatedSize());
 
         cache.get("B");
 
-        assertEquals(2, cache.estimatedSize());
+        Assert.assertEquals(2, cache.estimatedSize());
 
         cache.get("C");
         cache.cleanUp();
 
-        assertEquals(2, cache.estimatedSize());
+        Assert.assertEquals(2, cache.estimatedSize());
     }
 
     @Test
@@ -138,7 +139,7 @@ public class CaffeineUnitTest {
         cache.get("A");
         cache.get("A");
 
-        assertEquals(1, cache.stats().hitCount());
-        assertEquals(1, cache.stats().missCount());
+        Assert.assertEquals(1, cache.stats().hitCount());
+        Assert.assertEquals(1, cache.stats().missCount());
     }
 }
\ No newline at end of file
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
similarity index 94%
rename from libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
index e6f0fd1c31..007c70355a 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
@@ -6,6 +6,8 @@ import com.github.dockerjava.api.command.InspectContainerResponse;
 import com.github.dockerjava.api.model.Container;
 import com.github.dockerjava.api.model.PortBinding;
 import com.github.dockerjava.core.DockerClientBuilder;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.core.Is;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -51,7 +53,7 @@ public class ContainerLiveTest {
         CreateContainerResponse container = dockerClient.createContainerCmd("mongo:3.6").withCmd("--bind_ip_all").withName("mongo").withHostName("baeldung").withEnv("MONGO_LATEST_VERSION=3.6").withPortBindings(PortBinding.parse("9999:27017")).exec();
 
         // then
-        assertThat(container.getId(), is(not(null)));
+        MatcherAssert.assertThat(container.getId(), is(not(null)));
     }
 
     @Test
@@ -104,7 +106,7 @@ public class ContainerLiveTest {
         // then
         InspectContainerResponse containerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
 
-        assertThat(containerResponse.getId(), is(container.getId()));
+        MatcherAssert.assertThat(containerResponse.getId(), Is.is(container.getId()));
     }
 
     @Test
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
index 7e8cd6a354..96e7922f2a 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
@@ -8,6 +8,8 @@ import com.github.dockerjava.core.DockerClientBuilder;
 import com.github.dockerjava.core.command.BuildImageResultCallback;
 import com.github.dockerjava.core.command.PullImageResultCallback;
 import com.github.dockerjava.core.command.PushImageResultCallback;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.core.Is;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -81,7 +83,7 @@ public class ImageLiveTest {
         InspectImageResponse imageResponse = dockerClient.inspectImageCmd(image.getId()).exec();
 
         // then
-        assertThat(imageResponse.getId(), is(image.getId()));
+        MatcherAssert.assertThat(imageResponse.getId(), Is.is(image.getId()));
     }
 
     @Test
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
similarity index 95%
rename from libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
index d3abbe2e7e..31ad32c7b5 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
@@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.CreateNetworkResponse;
 import com.github.dockerjava.api.model.Network;
 import com.github.dockerjava.api.model.Network.Ipam;
 import com.github.dockerjava.core.DockerClientBuilder;
+import org.hamcrest.MatcherAssert;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -64,7 +65,7 @@ public class NetworkLiveTest {
         Network network = dockerClient.inspectNetworkCmd().withNetworkId(networkName).exec();
 
         // then
-        assertThat(network.getName(), is(networkName));
+        MatcherAssert.assertThat(network.getName(), is(networkName));
     }
 
     @Test
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
similarity index 92%
rename from libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
index 9e60a76b33..f2a078b2c6 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
@@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.CreateVolumeResponse;
 import com.github.dockerjava.api.command.InspectVolumeResponse;
 import com.github.dockerjava.api.command.ListVolumesResponse;
 import com.github.dockerjava.core.DockerClientBuilder;
+import org.hamcrest.MatcherAssert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -57,7 +58,7 @@ public class VolumeLiveTest {
         CreateVolumeResponse unnamedVolume = dockerClient.createVolumeCmd().exec();
 
         // then
-        assertThat(unnamedVolume.getName(), is(not(null)));
+        MatcherAssert.assertThat(unnamedVolume.getName(), is(not(null)));
     }
 
     @Test
@@ -67,7 +68,7 @@ public class VolumeLiveTest {
         CreateVolumeResponse namedVolume = dockerClient.createVolumeCmd().withName("myNamedVolume").exec();
 
         // then
-        assertThat(namedVolume.getName(), is(not(null)));
+        MatcherAssert.assertThat(namedVolume.getName(), is(not(null)));
     }
 
     @Test
diff --git a/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueUnitTest.java b/libraries-5/src/test/java/com/baeldung/fugue/FugueUnitTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/atlassian/fugue/FugueUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/fugue/FugueUnitTest.java
index 773e39b76a..c3a89a1355 100644
--- a/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/fugue/FugueUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.atlassian.fugue;
+package com.baeldung.fugue;
 
 import io.atlassian.fugue.*;
 import org.junit.Assert;
diff --git a/libraries/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java b/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
similarity index 88%
rename from libraries/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
index 4a9d0fadb2..a5dacdbdac 100644
--- a/libraries/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
@@ -1,5 +1,6 @@
 package com.baeldung.jctools;
 
+import org.assertj.core.api.Assertions;
 import org.jctools.queues.SpscArrayQueue;
 import org.jctools.queues.SpscChunkedArrayQueue;
 import org.junit.Test;
@@ -44,16 +45,16 @@ public class JCToolsUnitTest {
     @Test
     public void whenQueueIsFull_thenNoMoreElementsCanBeAdded() throws InterruptedException {
         SpscChunkedArrayQueue<Integer> queue = new SpscChunkedArrayQueue<>(8, 16);
-        assertThat(queue.capacity()).isEqualTo(16);
+        Assertions.assertThat(queue.capacity()).isEqualTo(16);
 
         CountDownLatch startConsuming = new CountDownLatch(1);
         CountDownLatch awakeProducer = new CountDownLatch(1);
         AtomicReference<Throwable> error = new AtomicReference<>();
         Thread producer = new Thread(() -> {
             IntStream.range(0, queue.capacity()).forEach(i -> {
-                assertThat(queue.offer(i)).isTrue();
+                Assertions.assertThat(queue.offer(i)).isTrue();
             });
-            assertThat(queue.offer(queue.capacity())).isFalse();
+            Assertions.assertThat(queue.offer(queue.capacity())).isFalse();
             startConsuming.countDown();
             try {
                 awakeProducer.await();
@@ -61,7 +62,7 @@ public class JCToolsUnitTest {
                 throw new RuntimeException(e);
             }
 
-            assertThat(queue.offer(queue.capacity())).isTrue();
+            Assertions.assertThat(queue.offer(queue.capacity())).isTrue();
         });
         producer.setUncaughtExceptionHandler((t, e) -> {
             error.set(e);
diff --git a/libraries/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java b/libraries-5/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java
diff --git a/libraries/src/test/java/com/baeldung/jool/JOOLUnitTest.java b/libraries-5/src/test/java/com/baeldung/jool/JOOLUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/jool/JOOLUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/jool/JOOLUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsUnitTest.java b/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
similarity index 98%
rename from libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
index 220348bf36..b267eaea9b 100644
--- a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stream;
+package com.baeldung.streamex;
 
 import one.util.streamex.StreamEx;
 import org.junit.Test;
diff --git a/libraries/src/test/resources/dockerapi/Dockerfile b/libraries-5/src/test/resources/dockerapi/Dockerfile
similarity index 100%
rename from libraries/src/test/resources/dockerapi/Dockerfile
rename to libraries-5/src/test/resources/dockerapi/Dockerfile
diff --git a/libraries-6/README.md b/libraries-6/README.md
new file mode 100644
index 0000000000..79bb83113e
--- /dev/null
+++ b/libraries-6/README.md
@@ -0,0 +1,17 @@
+## Libraries-6
+
+This module contains articles about various Java libraries. 
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
+- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
+- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
+- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
+- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
+- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
+- More articles [[<-- prev]](/libraries-5)
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
index be74ff9ef0..030e5aa77b 100644
--- a/libraries-6/pom.xml
+++ b/libraries-6/pom.xml
@@ -11,5 +11,101 @@
 
     <artifactId>libraries-6</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.functionaljava</groupId>
+            <artifactId>functionaljava-java8</artifactId>
+            <version>${functionaljava.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.codepoetics</groupId>
+            <artifactId>protonpack</artifactId>
+            <version>${protonpack.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-streams</artifactId>
+            <version>${kafka.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+            <version>${kafka.version}</version>
+            <classifier>test</classifier>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.github.resilience4j</groupId>
+            <artifactId>resilience4j-circuitbreaker</artifactId>
+            <version>${resilience4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.resilience4j</groupId>
+            <artifactId>resilience4j-bulkhead</artifactId>
+            <version>${resilience4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.resilience4j</groupId>
+            <artifactId>resilience4j-retry</artifactId>
+            <version>${resilience4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.resilience4j</groupId>
+            <artifactId>resilience4j-timelimiter</artifactId>
+            <version>${resilience4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup</groupId>
+            <artifactId>javapoet</artifactId>
+            <version>${javapoet.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mockftpserver</groupId>
+            <artifactId>MockFtpServer</artifactId>
+            <version>${mockftpserver.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Reflections -->
+        <dependency>
+            <groupId>org.reflections</groupId>
+            <artifactId>reflections</artifactId>
+            <version>${reflections.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>${commons-net.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commonsio.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <kafka.version>2.0.0</kafka.version>
+        <javapoet.version>1.10.0</javapoet.version>
+        <reflections.version>0.9.11</reflections.version>
+        <mockftpserver.version>2.7.1</mockftpserver.version>
+        <functionaljava.version>4.8.1</functionaljava.version>
+        <resilience4j.version>0.12.1</resilience4j.version>
+        <protonpack.version>1.15</protonpack.version>
+        <commons-net.version>3.6</commons-net.version>
+        <assertj.version>3.6.2</assertj.version>
+        <commonsio.version>2.6</commonsio.version>
+    </properties>
+
 
 </project>
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
similarity index 96%
rename from libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
rename to libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
index eaa201d1ba..e97f128b30 100644
--- a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
+++ b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
@@ -1,43 +1,43 @@
-package com.baeldung.fj;
-
-import fj.F;
-import fj.F1Functions;
-import fj.Unit;
-import fj.data.IO;
-import fj.data.IOFunctions;
-
-public class FunctionalJavaIOMain {
-
-    public static IO<Unit> printLetters(final String s) {
-        return () -> {
-            for (int i = 0; i < s.length(); i++) {
-                System.out.println(s.charAt(i));
-            }
-            return Unit.unit();
-        };
-    }
-
-    public static void main(String[] args) {
-
-        F<String, IO<Unit>> printLetters = i -> printLetters(i);
-
-        IO<Unit> lowerCase = IOFunctions.stdoutPrintln("What's your first Name ?");
-
-        IO<Unit> input = IOFunctions.stdoutPrint("First Name: ");
-
-        IO<Unit> userInput = IOFunctions.append(lowerCase, input);
-
-        IO<String> readInput = IOFunctions.stdinReadLine();
-
-        F<String, String> toUpperCase = i -> i.toUpperCase();
-
-        F<String, IO<Unit>> transformInput = F1Functions.<String, IO<Unit>, String> o(printLetters).f(toUpperCase);
-
-        IO<Unit> readAndPrintResult = IOFunctions.bind(readInput, transformInput);
-
-        IO<Unit> program = IOFunctions.bind(userInput, nothing -> readAndPrintResult);
-
-        IOFunctions.toSafe(program).run();
-
-    }
-}
+package com.baeldung.fj;
+
+import fj.F;
+import fj.F1Functions;
+import fj.Unit;
+import fj.data.IO;
+import fj.data.IOFunctions;
+
+public class FunctionalJavaIOMain {
+
+    public static IO<Unit> printLetters(final String s) {
+        return () -> {
+            for (int i = 0; i < s.length(); i++) {
+                System.out.println(s.charAt(i));
+            }
+            return Unit.unit();
+        };
+    }
+
+    public static void main(String[] args) {
+
+        F<String, IO<Unit>> printLetters = i -> printLetters(i);
+
+        IO<Unit> lowerCase = IOFunctions.stdoutPrintln("What's your first Name ?");
+
+        IO<Unit> input = IOFunctions.stdoutPrint("First Name: ");
+
+        IO<Unit> userInput = IOFunctions.append(lowerCase, input);
+
+        IO<String> readInput = IOFunctions.stdinReadLine();
+
+        F<String, String> toUpperCase = i -> i.toUpperCase();
+
+        F<String, IO<Unit>> transformInput = F1Functions.<String, IO<Unit>, String> o(printLetters).f(toUpperCase);
+
+        IO<Unit> readAndPrintResult = IOFunctions.bind(readInput, transformInput);
+
+        IO<Unit> program = IOFunctions.bind(userInput, nothing -> readAndPrintResult);
+
+        IOFunctions.toSafe(program).run();
+
+    }
+}
diff --git a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
similarity index 96%
rename from libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
rename to libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
index c6412f2923..1a59e6c22a 100644
--- a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
+++ b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
@@ -1,48 +1,48 @@
-package com.baeldung.fj;
-
-import fj.F;
-import fj.Show;
-import fj.data.Array;
-import fj.data.List;
-import fj.data.Option;
-import fj.function.Characters;
-import fj.function.Integers;
-
-public class FunctionalJavaMain {
-
-    public static final F<Integer, Boolean> isEven = i -> i % 2 == 0;
-
-    public static void main(String[] args) {
-
-        List<Integer> fList = List.list(3, 4, 5, 6);
-        List<Boolean> evenList = fList.map(isEven);
-        Show.listShow(Show.booleanShow).println(evenList);
-
-        fList = fList.map(i -> i + 1);
-        Show.listShow(Show.intShow).println(fList);
-
-        Array<Integer> a = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
-        Array<Integer> b = a.filter(Integers.even);
-        Show.arrayShow(Show.intShow).println(b);
-
-        Array<String> array = Array.array("Welcome", "To", "baeldung");
-        Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase));
-        System.out.println(isExist);
-
-        Array<Integer> intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
-        int sum = intArray.foldLeft(Integers.add, 0);
-        System.out.println(sum);
-
-        Option<Integer> n1 = Option.some(1);
-        Option<Integer> n2 = Option.some(2);
-
-        F<Integer, Option<Integer>> f1 = i -> i % 2 == 0 ? Option.some(i + 100) : Option.none();
-
-        Option<Integer> result1 = n1.bind(f1);
-        Option<Integer> result2 = n2.bind(f1);
-
-        Show.optionShow(Show.intShow).println(result1);
-        Show.optionShow(Show.intShow).println(result2);
-    }
-
-}
+package com.baeldung.fj;
+
+import fj.F;
+import fj.Show;
+import fj.data.Array;
+import fj.data.List;
+import fj.data.Option;
+import fj.function.Characters;
+import fj.function.Integers;
+
+public class FunctionalJavaMain {
+
+    public static final F<Integer, Boolean> isEven = i -> i % 2 == 0;
+
+    public static void main(String[] args) {
+
+        List<Integer> fList = List.list(3, 4, 5, 6);
+        List<Boolean> evenList = fList.map(isEven);
+        Show.listShow(Show.booleanShow).println(evenList);
+
+        fList = fList.map(i -> i + 1);
+        Show.listShow(Show.intShow).println(fList);
+
+        Array<Integer> a = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
+        Array<Integer> b = a.filter(Integers.even);
+        Show.arrayShow(Show.intShow).println(b);
+
+        Array<String> array = Array.array("Welcome", "To", "baeldung");
+        Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase));
+        System.out.println(isExist);
+
+        Array<Integer> intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
+        int sum = intArray.foldLeft(Integers.add, 0);
+        System.out.println(sum);
+
+        Option<Integer> n1 = Option.some(1);
+        Option<Integer> n2 = Option.some(2);
+
+        F<Integer, Option<Integer>> f1 = i -> i % 2 == 0 ? Option.some(i + 100) : Option.none();
+
+        Option<Integer> result1 = n1.bind(f1);
+        Option<Integer> result2 = n2.bind(f1);
+
+        Show.optionShow(Show.intShow).println(result1);
+        Show.optionShow(Show.intShow).println(result2);
+    }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/ftp/FtpClient.java
rename to libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java
diff --git a/libraries/src/main/java/com/baeldung/javapoet/PersonGenerator.java b/libraries-6/src/main/java/com/baeldung/javapoet/PersonGenerator.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/javapoet/PersonGenerator.java
rename to libraries-6/src/main/java/com/baeldung/javapoet/PersonGenerator.java
diff --git a/libraries/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java b/libraries-6/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java
rename to libraries-6/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java
diff --git a/libraries/src/main/java/com/baeldung/kafka/TransactionalWordCount.java b/libraries-6/src/main/java/com/baeldung/kafka/TransactionalWordCount.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/kafka/TransactionalWordCount.java
rename to libraries-6/src/main/java/com/baeldung/kafka/TransactionalWordCount.java
diff --git a/libraries/src/main/java/com/baeldung/kafka/Tuple.java b/libraries-6/src/main/java/com/baeldung/kafka/Tuple.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/kafka/Tuple.java
rename to libraries-6/src/main/java/com/baeldung/kafka/Tuple.java
diff --git a/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java b/libraries-6/src/main/java/com/baeldung/reflections/ReflectionsApp.java
similarity index 97%
rename from libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java
rename to libraries-6/src/main/java/com/baeldung/reflections/ReflectionsApp.java
index 30da8ea837..4f5b6dd183 100644
--- a/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java
+++ b/libraries-6/src/main/java/com/baeldung/reflections/ReflectionsApp.java
@@ -1,71 +1,71 @@
-package com.baeldung.reflections;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Date;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.reflections.Reflections;
-import org.reflections.scanners.MethodAnnotationsScanner;
-import org.reflections.scanners.MethodParameterScanner;
-import org.reflections.scanners.ResourcesScanner;
-import org.reflections.scanners.Scanner;
-import org.reflections.scanners.SubTypesScanner;
-import org.reflections.util.ClasspathHelper;
-import org.reflections.util.ConfigurationBuilder;
-
-public class ReflectionsApp {
-
-    public Set<Class<? extends Scanner>> getReflectionsSubTypes() {
-        Reflections reflections = new Reflections("org.reflections");
-        Set<Class<? extends Scanner>> scannersSet = reflections.getSubTypesOf(Scanner.class);
-        return scannersSet;
-    }
-
-    public Set<Class<?>> getJDKFunctinalInterfaces() {
-        Reflections reflections = new Reflections("java.util.function");
-        Set<Class<?>> typesSet = reflections.getTypesAnnotatedWith(FunctionalInterface.class);
-        return typesSet;
-    }
-
-    public Set<Method> getDateDeprecatedMethods() {
-        Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
-        Set<Method> deprecatedMethodsSet = reflections.getMethodsAnnotatedWith(Deprecated.class);
-        return deprecatedMethodsSet;
-    }
-
-    @SuppressWarnings("rawtypes")
-    public Set<Constructor> getDateDeprecatedConstructors() {
-        Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
-        Set<Constructor> constructorsSet = reflections.getConstructorsAnnotatedWith(Deprecated.class);
-        return constructorsSet;
-    }
-
-    public Set<Method> getMethodsWithDateParam() {
-        Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
-        Set<Method> methodsSet = reflections.getMethodsMatchParams(Date.class);
-        return methodsSet;
-    }
-
-    public Set<Method> getMethodsWithVoidReturn() {
-        Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
-        Set<Method> methodsSet = reflections.getMethodsReturn(void.class);
-        return methodsSet;
-    }
-
-    public Set<String> getPomXmlPaths() {
-        Reflections reflections = new Reflections(new ResourcesScanner());
-        Set<String> resourcesSet = reflections.getResources(Pattern.compile(".*pom\\.xml"));
-        return resourcesSet;
-    }
-
-    public Set<Class<? extends Scanner>> getReflectionsSubTypesUsingBuilder() {
-        Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("org.reflections"))
-            .setScanners(new SubTypesScanner()));
-
-        Set<Class<? extends Scanner>> scannersSet = reflections.getSubTypesOf(Scanner.class);
-        return scannersSet;
-    }
-
-}
+package com.baeldung.reflections;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Date;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.MethodAnnotationsScanner;
+import org.reflections.scanners.MethodParameterScanner;
+import org.reflections.scanners.ResourcesScanner;
+import org.reflections.scanners.Scanner;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
+
+public class ReflectionsApp {
+
+    public Set<Class<? extends Scanner>> getReflectionsSubTypes() {
+        Reflections reflections = new Reflections("org.reflections");
+        Set<Class<? extends Scanner>> scannersSet = reflections.getSubTypesOf(Scanner.class);
+        return scannersSet;
+    }
+
+    public Set<Class<?>> getJDKFunctinalInterfaces() {
+        Reflections reflections = new Reflections("java.util.function");
+        Set<Class<?>> typesSet = reflections.getTypesAnnotatedWith(FunctionalInterface.class);
+        return typesSet;
+    }
+
+    public Set<Method> getDateDeprecatedMethods() {
+        Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
+        Set<Method> deprecatedMethodsSet = reflections.getMethodsAnnotatedWith(Deprecated.class);
+        return deprecatedMethodsSet;
+    }
+
+    @SuppressWarnings("rawtypes")
+    public Set<Constructor> getDateDeprecatedConstructors() {
+        Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
+        Set<Constructor> constructorsSet = reflections.getConstructorsAnnotatedWith(Deprecated.class);
+        return constructorsSet;
+    }
+
+    public Set<Method> getMethodsWithDateParam() {
+        Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
+        Set<Method> methodsSet = reflections.getMethodsMatchParams(Date.class);
+        return methodsSet;
+    }
+
+    public Set<Method> getMethodsWithVoidReturn() {
+        Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
+        Set<Method> methodsSet = reflections.getMethodsReturn(void.class);
+        return methodsSet;
+    }
+
+    public Set<String> getPomXmlPaths() {
+        Reflections reflections = new Reflections(new ResourcesScanner());
+        Set<String> resourcesSet = reflections.getResources(Pattern.compile(".*pom\\.xml"));
+        return resourcesSet;
+    }
+
+    public Set<Class<? extends Scanner>> getReflectionsSubTypesUsingBuilder() {
+        Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("org.reflections"))
+            .setScanners(new SubTypesScanner()));
+
+        Set<Class<? extends Scanner>> scannersSet = reflections.getSubTypesOf(Scanner.class);
+        return scannersSet;
+    }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java b/libraries-6/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
similarity index 95%
rename from libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
index 97ead07470..f79d334b23 100644
--- a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import fj.F;
@@ -96,9 +97,9 @@ public class FunctionalJavaUnitTest {
         Option<Integer> result2 = n2.bind(function);
         Option<Integer> result3 = n3.bind(function);
 
-        assertEquals(Option.none(), result1);
-        assertEquals(Option.some(102), result2);
-        assertEquals(Option.none(), result3);
+        Assert.assertEquals(Option.none(), result1);
+        Assert.assertEquals(Option.some(102), result2);
+        Assert.assertEquals(Option.none(), result3);
     }
 
     @Test
diff --git a/libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
rename to libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
diff --git a/libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
rename to libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/person/Gender.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/person/Gender.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/person/Gender.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/person/Gender.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/person/Person.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/person/Person.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/person/Person.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/person/Person.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/person/Student.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/person/Student.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/person/Student.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/person/Student.java
diff --git a/libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/libraries-6/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
rename to libraries-6/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
diff --git a/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java b/libraries-6/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
index 9a3ef0747b..b86094b6f4 100644
--- a/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
@@ -1,50 +1,50 @@
-package com.baeldung.reflections;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-import org.junit.jupiter.api.Test;
-
-public class ReflectionsUnitTest {
-
-    @Test
-    public void givenTypeThenGetAllSubTypes() {
-        ReflectionsApp reflectionsApp = new ReflectionsApp();
-        assertFalse(reflectionsApp.getReflectionsSubTypes()
-            .isEmpty());
-    }
-
-    @Test
-    public void givenTypeAndUsingBuilderThenGetAllSubTypes() {
-        ReflectionsApp reflectionsApp = new ReflectionsApp();
-        assertFalse(reflectionsApp.getReflectionsSubTypesUsingBuilder()
-            .isEmpty());
-    }
-
-    @Test
-    public void givenAnnotationThenGetAllAnnotatedMethods() {
-        ReflectionsApp reflectionsApp = new ReflectionsApp();
-        assertFalse(reflectionsApp.getDateDeprecatedMethods()
-            .isEmpty());
-    }
-
-    @Test
-    public void givenAnnotationThenGetAllAnnotatedConstructors() {
-        ReflectionsApp reflectionsApp = new ReflectionsApp();
-        assertFalse(reflectionsApp.getDateDeprecatedConstructors()
-            .isEmpty());
-    }
-
-    @Test
-    public void givenParamTypeThenGetAllMethods() {
-        ReflectionsApp reflectionsApp = new ReflectionsApp();
-        assertFalse(reflectionsApp.getMethodsWithDateParam()
-            .isEmpty());
-    }
-
-    @Test
-    public void givenReturnTypeThenGetAllMethods() {
-        ReflectionsApp reflectionsApp = new ReflectionsApp();
-        assertFalse(reflectionsApp.getMethodsWithVoidReturn()
-            .isEmpty());
-    }
-}
+package com.baeldung.reflections;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import org.junit.jupiter.api.Test;
+
+public class ReflectionsUnitTest {
+
+    @Test
+    public void givenTypeThenGetAllSubTypes() {
+        ReflectionsApp reflectionsApp = new ReflectionsApp();
+        assertFalse(reflectionsApp.getReflectionsSubTypes()
+            .isEmpty());
+    }
+
+    @Test
+    public void givenTypeAndUsingBuilderThenGetAllSubTypes() {
+        ReflectionsApp reflectionsApp = new ReflectionsApp();
+        assertFalse(reflectionsApp.getReflectionsSubTypesUsingBuilder()
+            .isEmpty());
+    }
+
+    @Test
+    public void givenAnnotationThenGetAllAnnotatedMethods() {
+        ReflectionsApp reflectionsApp = new ReflectionsApp();
+        assertFalse(reflectionsApp.getDateDeprecatedMethods()
+            .isEmpty());
+    }
+
+    @Test
+    public void givenAnnotationThenGetAllAnnotatedConstructors() {
+        ReflectionsApp reflectionsApp = new ReflectionsApp();
+        assertFalse(reflectionsApp.getDateDeprecatedConstructors()
+            .isEmpty());
+    }
+
+    @Test
+    public void givenParamTypeThenGetAllMethods() {
+        ReflectionsApp reflectionsApp = new ReflectionsApp();
+        assertFalse(reflectionsApp.getMethodsWithDateParam()
+            .isEmpty());
+    }
+
+    @Test
+    public void givenReturnTypeThenGetAllMethods() {
+        ReflectionsApp reflectionsApp = new ReflectionsApp();
+        assertFalse(reflectionsApp.getMethodsWithVoidReturn()
+            .isEmpty());
+    }
+}
diff --git a/libraries/src/test/java/com/baeldung/resilience4j/Resilience4jUnitTest.java b/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/resilience4j/Resilience4jUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java
index ced95c99cb..1d69d20bc2 100644
--- a/libraries/src/test/java/com/baeldung/resilience4j/Resilience4jUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.resilience4j;
+package com.baeldung.resilence4j;
 
 import io.github.resilience4j.bulkhead.Bulkhead;
 import io.github.resilience4j.bulkhead.BulkheadConfig;
diff --git a/libraries/src/test/resources/ftp/baz.txt b/libraries-6/src/test/resources/ftp/baz.txt
similarity index 100%
rename from libraries/src/test/resources/ftp/baz.txt
rename to libraries-6/src/test/resources/ftp/baz.txt
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 5d540f0d90..da9c9de907 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -12,18 +12,18 @@
     </parent>
 
     <dependencies>
-        <!-- https://mvnrepository.com/artifact/com.typesafe.akka/akka-actor -->
-        <dependency>
-            <groupId>com.typesafe.akka</groupId>
-            <artifactId>akka-actor_2.12</artifactId>
-            <version>${typesafe-akka.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.typesafe.akka</groupId>
-            <artifactId>akka-testkit_2.12</artifactId>
-            <version>${typesafe-akka.version}</version>
-            <scope>test</scope>
-        </dependency>
+<!--        &lt;!&ndash; https://mvnrepository.com/artifact/com.typesafe.akka/akka-actor &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.typesafe.akka</groupId>-->
+<!--            <artifactId>akka-actor_2.12</artifactId>-->
+<!--            <version>${typesafe-akka.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.typesafe.akka</groupId>-->
+<!--            <artifactId>akka-testkit_2.12</artifactId>-->
+<!--            <version>${typesafe-akka.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
         <!-- https://mvnrepository.com/artifact/org.beykery/neuroph/2.92 -->
         <dependency>
             <groupId>org.beykery</groupId>
@@ -36,16 +36,16 @@
             <artifactId>cglib</artifactId>
             <version>${cglib.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>${commons-lang3.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-net</groupId>
-            <artifactId>commons-net</artifactId>
-            <version>${commons-net.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.commons</groupId>-->
+<!--            <artifactId>commons-lang3</artifactId>-->
+<!--            <version>${commons-lang3.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>commons-net</groupId>-->
+<!--            <artifactId>commons-net</artifactId>-->
+<!--            <version>${commons-net.version}</version>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>org.javatuples</groupId>
@@ -64,11 +64,11 @@
             <version>${javers.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>io.nats</groupId>
-            <artifactId>jnats</artifactId>
-            <version>${jnats.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>io.nats</groupId>-->
+<!--            <artifactId>jnats</artifactId>-->
+<!--            <version>${jnats.version}</version>-->
+<!--        </dependency>-->
 
 <!--        <dependency>-->
 <!--            <groupId>rome</groupId>-->
@@ -228,11 +228,11 @@
             <artifactId>jool</artifactId>
             <version>${jool.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.openjdk.jmh</groupId>
-            <artifactId>jmh-core</artifactId>
-            <version>${jmh.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.openjdk.jmh</groupId>-->
+<!--            <artifactId>jmh-core</artifactId>-->
+<!--            <version>${jmh.version}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -244,18 +244,18 @@
             <artifactId>java-lsh</artifactId>
             <version>${java-lsh.version}</version>
         </dependency>
-        <dependency>
-            <groupId>au.com.dius</groupId>
-            <artifactId>pact-jvm-consumer-junit_2.11</artifactId>
-            <version>${pact.version}</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.codehaus.groovy</groupId>
-                    <artifactId>groovy-all</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>au.com.dius</groupId>-->
+<!--            <artifactId>pact-jvm-consumer-junit_2.11</artifactId>-->
+<!--            <version>${pact.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.codehaus.groovy</groupId>-->
+<!--                    <artifactId>groovy-all</artifactId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+<!--        </dependency>-->
 <!--        <dependency>-->
 <!--            <groupId>org.awaitility</groupId>-->
 <!--            <artifactId>awaitility</artifactId>-->
@@ -274,16 +274,16 @@
             <version>${org.hamcrest.java-hamcrest.version}</version>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy</artifactId>
-            <version>${bytebuddy.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy-agent</artifactId>
-            <version>${bytebuddy.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>net.bytebuddy</groupId>-->
+<!--            <artifactId>byte-buddy</artifactId>-->
+<!--            <version>${bytebuddy.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>net.bytebuddy</groupId>-->
+<!--            <artifactId>byte-buddy-agent</artifactId>-->
+<!--            <version>${bytebuddy.version}</version>-->
+<!--        </dependency>-->
 <!--        <dependency>-->
 <!--            <groupId>org.pcollections</groupId>-->
 <!--            <artifactId>pcollections</artifactId>-->
@@ -320,43 +320,43 @@
 <!--            <artifactId>jdeferred-core</artifactId>-->
 <!--            <version>${jdeferred.version}</version>-->
 <!--        </dependency>-->
-        <dependency>
-            <groupId>com.codepoetics</groupId>
-            <artifactId>protonpack</artifactId>
-            <version>${protonpack.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.functionaljava</groupId>
-            <artifactId>functionaljava-java8</artifactId>
-            <version>${functionaljava.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.github.ben-manes.caffeine</groupId>
-            <artifactId>caffeine</artifactId>
-            <version>${caffeine.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.codepoetics</groupId>-->
+<!--            <artifactId>protonpack</artifactId>-->
+<!--            <version>${protonpack.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.functionaljava</groupId>-->
+<!--            <artifactId>functionaljava-java8</artifactId>-->
+<!--            <version>${functionaljava.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.github.ben-manes.caffeine</groupId>-->
+<!--            <artifactId>caffeine</artifactId>-->
+<!--            <version>${caffeine.version}</version>-->
+<!--        </dependency>-->
 
-        <!--Java Docker API Client -->
-        <dependency>
-            <groupId>com.github.docker-java</groupId>
-            <artifactId>docker-java</artifactId>
-            <version>${docker.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-log4j12</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>jcl-over-slf4j</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>ch.qos.logback</groupId>
-                    <artifactId>logback-classic</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <!--Java Docker API Client -->
+<!--        &lt;!&ndash;Java Docker API Client &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.github.docker-java</groupId>-->
+<!--            <artifactId>docker-java</artifactId>-->
+<!--            <version>${docker.version}</version>-->
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.slf4j</groupId>-->
+<!--                    <artifactId>slf4j-log4j12</artifactId>-->
+<!--                </exclusion>-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.slf4j</groupId>-->
+<!--                    <artifactId>jcl-over-slf4j</artifactId>-->
+<!--                </exclusion>-->
+<!--                <exclusion>-->
+<!--                    <groupId>ch.qos.logback</groupId>-->
+<!--                    <artifactId>logback-classic</artifactId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;Java Docker API Client &ndash;&gt;-->
 
         <!-- google api -->
         <dependency>
@@ -364,58 +364,58 @@
             <artifactId>google-oauth-client-jetty</artifactId>
             <version>${google-api.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.kafka</groupId>
-            <artifactId>kafka-streams</artifactId>
-            <version>${kafka.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.kafka</groupId>
-            <artifactId>kafka-clients</artifactId>
-            <version>${kafka.version}</version>
-            <classifier>test</classifier>
-            <scope>test</scope>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.kafka</groupId>-->
+<!--            <artifactId>kafka-streams</artifactId>-->
+<!--            <version>${kafka.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.kafka</groupId>-->
+<!--            <artifactId>kafka-clients</artifactId>-->
+<!--            <version>${kafka.version}</version>-->
+<!--            <classifier>test</classifier>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
 
-        <!-- Atlassian Fugue -->
-        <dependency>
-            <groupId>io.atlassian.fugue</groupId>
-            <artifactId>fugue</artifactId>
-            <version>${fugue.version}</version>
-        </dependency>
+<!--        &lt;!&ndash; Atlassian Fugue &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>io.atlassian.fugue</groupId>-->
+<!--            <artifactId>fugue</artifactId>-->
+<!--            <version>${fugue.version}</version>-->
+<!--        </dependency>-->
 
-        <dependency>
-            <groupId>org.jctools</groupId>
-            <artifactId>jctools-core</artifactId>
-            <version>${jctools.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.jctools</groupId>-->
+<!--            <artifactId>jctools-core</artifactId>-->
+<!--            <version>${jctools.version}</version>-->
+<!--        </dependency>-->
 
         <!-- resilience4j -->
-        <dependency>
-            <groupId>io.github.resilience4j</groupId>
-            <artifactId>resilience4j-circuitbreaker</artifactId>
-            <version>${resilience4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.github.resilience4j</groupId>
-            <artifactId>resilience4j-bulkhead</artifactId>
-            <version>${resilience4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.github.resilience4j</groupId>
-            <artifactId>resilience4j-retry</artifactId>
-            <version>${resilience4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.github.resilience4j</groupId>
-            <artifactId>resilience4j-timelimiter</artifactId>
-            <version>${resilience4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.squareup</groupId>
-            <artifactId>javapoet</artifactId>
-            <version>${javapoet.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>io.github.resilience4j</groupId>-->
+<!--            <artifactId>resilience4j-circuitbreaker</artifactId>-->
+<!--            <version>${resilience4j.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>io.github.resilience4j</groupId>-->
+<!--            <artifactId>resilience4j-bulkhead</artifactId>-->
+<!--            <version>${resilience4j.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>io.github.resilience4j</groupId>-->
+<!--            <artifactId>resilience4j-retry</artifactId>-->
+<!--            <version>${resilience4j.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>io.github.resilience4j</groupId>-->
+<!--            <artifactId>resilience4j-timelimiter</artifactId>-->
+<!--            <version>${resilience4j.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.squareup</groupId>-->
+<!--            <artifactId>javapoet</artifactId>-->
+<!--            <version>${javapoet.version}</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>hamcrest-all</artifactId>
@@ -423,18 +423,18 @@
             <scope>test</scope>
         </dependency>
 
-        <dependency>
-            <groupId>org.mockftpserver</groupId>
-            <artifactId>MockFtpServer</artifactId>
-            <version>${mockftpserver.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- Reflections -->
-        <dependency>
-            <groupId>org.reflections</groupId>
-            <artifactId>reflections</artifactId>
-            <version>${reflections.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.mockftpserver</groupId>-->
+<!--            <artifactId>MockFtpServer</artifactId>-->
+<!--            <version>${mockftpserver.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash; Reflections &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>org.reflections</groupId>-->
+<!--            <artifactId>reflections</artifactId>-->
+<!--            <version>${reflections.version}</version>-->
+<!--        </dependency>-->
     </dependencies>
 
     <repositories>
@@ -562,7 +562,7 @@
         <javatuples.version>1.2</javatuples.version>
         <assertj.version>3.6.2</assertj.version>
         <javers.version>3.1.0</javers.version>
-        <jnats.version>1.0</jnats.version>
+<!--        <jnats.version>1.0</jnats.version>-->
 
         <neuroph.version>2.92</neuroph.version>
         <serenity.version>1.9.26</serenity.version>
@@ -574,24 +574,24 @@
         <pact.version>3.5.0</pact.version>
 <!--        <awaitility.version>3.0.0</awaitility.version>-->
         <org.hamcrest.java-hamcrest.version>2.0.0.0</org.hamcrest.java-hamcrest.version>
-        <bytebuddy.version>1.7.1</bytebuddy.version>
+<!--        <bytebuddy.version>1.7.1</bytebuddy.version>-->
 <!--        <pcollections.version>2.1.2</pcollections.version>-->
 <!--        <rome.version>1.0</rome.version>-->
 <!--        <eclipse-collections.version>8.2.0</eclipse-collections.version>-->
 <!--        <streamex.version>0.6.5</streamex.version>-->
 <!--        <vavr.version>0.9.0</vavr.version>-->
 
-        <protonpack.version>1.15</protonpack.version>
-        <caffeine.version>2.5.5</caffeine.version>
+<!--        <protonpack.version>1.15</protonpack.version>-->
+<!--        <caffeine.version>2.5.5</caffeine.version>-->
         <google-api.version>1.23.0</google-api.version>
-        <kafka.version>2.0.0</kafka.version>
-        <docker.version>3.0.14</docker.version>
+<!--        <kafka.version>2.0.0</kafka.version>-->
+<!--        <docker.version>3.0.14</docker.version>-->
 
         <jets3t-version>0.9.4.0006L</jets3t-version>
-        <jctools.version>2.1.2</jctools.version>
-        <typesafe-akka.version>2.5.11</typesafe-akka.version>
-        <resilience4j.version>0.12.1</resilience4j.version>
-        <javapoet.version>1.10.0</javapoet.version>
+<!--        <jctools.version>2.1.2</jctools.version>-->
+<!--        <typesafe-akka.version>2.5.11</typesafe-akka.version>-->
+<!--        <resilience4j.version>0.12.1</resilience4j.version>-->
+<!--        <javapoet.version>1.10.0</javapoet.version>-->
         <hamcrest-all.version>1.3</hamcrest-all.version>
         <javax.jdo.version>3.2.0-m7</javax.jdo.version>
         <datanucleus.version>5.1.1</datanucleus.version>
@@ -603,17 +603,17 @@
         <spring-mock-mvc.version>3.0.3</spring-mock-mvc.version>
         <quartz.version>2.3.0</quartz.version>
         <jool.version>0.9.12</jool.version>
-        <jmh.version>1.19</jmh.version>
+<!--        <jmh.version>1.19</jmh.version>-->
 <!--        <noexception.version>1.1.0</noexception.version>-->
 <!--        <yarg.version>2.0.4</yarg.version>-->
 <!--        <mbassador.version>1.3.1</mbassador.version>-->
 <!--        <jdeferred.version>1.2.6</jdeferred.version>-->
-        <functionaljava.version>4.8.1</functionaljava.version>
-        <fugue.version>4.5.1</fugue.version>
+<!--        <functionaljava.version>4.8.1</functionaljava.version>-->
+<!--        <fugue.version>4.5.1</fugue.version>-->
         <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
-        <mockftpserver.version>2.7.1</mockftpserver.version>
-        <commons-net.version>3.6</commons-net.version>
-        <reflections.version>0.9.11</reflections.version>
+<!--        <mockftpserver.version>2.7.1</mockftpserver.version>-->
+<!--        <commons-net.version>3.6</commons-net.version>-->
+<!--        <reflections.version>0.9.11</reflections.version>-->
     </properties>
 
 </project>

From 9bf7546d42eae5dd8d191c29ee7bb56c242120bf Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail>
Date: Wed, 29 Apr 2020 21:55:30 +0200
Subject: [PATCH 135/404] Creating TypeMap to use property mapping and
 converter class

---
 .../com/baeldung/modelmapper/MapperUtil.java  |  2 +-
 .../baeldung/modelmapper/UserPropertyMap.java | 37 -------------------
 .../modelmapper/UsersListConverter.java       | 23 ++++++++++++
 .../modelmapper/UsersListMappingUnitTest.java | 30 +++++++++------
 4 files changed, 43 insertions(+), 49 deletions(-)
 delete mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
 create mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
index 9c6a5a0320..23a549e652 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
@@ -6,7 +6,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 /**
- * This is a helper class that contains method for generic mapping of the users list.
+ * This is a helper class that contains method for custom mapping of the users list.
  * Initially, an instance of ModelMapper was created.
  *
  * @author Sasa Milenkovic
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
deleted file mode 100644
index 5b2942b158..0000000000
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.baeldung.modelmapper;
-
-import org.modelmapper.AbstractConverter;
-import org.modelmapper.Converter;
-import org.modelmapper.PropertyMap;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * UserPropertyMap class instantiates the converter to map the data from the UserList to the UsersLisDTO.
- * In the configuration method, we call a converter to do the mapping.
- *
- * @author Sasa Milenkovic
- */
-public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
-
-
-    Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
-
-
-        @Override
-        protected List<String> convert(List<User> users) {
-
-            return users
-                    .stream()
-                    .map(User::getUsername)
-                    .collect(Collectors.toList());
-        }
-    };
-
-    @Override
-    protected void configure() {
-
-        using(converter).map(source.getUsers(), destination.getUsernames());
-    }
-}
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
new file mode 100644
index 0000000000..19423713e2
--- /dev/null
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
@@ -0,0 +1,23 @@
+package com.baeldung.modelmapper;
+
+import org.modelmapper.AbstractConverter;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * UsersListConverter class map the property data from the list of users into the list of user names.
+ *
+ * @author Sasa Milenkovic
+ */
+public class UsersListConverter extends AbstractConverter<List<User>, List<String>> {
+
+    @Override
+    protected List<String> convert(List<User> users) {
+
+        return users
+                .stream()
+                .map(User::getUsername)
+                .collect(Collectors.toList());
+    }
+}
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
index 982622e1f5..a8a72b12f7 100644
--- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
@@ -4,6 +4,7 @@ import org.hamcrest.Matchers;
 import org.junit.Before;
 import org.junit.Test;
 import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeMap;
 import org.modelmapper.TypeToken;
 
 import java.util.ArrayList;
@@ -12,14 +13,12 @@ import java.util.List;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasItems;
 import static org.hamcrest.Matchers.hasProperty;
-import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
 
 /**
  * This class has test methods of mapping Integer to Character list,
- * mapping user list to DTO list using MapperUtil generic methods and Converter
+ * mapping users list to DTO list using MapperUtil custom type method and property mapping using converter class
  *
  * @author Sasa Milenkovic
  */
@@ -32,7 +31,12 @@ public class UsersListMappingUnitTest {
     public void init() {
 
         modelMapper = new ModelMapper();
-        modelMapper.addMappings(new UserPropertyMap());
+
+        TypeMap<UserList, UserListDTO> typeMap = modelMapper.createTypeMap(UserList.class, UserListDTO.class);
+
+        typeMap.addMappings(mapper -> mapper.using(new UsersListConverter())
+                .map(UserList::getUsers, UserListDTO::setUsernames));
+
         users = new ArrayList();
         users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
         users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
@@ -41,7 +45,7 @@ public class UsersListMappingUnitTest {
     }
 
     @Test
-    public void whenMapIntegerToCharList() {
+    public void whenInteger_thenMapToCharacter() {
 
         List<Integer> integers = new ArrayList<Integer>();
 
@@ -57,9 +61,9 @@ public class UsersListMappingUnitTest {
     }
 
     @Test
-    public void givenUsersList_whenUseGenericType_thenMapToDto() {
+    public void givenUsersList_whenUseGenericType_thenMapToUserDTO() {
 
-        // Mapping lists using custom type methods
+        // Mapping lists using custom (generic) type mapping
 
         List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
 
@@ -68,16 +72,20 @@ public class UsersListMappingUnitTest {
                         .and(hasProperty("email", equalTo("user1@baeldung.com")))
                         .and(hasProperty("username", equalTo("user1")))));
 
-        // Mapping lists using PropertyMap and Converter
+
+    }
+
+    @Test
+    public void givenUsersList_whenUseConverter_thenMapToUsernames() {
+
+        // Mapping lists using property mapping and converter
 
         UserList userList = new UserList();
         userList.setUsers(users);
         UserListDTO dtos = new UserListDTO();
         modelMapper.map(userList, dtos);
 
-        assertNotNull(dtos);
-        assertThat(dtos, Matchers.hasProperty("usernames"));
-        assertThat(dtos.getUsernames(), hasSize(3));
+        assertThat(dtos.getUsernames(), hasItems("user1", "user2", "user3"));
 
     }
 

From 753c0ef0d0c8ac22f35964ba55889fbf3e03d33c Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Wed, 29 Apr 2020 21:55:48 +0200
Subject: [PATCH 136/404] Java-1470 Fix compilation errors and Readme files

---
 libraries-2/README.md |   2 +-
 libraries-3/README.md |   1 +
 libraries-4/README.md |   2 +-
 libraries/README.md   |  33 -----
 libraries/pom.xml     | 273 +++++-------------------------------------
 5 files changed, 32 insertions(+), 279 deletions(-)

diff --git a/libraries-2/README.md b/libraries-2/README.md
index edf513c6ee..8dae12a1cf 100644
--- a/libraries-2/README.md
+++ b/libraries-2/README.md
@@ -18,5 +18,5 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Guide to MapDB](https://www.baeldung.com/mapdb)
 - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos)
 - [JasperReports with Spring](https://www.baeldung.com/spring-jasper)
-- More articles [[<-- prev]](/libraries)
+- More articles [[<-- prev]](/libraries) [[next -->]](/libraries-3)
 
diff --git a/libraries-3/README.md b/libraries-3/README.md
index ec433960ef..7c30cabaf1 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -17,3 +17,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
 - [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro)
 - [Quick Guide to Spring Cloud Circuit Breaker](https://www.baeldung.com/spring-cloud-circuit-breaker)
+- More articles [[<-- prev]](/libraries-2) [[next -->]](/libraries-4)
\ No newline at end of file
diff --git a/libraries-4/README.md b/libraries-4/README.md
index 9cda07bdf5..0dee9f1c1e 100644
--- a/libraries-4/README.md
+++ b/libraries-4/README.md
@@ -18,4 +18,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Guide to JDeferred](https://www.baeldung.com/jdeferred)
 - [Introduction to MBassador](https://www.baeldung.com/mbassador)
 - [Using Pairs in Java](https://www.baeldung.com/java-pairs)
-- More articles [[next -->]](/libraries-2)
+- More articles [[<-- prev]](/libraries-3) [[next -->]](/libraries-5)
diff --git a/libraries/README.md b/libraries/README.md
index 3f259e4222..b61289504c 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -19,37 +19,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
 - [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
 - [Introduction to Neuroph](https://www.baeldung.com/neuroph)
-
-#4
-- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
-- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
-- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
-- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
-- [Introduction to NoException](https://www.baeldung.com/no-exception)
-- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
-- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
-- [Guide to JDeferred](https://www.baeldung.com/jdeferred)
-- [Introduction to MBassador](https://www.baeldung.com/mbassador)
-- [Using Pairs in Java](https://www.baeldung.com/java-pairs)
-
-#5
-- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
-- [Introduction to StreamEx](https://www.baeldung.com/streamex)
-- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
-- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
-- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
-- [Introduction to jOOL](https://www.baeldung.com/jool)
-- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
-- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
-- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
-- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
-
-#6
-- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
-- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
-- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
-- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
-- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
-
-- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
 - More articles [[next -->]](/libraries-2)
diff --git a/libraries/pom.xml b/libraries/pom.xml
index da9c9de907..fee66f928d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -12,18 +12,6 @@
     </parent>
 
     <dependencies>
-<!--        &lt;!&ndash; https://mvnrepository.com/artifact/com.typesafe.akka/akka-actor &ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>com.typesafe.akka</groupId>-->
-<!--            <artifactId>akka-actor_2.12</artifactId>-->
-<!--            <version>${typesafe-akka.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>com.typesafe.akka</groupId>-->
-<!--            <artifactId>akka-testkit_2.12</artifactId>-->
-<!--            <version>${typesafe-akka.version}</version>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
         <!-- https://mvnrepository.com/artifact/org.beykery/neuroph/2.92 -->
         <dependency>
             <groupId>org.beykery</groupId>
@@ -36,16 +24,16 @@
             <artifactId>cglib</artifactId>
             <version>${cglib.version}</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.apache.commons</groupId>-->
-<!--            <artifactId>commons-lang3</artifactId>-->
-<!--            <version>${commons-lang3.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>commons-net</groupId>-->
-<!--            <artifactId>commons-net</artifactId>-->
-<!--            <version>${commons-net.version}</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>${commons-net.version}</version>
+        </dependency>
 
         <dependency>
             <groupId>org.javatuples</groupId>
@@ -63,18 +51,6 @@
             <artifactId>javers-core</artifactId>
             <version>${javers.version}</version>
         </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>io.nats</groupId>-->
-<!--            <artifactId>jnats</artifactId>-->
-<!--            <version>${jnats.version}</version>-->
-<!--        </dependency>-->
-
-<!--        <dependency>-->
-<!--            <groupId>rome</groupId>-->
-<!--            <artifactId>rome</artifactId>-->
-<!--            <version>${rome.version}</version>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>net.serenity-bdd</groupId>
             <artifactId>serenity-core</artifactId>
@@ -218,21 +194,16 @@
             <artifactId>quartz</artifactId>
             <version>${quartz.version}</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>one.util</groupId>-->
-<!--            <artifactId>streamex</artifactId>-->
-<!--            <version>${streamex.version}</version>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>org.jooq</groupId>
             <artifactId>jool</artifactId>
             <version>${jool.version}</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.openjdk.jmh</groupId>-->
-<!--            <artifactId>jmh-core</artifactId>-->
-<!--            <version>${jmh.version}</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>${jmh.version}</version>
+        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -244,119 +215,23 @@
             <artifactId>java-lsh</artifactId>
             <version>${java-lsh.version}</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>au.com.dius</groupId>-->
-<!--            <artifactId>pact-jvm-consumer-junit_2.11</artifactId>-->
-<!--            <version>${pact.version}</version>-->
-<!--            <scope>test</scope>-->
-<!--            <exclusions>-->
-<!--                <exclusion>-->
-<!--                    <groupId>org.codehaus.groovy</groupId>-->
-<!--                    <artifactId>groovy-all</artifactId>-->
-<!--                </exclusion>-->
-<!--            </exclusions>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.awaitility</groupId>-->
-<!--            <artifactId>awaitility</artifactId>-->
-<!--            <version>${awaitility.version}</version>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.awaitility</groupId>-->
-<!--            <artifactId>awaitility-proxy</artifactId>-->
-<!--            <version>${awaitility.version}</version>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commonsio.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>java-hamcrest</artifactId>
             <version>${org.hamcrest.java-hamcrest.version}</version>
             <scope>test</scope>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>net.bytebuddy</groupId>-->
-<!--            <artifactId>byte-buddy</artifactId>-->
-<!--            <version>${bytebuddy.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>net.bytebuddy</groupId>-->
-<!--            <artifactId>byte-buddy-agent</artifactId>-->
-<!--            <version>${bytebuddy.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.pcollections</groupId>-->
-<!--            <artifactId>pcollections</artifactId>-->
-<!--            <version>${pcollections.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>com.machinezoo.noexception</groupId>-->
-<!--            <artifactId>noexception</artifactId>-->
-<!--            <version>${noexception.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.eclipse.collections</groupId>-->
-<!--            <artifactId>eclipse-collections</artifactId>-->
-<!--            <version>${eclipse-collections.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>io.vavr</groupId>-->
-<!--            <artifactId>vavr</artifactId>-->
-<!--            <version>${vavr.version}</version>-->
-<!--        </dependency>-->
 
-<!--        <dependency>-->
-<!--            <groupId>com.haulmont.yarg</groupId>-->
-<!--            <artifactId>yarg</artifactId>-->
-<!--            <version>${yarg.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>net.engio</groupId>-->
-<!--            <artifactId>mbassador</artifactId>-->
-<!--            <version>${mbassador.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.jdeferred</groupId>-->
-<!--            <artifactId>jdeferred-core</artifactId>-->
-<!--            <version>${jdeferred.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>com.codepoetics</groupId>-->
-<!--            <artifactId>protonpack</artifactId>-->
-<!--            <version>${protonpack.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.functionaljava</groupId>-->
-<!--            <artifactId>functionaljava-java8</artifactId>-->
-<!--            <version>${functionaljava.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>com.github.ben-manes.caffeine</groupId>-->
-<!--            <artifactId>caffeine</artifactId>-->
-<!--            <version>${caffeine.version}</version>-->
-<!--        </dependency>-->
-
-<!--        &lt;!&ndash;Java Docker API Client &ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>com.github.docker-java</groupId>-->
-<!--            <artifactId>docker-java</artifactId>-->
-<!--            <version>${docker.version}</version>-->
-<!--            <exclusions>-->
-<!--                <exclusion>-->
-<!--                    <groupId>org.slf4j</groupId>-->
-<!--                    <artifactId>slf4j-log4j12</artifactId>-->
-<!--                </exclusion>-->
-<!--                <exclusion>-->
-<!--                    <groupId>org.slf4j</groupId>-->
-<!--                    <artifactId>jcl-over-slf4j</artifactId>-->
-<!--                </exclusion>-->
-<!--                <exclusion>-->
-<!--                    <groupId>ch.qos.logback</groupId>-->
-<!--                    <artifactId>logback-classic</artifactId>-->
-<!--                </exclusion>-->
-<!--            </exclusions>-->
-<!--        </dependency>-->
-<!--        &lt;!&ndash;Java Docker API Client &ndash;&gt;-->
+        <dependency>
+            <groupId>com.codepoetics</groupId>
+            <artifactId>protonpack</artifactId>
+            <version>${protonpack.version}</version>
+        </dependency>
 
         <!-- google api -->
         <dependency>
@@ -364,77 +239,12 @@
             <artifactId>google-oauth-client-jetty</artifactId>
             <version>${google-api.version}</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.apache.kafka</groupId>-->
-<!--            <artifactId>kafka-streams</artifactId>-->
-<!--            <version>${kafka.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.kafka</groupId>-->
-<!--            <artifactId>kafka-clients</artifactId>-->
-<!--            <version>${kafka.version}</version>-->
-<!--            <classifier>test</classifier>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
-
-<!--        &lt;!&ndash; Atlassian Fugue &ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>io.atlassian.fugue</groupId>-->
-<!--            <artifactId>fugue</artifactId>-->
-<!--            <version>${fugue.version}</version>-->
-<!--        </dependency>-->
-
-<!--        <dependency>-->
-<!--            <groupId>org.jctools</groupId>-->
-<!--            <artifactId>jctools-core</artifactId>-->
-<!--            <version>${jctools.version}</version>-->
-<!--        </dependency>-->
-
-        <!-- resilience4j -->
-<!--        <dependency>-->
-<!--            <groupId>io.github.resilience4j</groupId>-->
-<!--            <artifactId>resilience4j-circuitbreaker</artifactId>-->
-<!--            <version>${resilience4j.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>io.github.resilience4j</groupId>-->
-<!--            <artifactId>resilience4j-bulkhead</artifactId>-->
-<!--            <version>${resilience4j.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>io.github.resilience4j</groupId>-->
-<!--            <artifactId>resilience4j-retry</artifactId>-->
-<!--            <version>${resilience4j.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>io.github.resilience4j</groupId>-->
-<!--            <artifactId>resilience4j-timelimiter</artifactId>-->
-<!--            <version>${resilience4j.version}</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>com.squareup</groupId>-->
-<!--            <artifactId>javapoet</artifactId>-->
-<!--            <version>${javapoet.version}</version>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>hamcrest-all</artifactId>
             <version>${hamcrest-all.version}</version>
             <scope>test</scope>
         </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>org.mockftpserver</groupId>-->
-<!--            <artifactId>MockFtpServer</artifactId>-->
-<!--            <version>${mockftpserver.version}</version>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
-<!--        &lt;!&ndash; Reflections &ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>org.reflections</groupId>-->
-<!--            <artifactId>reflections</artifactId>-->
-<!--            <version>${reflections.version}</version>-->
-<!--        </dependency>-->
     </dependencies>
 
     <repositories>
@@ -562,8 +372,6 @@
         <javatuples.version>1.2</javatuples.version>
         <assertj.version>3.6.2</assertj.version>
         <javers.version>3.1.0</javers.version>
-<!--        <jnats.version>1.0</jnats.version>-->
-
         <neuroph.version>2.92</neuroph.version>
         <serenity.version>1.9.26</serenity.version>
         <serenity.jbehave.version>1.41.0</serenity.jbehave.version>
@@ -572,26 +380,10 @@
         <jUnitParams.version>1.1.0</jUnitParams.version>
         <java-lsh.version>0.10</java-lsh.version>
         <pact.version>3.5.0</pact.version>
-<!--        <awaitility.version>3.0.0</awaitility.version>-->
         <org.hamcrest.java-hamcrest.version>2.0.0.0</org.hamcrest.java-hamcrest.version>
-<!--        <bytebuddy.version>1.7.1</bytebuddy.version>-->
-<!--        <pcollections.version>2.1.2</pcollections.version>-->
-<!--        <rome.version>1.0</rome.version>-->
-<!--        <eclipse-collections.version>8.2.0</eclipse-collections.version>-->
-<!--        <streamex.version>0.6.5</streamex.version>-->
-<!--        <vavr.version>0.9.0</vavr.version>-->
-
-<!--        <protonpack.version>1.15</protonpack.version>-->
-<!--        <caffeine.version>2.5.5</caffeine.version>-->
+        <protonpack.version>1.15</protonpack.version>
         <google-api.version>1.23.0</google-api.version>
-<!--        <kafka.version>2.0.0</kafka.version>-->
-<!--        <docker.version>3.0.14</docker.version>-->
-
         <jets3t-version>0.9.4.0006L</jets3t-version>
-<!--        <jctools.version>2.1.2</jctools.version>-->
-<!--        <typesafe-akka.version>2.5.11</typesafe-akka.version>-->
-<!--        <resilience4j.version>0.12.1</resilience4j.version>-->
-<!--        <javapoet.version>1.10.0</javapoet.version>-->
         <hamcrest-all.version>1.3</hamcrest-all.version>
         <javax.jdo.version>3.2.0-m7</javax.jdo.version>
         <datanucleus.version>5.1.1</datanucleus.version>
@@ -603,17 +395,10 @@
         <spring-mock-mvc.version>3.0.3</spring-mock-mvc.version>
         <quartz.version>2.3.0</quartz.version>
         <jool.version>0.9.12</jool.version>
-<!--        <jmh.version>1.19</jmh.version>-->
-<!--        <noexception.version>1.1.0</noexception.version>-->
-<!--        <yarg.version>2.0.4</yarg.version>-->
-<!--        <mbassador.version>1.3.1</mbassador.version>-->
-<!--        <jdeferred.version>1.2.6</jdeferred.version>-->
-<!--        <functionaljava.version>4.8.1</functionaljava.version>-->
-<!--        <fugue.version>4.5.1</fugue.version>-->
+        <jmh.version>1.19</jmh.version>
         <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
-<!--        <mockftpserver.version>2.7.1</mockftpserver.version>-->
-<!--        <commons-net.version>3.6</commons-net.version>-->
-<!--        <reflections.version>0.9.11</reflections.version>-->
+        <commons-net.version>3.6</commons-net.version>
+        <commonsio.version>2.6</commonsio.version>
     </properties>
 
 </project>

From 4552da7ba7126e190234553d39e77444f63785ff Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Wed, 29 Apr 2020 22:02:31 +0200
Subject: [PATCH 137/404] Java-1470 Add new modules to main pom

---
 pom.xml | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index d481f95042..ed4b3e5b30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -497,6 +497,9 @@
                 <!-- <module>lagom</module> --> <!-- Not a maven project -->
                 <module>libraries-2</module>
                 <module>libraries-3</module>
+                <module>libraries-4</module>
+                <module>libraries-5</module>
+                <module>libraries-6</module>
                 <module>libraries-apache-commons</module>
                 <module>libraries-apache-commons-collections</module>
                 <module>libraries-apache-commons-io</module>
@@ -1012,8 +1015,8 @@
                 <module>libraries-2</module>
                 <module>libraries-3</module>
                 <module>libraries-4</module>
-<!--                <module>libraries-5</module>-->
-<!--                <module>libraries-6</module>-->
+                <module>libraries-5</module>
+                <module>libraries-6</module>
 
                 <module>libraries-apache-commons</module>
                 <module>libraries-apache-commons-collections</module>

From f8edc08ca60739e0c3bba37fc33f3a29024ceafc Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Wed, 29 Apr 2020 23:34:30 +0200
Subject: [PATCH 138/404] [ BAEL-3751 ]: Replace spotify docker plugin with JIB

---
 spring-boot-ci-cd/.travis.yml |  2 +-
 spring-boot-ci-cd/pom.xml     | 28 ++++++++++------------------
 2 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/spring-boot-ci-cd/.travis.yml b/spring-boot-ci-cd/.travis.yml
index 46333d2680..8467e11408 100644
--- a/spring-boot-ci-cd/.travis.yml
+++ b/spring-boot-ci-cd/.travis.yml
@@ -10,7 +10,7 @@ before_install:
 
 script:
   - ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent install
-  - ./mvnw heroku:deploy -P deploy-heroku,deploy-docker
+  - ./mvnw heroku:deploy jib:build -P deploy-heroku,deploy-docker
 
 after_success:
   - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file
diff --git a/spring-boot-ci-cd/pom.xml b/spring-boot-ci-cd/pom.xml
index 5e32fe105e..32d0950d78 100644
--- a/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-ci-cd/pom.xml
@@ -86,25 +86,17 @@
       <build>
         <plugins>
           <plugin>
-            <groupId>com.spotify</groupId>
-            <artifactId>dockerfile-maven-plugin</artifactId>
-            <version>1.4.13</version>
-            <executions>
-              <execution>
-                <id>default</id>
-                <goals>
-                  <goal>build</goal>
-                  <goal>push</goal>
-                </goals>
-              </execution>
-            </executions>
+            <groupId>com.google.cloud.tools</groupId>
+            <artifactId>jib-maven-plugin</artifactId>
+            <version>2.2.0</version>
             <configuration>
-              <repository>lukaszrys/spring-boot-ci-cd</repository>
-              <tag>${project.version}</tag>
-              <tag>latest</tag>
-              <buildArgs>
-                <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
-              </buildArgs>
+              <to>
+                <image>registry.hub.docker.com/baeldungjib/baeldung-ci-cd-process</image>
+                <tags>
+                  <tag>${project.version}</tag>
+                  <tag>latest</tag>
+                </tags>
+              </to>
             </configuration>
           </plugin>
         </plugins>

From 2c99a832cdf6a9850790aad0b4ab69f2b6192ac0 Mon Sep 17 00:00:00 2001
From: SippingCode <55111084+SippingCode@users.noreply.github.com>
Date: Thu, 30 Apr 2020 08:16:05 +0200
Subject: [PATCH 139/404] Bael 3970 (#9132)

* Manual logout with Spring Security
- Basic manual logout
- logout with Clear Data Site Header

* Add missing annotation for controller. Change mapping URL value.

* Add intergration tests for manual logouts.

* BAEL-3970 - Add asserts on test. Fix tests names. Remove unused imports.

* BAEL-3970 - Use PostMapping annotation. Remove unnecessary information for security configuration.

* remove logout controllers

* Add multiple entrypoints configurations. Create custom handlers for different logouts (basic, cookie clearing, clear-site-data).

* Refactor configuration with lambda DSL.
---
 .../manuallogout/BasicAuthController.java     | 32 -------
 .../manuallogout/ClearSiteDataController.java | 29 ------
 .../SimpleSecurityConfiguration.java          | 89 ++++++++++++++-----
 .../ManualLogoutIntegrationTest.java          | 24 +++--
 4 files changed, 84 insertions(+), 90 deletions(-)
 delete mode 100644 spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java
 delete mode 100644 spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java

diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java
deleted file mode 100644
index 8f01940dce..0000000000
--- a/spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.manuallogout;
-
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-@Controller
-public class BasicAuthController {
-
-    @RequestMapping(value = {"/basiclogout"}, method = RequestMethod.POST)
-    public String logout(HttpServletRequest request, HttpServletResponse response) {
-        HttpSession session;
-        SecurityContextHolder.clearContext();
-        session = request.getSession(false);
-        if (session != null) {
-            session.invalidate();
-        }
-        for (Cookie cookie : request.getCookies()) {
-            String cookieName = cookie.getName();
-            Cookie cookieToDelete = new Cookie(cookieName, null);
-            cookieToDelete.setMaxAge(0);
-            response.addCookie(cookieToDelete);
-        }
-        return "redirect:/login?logout";
-    }
-}
diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java
deleted file mode 100644
index 7eef397da3..0000000000
--- a/spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.manuallogout;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.logout.HeaderWriterLogoutHandler;
-import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter;
-import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Controller
-public class ClearSiteDataController {
-
-    Directive[] SOURCE = {Directive.COOKIES, Directive.STORAGE, Directive.EXECUTION_CONTEXTS, Directive.CACHE};
-
-    @RequestMapping(value = {"/csdlogout"}, method = RequestMethod.POST)
-    public String logout(HttpServletRequest request, HttpServletResponse response) {
-        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
-        if (auth != null) {
-            ClearSiteDataHeaderWriter csdHeaderWriter = new ClearSiteDataHeaderWriter(SOURCE);
-            new HeaderWriterLogoutHandler(csdHeaderWriter).logout(request, response, auth);
-        }
-        return "redirect:/login?logout";
-    }
-}
diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java
index 6f14f6fca2..63394b64f2 100644
--- a/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java
+++ b/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java
@@ -1,39 +1,80 @@
 package com.baeldung.manuallogout;
 
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler;
+import org.springframework.security.web.authentication.logout.HeaderWriterLogoutHandler;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+import org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices;
+import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter;
+
+import javax.servlet.http.Cookie;
+
+import static org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive.*;
 
 @Configuration
 @EnableWebSecurity
-public class SimpleSecurityConfiguration extends WebSecurityConfigurerAdapter {
+public class SimpleSecurityConfiguration {
 
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
-        http.formLogin()
-                .loginProcessingUrl("/login")
-                .loginPage("/login")
-                .usernameParameter("username")
-                .passwordParameter("password")
-                .defaultSuccessUrl("/")
-                .failureUrl("/login?error");
+    @Order(3)
+    @Configuration
+    public static class DefaultLogoutConfiguration extends WebSecurityConfigurerAdapter {
+        @Override
+        protected void configure(HttpSecurity http) throws Exception {
+            http
+                    .antMatcher("/basic/**")
+                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
+                    .logout(logout -> logout
+                            .logoutUrl("/basic/basiclogout")
+                            .addLogoutHandler(new SecurityContextLogoutHandler())
+                            .addLogoutHandler(new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY))
+                    );
+        }
     }
 
-    @Override
-    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
-        auth.inMemoryAuthentication()
-                .withUser("user")
-                .password("password")
-                .roles("USER")
-                .and()
-                .withUser("manager")
-                .password("password")
-                .credentialsExpired(true)
-                .accountExpired(true)
-                .accountLocked(true)
-                .authorities("WRITE_PRIVILEGES", "READ_PRIVILEGES")
-                .roles("MANAGER");
+    @Order(2)
+    @Configuration
+    public static class AllCookieClearingLogoutConfiguration extends WebSecurityConfigurerAdapter {
+        @Override
+        protected void configure(HttpSecurity http) throws Exception {
+            http
+                    .antMatcher("/cookies/**")
+                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
+                    .logout(logout -> logout
+                            .logoutUrl("/cookies/cookielogout")
+                            .addLogoutHandler(new SecurityContextLogoutHandler())
+                            .addLogoutHandler((request, response, auth) -> {
+                                        for (Cookie cookie : request.getCookies()) {
+                                            String cookieName = cookie.getName();
+                                            Cookie cookieToDelete = new Cookie(cookieName, null);
+                                            cookieToDelete.setMaxAge(0);
+                                            response.addCookie(cookieToDelete);
+                                        }
+                                    }
+                            ));
+        }
+    }
+
+    @Order(1)
+    @Configuration
+    public static class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter {
+
+        private static final ClearSiteDataHeaderWriter.Directive[] SOURCE =
+                { CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS };
+
+        @Override
+        protected void configure(HttpSecurity http) throws Exception {
+            http
+                    .antMatcher("/csd/**")
+                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
+                    .logout(logout -> logout
+                            .logoutUrl("/csd/csdlogout")
+                            .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE)))
+                    );
+        }
     }
 }
diff --git a/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java b/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java
index a64cb82910..09e7daf877 100644
--- a/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java
+++ b/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java
@@ -7,6 +7,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpSession;
 import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
 
@@ -36,7 +37,22 @@ public class ManualLogoutIntegrationTest {
 
     @WithMockUser(value = "spring")
     @Test
-    public void givenLoggedUserWhenUserLogoutThenSessionCleared() throws Exception {
+    public void givenLoggedUserWhenUserLogoutThenSessionClearedAndNecessaryCookieCleared() throws Exception {
+
+        MockHttpServletRequest requestStateAfterLogout = this.mockMvc.perform(post("/basic/basiclogout").secure(true).with(csrf()))
+                .andExpect(status().is3xxRedirection())
+                .andExpect(unauthenticated())
+                .andExpect(cookie().maxAge(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, 0))
+                .andReturn()
+                .getRequest();
+
+        HttpSession sessionStateAfterLogout = requestStateAfterLogout.getSession();
+        assertNull(sessionStateAfterLogout.getAttribute(ATTRIBUTE_NAME));
+    }
+
+    @WithMockUser(value = "spring")
+    @Test
+    public void givenLoggedUserWhenUserLogoutThenSessionClearedAndAllCookiesCleared() throws Exception {
 
         MockHttpSession session = new MockHttpSession();
         session.setAttribute(ATTRIBUTE_NAME, ATTRIBUTE_VALUE);
@@ -44,7 +60,7 @@ public class ManualLogoutIntegrationTest {
         Cookie randomCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
         randomCookie.setMaxAge(EXPIRY); // 10 minutes
 
-        MockHttpServletRequest requestStateAfterLogout = this.mockMvc.perform(post("/basiclogout").secure(true).with(csrf()).session(session).cookie(randomCookie))
+        MockHttpServletRequest requestStateAfterLogout = this.mockMvc.perform(post("/cookies/cookielogout").secure(true).with(csrf()).session(session).cookie(randomCookie))
                 .andExpect(status().is3xxRedirection())
                 .andExpect(unauthenticated())
                 .andExpect(cookie().maxAge(COOKIE_NAME, 0))
@@ -53,15 +69,13 @@ public class ManualLogoutIntegrationTest {
 
         HttpSession sessionStateAfterLogout = requestStateAfterLogout.getSession();
         assertNull(sessionStateAfterLogout.getAttribute(ATTRIBUTE_NAME));
-
-
     }
 
     @WithMockUser(value = "spring")
     @Test
     public void givenLoggedUserWhenUserLogoutThenClearDataSiteHeaderPresent() throws Exception {
 
-        this.mockMvc.perform(post("/csdlogout").secure(true).with(csrf()))
+        this.mockMvc.perform(post("/csd/csdlogout").secure(true).with(csrf()))
                 .andDo(print())
                 .andExpect(status().is3xxRedirection())
                 .andExpect(header().exists(CLEAR_SITE_DATA_HEADER))

From 89da31cbcebd898b84557cc38b0af546d66ff34d Mon Sep 17 00:00:00 2001
From: Kamlesh Kumar <kamleshkr@users.noreply.github.com>
Date: Thu, 30 Apr 2020 17:48:30 +0530
Subject: [PATCH 140/404] BAEL-3837: Java Deadlock and Livelock (#8943)

---
 .../deadlockAndLivelock/DeadlockExample.java  | 60 +++++++++++++
 .../deadlockAndLivelock/LivelockExample.java  | 86 +++++++++++++++++++
 2 files changed, 146 insertions(+)
 create mode 100644 core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/DeadlockExample.java
 create mode 100644 core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/LivelockExample.java

diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/DeadlockExample.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/DeadlockExample.java
new file mode 100644
index 0000000000..bcdaf302ea
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/DeadlockExample.java
@@ -0,0 +1,60 @@
+package com.baeldung.deadlockAndLivelock;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class DeadlockExample {
+
+    private Lock lock1 = new ReentrantLock(true);
+    private Lock lock2 = new ReentrantLock(true);
+
+    public static void main(String[] args) {
+        DeadlockExample deadlock = new DeadlockExample();
+        new Thread(deadlock::operation1, "T1").start();
+        new Thread(deadlock::operation2, "T2").start();
+
+    }
+
+    public void operation1() {
+        lock1.lock();
+        print("lock1 acquired, waiting to acquire lock2.");
+        sleep(50);
+
+        lock2.lock();
+        print("lock2 acquired");
+
+        print("executing first operation.");
+
+        lock2.unlock();
+        lock1.unlock();
+
+    }
+
+    public void operation2() {
+        lock2.lock();
+        print("lock2 acquired, waiting to acquire lock1.");
+        sleep(50);
+
+        lock1.lock();
+        print("lock1 acquired");
+
+        print("executing second operation.");
+
+        lock1.unlock();
+        lock2.unlock();
+    }
+
+    public void print(String message) {
+        System.out.println("Thread " + Thread.currentThread()
+            .getName() + ": " + message);
+    }
+
+    public void sleep(long millis) {
+        try {
+            Thread.sleep(millis);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/LivelockExample.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/LivelockExample.java
new file mode 100644
index 0000000000..b0d66a92c2
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/deadlockAndLivelock/LivelockExample.java
@@ -0,0 +1,86 @@
+package com.baeldung.deadlockAndLivelock;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class LivelockExample {
+
+    private Lock lock1 = new ReentrantLock(true);
+    private Lock lock2 = new ReentrantLock(true);
+
+    public static void main(String[] args) {
+        LivelockExample livelock = new LivelockExample();
+        new Thread(livelock::operation1, "T1").start();
+        new Thread(livelock::operation2, "T2").start();
+
+    }
+
+    public void operation1() {
+        while (true) {
+            tryLock(lock1, 50);
+            print("lock1 acquired, trying to acquire lock2.");
+            sleep(50);
+
+            if (tryLock(lock2)) {
+                print("lock2 acquired.");
+            } else {
+                print("cannot acquire lock2, releasing lock1.");
+                lock1.unlock();
+                continue;
+            }
+
+            print("executing first operation.");
+            break;
+        }
+        lock2.unlock();
+        lock1.unlock();
+    }
+
+    public void operation2() {
+        while (true) {
+            tryLock(lock2, 50);
+            print("lock2 acquired, trying to acquire lock1.");
+            sleep(50);
+
+            if (tryLock(lock1)) {
+                print("lock1 acquired.");
+            } else {
+                print("cannot acquire lock1, releasing lock2.");
+                lock2.unlock();
+                continue;
+            }
+
+            print("executing second operation.");
+            break;
+        }
+        lock1.unlock();
+        lock2.unlock();
+    }
+
+    public void print(String message) {
+        System.out.println("Thread " + Thread.currentThread()
+            .getName() + ": " + message);
+    }
+
+    public void sleep(long millis) {
+        try {
+            Thread.sleep(millis);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void tryLock(Lock lock, long millis) {
+        try {
+            lock.tryLock(10, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public boolean tryLock(Lock lock) {
+        return lock.tryLock();
+    }
+
+}

From 4bb9f166b6df24f11549f9f2627aaf26fbb9e7b6 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Sun, 19 Apr 2020 21:02:17 +0200
Subject: [PATCH 141/404] Source project for the draft article

---
 model-mapper/src/Main.java                    | 58 +++++++++++++++
 model-mapper/src/com/baeldung/model/User.java | 70 +++++++++++++++++++
 .../src/com/baeldung/model/UserDTO.java       | 49 +++++++++++++
 .../src/com/baeldung/model/UserList.java      | 21 ++++++
 .../src/com/baeldung/util/MapperUtil.java     | 47 +++++++++++++
 .../com/baeldung/util/UserPropertyMap.java    | 36 ++++++++++
 6 files changed, 281 insertions(+)
 create mode 100644 model-mapper/src/Main.java
 create mode 100644 model-mapper/src/com/baeldung/model/User.java
 create mode 100644 model-mapper/src/com/baeldung/model/UserDTO.java
 create mode 100644 model-mapper/src/com/baeldung/model/UserList.java
 create mode 100644 model-mapper/src/com/baeldung/util/MapperUtil.java
 create mode 100644 model-mapper/src/com/baeldung/util/UserPropertyMap.java

diff --git a/model-mapper/src/Main.java b/model-mapper/src/Main.java
new file mode 100644
index 0000000000..a6deb49168
--- /dev/null
+++ b/model-mapper/src/Main.java
@@ -0,0 +1,58 @@
+import com.baeldung.model.User;
+import com.baeldung.model.UserDTO;
+import com.baeldung.model.UserList;
+import com.baeldung.util.MapperUtil;
+import com.baeldung.util.UserPropertyMap;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+
+public class Main {
+
+    public static void main(String[] args) {
+
+        //Instantiate ModelMapper
+
+        ModelMapper mapper = new ModelMapper();
+        mapper.addMappings(new UserPropertyMap());
+
+        // Mapping lists using TypeToken generic class
+
+        List<Integer> integers = new ArrayList<Integer>();
+
+        integers.add(1);
+        integers.add(2);
+        integers.add(3);
+
+        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {}.getType());
+
+        System.out.println("Character list: " + characters);
+
+        // Mapping lists using generic type methods
+
+        List<User> users = new ArrayList();
+        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
+        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
+        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
+
+        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
+        userDtoList.stream().map(userDto -> userDto.getEmail()).forEachOrdered(System.out::println);
+
+        // Mapping lists using PropertyMap and Converter
+
+        UserList userList = new UserList();
+        userList.setUsers(users);
+        UserDTO dto = new UserDTO();
+
+        mapper.map(userList, dto);
+        dto.getUsernames().forEach(System.out::println);
+
+    }
+}
diff --git a/model-mapper/src/com/baeldung/model/User.java b/model-mapper/src/com/baeldung/model/User.java
new file mode 100644
index 0000000000..73e4baafb5
--- /dev/null
+++ b/model-mapper/src/com/baeldung/model/User.java
@@ -0,0 +1,70 @@
+package com.baeldung.model;
+
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+public class User {
+
+    private String userId;
+    private String userName;
+    private String email;
+    private String contactNumber;
+    private String userType;
+
+    // Standard constructors, getters and setters
+
+    public User(){}
+
+    public User(String userId, String userName, String email, String contactNumber, String userType) {
+        this.userId = userId;
+        this.userName = userName;
+        this.email = email;
+        this.contactNumber = contactNumber;
+        this.userType = userType;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getContactNumber() {
+        return contactNumber;
+    }
+
+    public void setContactNumber(String contactNumber) {
+        this.contactNumber = contactNumber;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+
+}
diff --git a/model-mapper/src/com/baeldung/model/UserDTO.java b/model-mapper/src/com/baeldung/model/UserDTO.java
new file mode 100644
index 0000000000..ed056ace8c
--- /dev/null
+++ b/model-mapper/src/com/baeldung/model/UserDTO.java
@@ -0,0 +1,49 @@
+package com.baeldung.model;
+
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+public class UserDTO {
+
+    private String userId;
+    private String userName;
+    private String email;
+    private List<String> usernames;
+
+    // getters and setters
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public List<String> getUsernames() {
+        return usernames;
+    }
+
+    public void setUsernames(List<String> usernames) {
+        this.usernames = usernames;
+    }
+}
diff --git a/model-mapper/src/com/baeldung/model/UserList.java b/model-mapper/src/com/baeldung/model/UserList.java
new file mode 100644
index 0000000000..b30d5507d5
--- /dev/null
+++ b/model-mapper/src/com/baeldung/model/UserList.java
@@ -0,0 +1,21 @@
+package com.baeldung.model;
+
+import java.util.Collection;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+
+public class UserList {
+
+    private Collection<User> users;
+
+    public Collection<User> getUsers() {
+        return users;
+    }
+
+    public void setUsers(Collection<User> users) {
+        this.users = users;
+    }
+}
diff --git a/model-mapper/src/com/baeldung/util/MapperUtil.java b/model-mapper/src/com/baeldung/util/MapperUtil.java
new file mode 100644
index 0000000000..fe10b7777d
--- /dev/null
+++ b/model-mapper/src/com/baeldung/util/MapperUtil.java
@@ -0,0 +1,47 @@
+package com.baeldung.util;
+
+import org.modelmapper.ModelMapper;
+import org.modelmapper.convention.MatchingStrategies;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+public class MapperUtil {
+
+
+    private static ModelMapper modelMapper = new ModelMapper();
+
+
+    static {
+
+        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
+
+    }
+
+    private MapperUtil() {
+
+
+    }
+
+    public static <S, T> T mapTo(final S source, final Class<T> target) {
+
+        return modelMapper.map(source, target);
+    }
+
+    public static <S, T> List<T> mapList(final List<S> sourceList, final Class<T> target) {
+
+        List<T> targetList = new ArrayList<T>();
+
+        for (S source : sourceList) {
+
+            targetList.add(modelMapper.map(source, target));
+        }
+
+        return targetList;
+    }
+
+}
diff --git a/model-mapper/src/com/baeldung/util/UserPropertyMap.java b/model-mapper/src/com/baeldung/util/UserPropertyMap.java
new file mode 100644
index 0000000000..4346174440
--- /dev/null
+++ b/model-mapper/src/com/baeldung/util/UserPropertyMap.java
@@ -0,0 +1,36 @@
+package com.baeldung.util;
+
+import com.baeldung.model.User;
+import com.baeldung.model.UserDTO;
+import com.baeldung.model.UserList;
+import org.modelmapper.AbstractConverter;
+import org.modelmapper.Converter;
+import org.modelmapper.PropertyMap;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sasam0320
+ * @date 4/18/2020
+ */
+
+public class UserPropertyMap extends PropertyMap<UserList, UserDTO> {
+
+
+    Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
+
+        List<String> usernames = new ArrayList<>();
+
+        protected List<String> convert(List<User> users) {
+
+            users.forEach(user -> usernames.add(user.getUserName()));
+            return usernames;
+        }
+
+    };
+
+    @Override
+    protected void configure() {
+        using(converter).map(source.getUsers(), destination.getUsernames());
+    }
+}

From b9cbfa49c4aa8c4ff114f634b82a3514f0785d84 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Tue, 21 Apr 2020 18:46:45 +0200
Subject: [PATCH 142/404] Moving com.baeldung.modelmmaper package to
 java-collections-conversations module

---
 .../modelmapper}/UserPropertyMap.java         | 12 ++-
 .../baeldung/modelmapper/UserMappingTest.java | 85 +++++++++++++++++++
 model-mapper/src/Main.java                    | 58 -------------
 model-mapper/src/com/baeldung/model/User.java | 70 ---------------
 .../src/com/baeldung/model/UserDTO.java       | 49 -----------
 .../src/com/baeldung/model/UserList.java      | 21 -----
 .../src/com/baeldung/util/MapperUtil.java     | 47 ----------
 7 files changed, 90 insertions(+), 252 deletions(-)
 rename {model-mapper/src/com/baeldung/util => java-collections-conversions-2/src/main/java/com/baeldung/modelmapper}/UserPropertyMap.java (68%)
 create mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
 delete mode 100644 model-mapper/src/Main.java
 delete mode 100644 model-mapper/src/com/baeldung/model/User.java
 delete mode 100644 model-mapper/src/com/baeldung/model/UserDTO.java
 delete mode 100644 model-mapper/src/com/baeldung/model/UserList.java
 delete mode 100644 model-mapper/src/com/baeldung/util/MapperUtil.java

diff --git a/model-mapper/src/com/baeldung/util/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
similarity index 68%
rename from model-mapper/src/com/baeldung/util/UserPropertyMap.java
rename to java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 4346174440..9fa945ce32 100644
--- a/model-mapper/src/com/baeldung/util/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -1,8 +1,5 @@
-package com.baeldung.util;
+package com.baeldung.modelmapper;
 
-import com.baeldung.model.User;
-import com.baeldung.model.UserDTO;
-import com.baeldung.model.UserList;
 import org.modelmapper.AbstractConverter;
 import org.modelmapper.Converter;
 import org.modelmapper.PropertyMap;
@@ -11,10 +8,11 @@ import java.util.List;
 
 /**
  * @author sasam0320
- * @date 4/18/2020
+ * @description
+ * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
+ * In the configuration method, we call a converter to do the mapping.
  */
-
-public class UserPropertyMap extends PropertyMap<UserList, UserDTO> {
+public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
 
     Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
new file mode 100644
index 0000000000..44a929621b
--- /dev/null
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.modelmapper;
+
+import org.hamcrest.Matchers;
+import org.junit.Before;
+import org.junit.Test;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+
+/**
+ * @sasam0320
+ * @description
+ * This class has test methods of mapping Integer to Character list,
+ * mapping user list to DTO list using MapperUtil generic methods and Converter
+ */
+public class UserMappingTest {
+
+    private ModelMapper mapper;
+    private List<User> users;
+
+    @Before
+    public void init() {
+
+        mapper = new ModelMapper();
+        mapper.addMappings(new UserPropertyMap());
+        users = new ArrayList();
+        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
+        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
+        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
+
+    }
+
+    @Test
+    public void testMapIntegerList() {
+
+        List<Integer> integers = new ArrayList<Integer>();
+
+        integers.add(1);
+        integers.add(2);
+        integers.add(3);
+
+        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {
+        }.getType());
+
+        assertThat(characters, hasItems('1','2','3'));
+
+    }
+
+    @Test
+    public void testMapGenericTypeLists() {
+
+        // Mapping lists using generic type methods
+
+        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
+
+        assertThat(userDtoList, Matchers.<UserDTO>hasItem(
+                Matchers.both(hasProperty("userId", equalTo("b100")))
+                        .and(hasProperty("email", equalTo("user1@baeldung.com")))
+                        .and(hasProperty("userName", equalTo("user1")))));
+
+        // Mapping lists using PropertyMap and Converter
+
+        UserList userList = new UserList();
+        userList.setUsers(users);
+        UserListDTO dto = new UserListDTO();
+        mapper.map(userList, dto);
+
+        assertNotNull(dto);
+        assertThat(dto, Matchers.hasProperty("usernames"));
+        assertThat(dto.getUsernames(), hasSize(3));
+
+    }
+
+}
\ No newline at end of file
diff --git a/model-mapper/src/Main.java b/model-mapper/src/Main.java
deleted file mode 100644
index a6deb49168..0000000000
--- a/model-mapper/src/Main.java
+++ /dev/null
@@ -1,58 +0,0 @@
-import com.baeldung.model.User;
-import com.baeldung.model.UserDTO;
-import com.baeldung.model.UserList;
-import com.baeldung.util.MapperUtil;
-import com.baeldung.util.UserPropertyMap;
-import org.modelmapper.ModelMapper;
-import org.modelmapper.TypeToken;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author sasam0320
- * @date 4/18/2020
- */
-
-public class Main {
-
-    public static void main(String[] args) {
-
-        //Instantiate ModelMapper
-
-        ModelMapper mapper = new ModelMapper();
-        mapper.addMappings(new UserPropertyMap());
-
-        // Mapping lists using TypeToken generic class
-
-        List<Integer> integers = new ArrayList<Integer>();
-
-        integers.add(1);
-        integers.add(2);
-        integers.add(3);
-
-        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {}.getType());
-
-        System.out.println("Character list: " + characters);
-
-        // Mapping lists using generic type methods
-
-        List<User> users = new ArrayList();
-        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
-        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
-        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
-
-        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
-        userDtoList.stream().map(userDto -> userDto.getEmail()).forEachOrdered(System.out::println);
-
-        // Mapping lists using PropertyMap and Converter
-
-        UserList userList = new UserList();
-        userList.setUsers(users);
-        UserDTO dto = new UserDTO();
-
-        mapper.map(userList, dto);
-        dto.getUsernames().forEach(System.out::println);
-
-    }
-}
diff --git a/model-mapper/src/com/baeldung/model/User.java b/model-mapper/src/com/baeldung/model/User.java
deleted file mode 100644
index 73e4baafb5..0000000000
--- a/model-mapper/src/com/baeldung/model/User.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.baeldung.model;
-
-import java.util.List;
-
-/**
- * @author sasam0320
- * @date 4/18/2020
- */
-public class User {
-
-    private String userId;
-    private String userName;
-    private String email;
-    private String contactNumber;
-    private String userType;
-
-    // Standard constructors, getters and setters
-
-    public User(){}
-
-    public User(String userId, String userName, String email, String contactNumber, String userType) {
-        this.userId = userId;
-        this.userName = userName;
-        this.email = email;
-        this.contactNumber = contactNumber;
-        this.userType = userType;
-    }
-
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    public String getContactNumber() {
-        return contactNumber;
-    }
-
-    public void setContactNumber(String contactNumber) {
-        this.contactNumber = contactNumber;
-    }
-
-    public String getUserType() {
-        return userType;
-    }
-
-    public void setUserType(String userType) {
-        this.userType = userType;
-    }
-
-
-}
diff --git a/model-mapper/src/com/baeldung/model/UserDTO.java b/model-mapper/src/com/baeldung/model/UserDTO.java
deleted file mode 100644
index ed056ace8c..0000000000
--- a/model-mapper/src/com/baeldung/model/UserDTO.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.baeldung.model;
-
-import java.util.List;
-
-/**
- * @author sasam0320
- * @date 4/18/2020
- */
-public class UserDTO {
-
-    private String userId;
-    private String userName;
-    private String email;
-    private List<String> usernames;
-
-    // getters and setters
-
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    public List<String> getUsernames() {
-        return usernames;
-    }
-
-    public void setUsernames(List<String> usernames) {
-        this.usernames = usernames;
-    }
-}
diff --git a/model-mapper/src/com/baeldung/model/UserList.java b/model-mapper/src/com/baeldung/model/UserList.java
deleted file mode 100644
index b30d5507d5..0000000000
--- a/model-mapper/src/com/baeldung/model/UserList.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.model;
-
-import java.util.Collection;
-
-/**
- * @author sasam0320
- * @date 4/18/2020
- */
-
-public class UserList {
-
-    private Collection<User> users;
-
-    public Collection<User> getUsers() {
-        return users;
-    }
-
-    public void setUsers(Collection<User> users) {
-        this.users = users;
-    }
-}
diff --git a/model-mapper/src/com/baeldung/util/MapperUtil.java b/model-mapper/src/com/baeldung/util/MapperUtil.java
deleted file mode 100644
index fe10b7777d..0000000000
--- a/model-mapper/src/com/baeldung/util/MapperUtil.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.baeldung.util;
-
-import org.modelmapper.ModelMapper;
-import org.modelmapper.convention.MatchingStrategies;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author sasam0320
- * @date 4/18/2020
- */
-public class MapperUtil {
-
-
-    private static ModelMapper modelMapper = new ModelMapper();
-
-
-    static {
-
-        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
-
-    }
-
-    private MapperUtil() {
-
-
-    }
-
-    public static <S, T> T mapTo(final S source, final Class<T> target) {
-
-        return modelMapper.map(source, target);
-    }
-
-    public static <S, T> List<T> mapList(final List<S> sourceList, final Class<T> target) {
-
-        List<T> targetList = new ArrayList<T>();
-
-        for (S source : sourceList) {
-
-            targetList.add(modelMapper.map(source, target));
-        }
-
-        return targetList;
-    }
-
-}

From 4bc8c329fc8e8c247f296a1a68b2f436737ed3b1 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Tue, 21 Apr 2020 21:29:38 +0200
Subject: [PATCH 143/404] Renaming test methods and formatting

---
 .../baeldung/modelmapper/UserPropertyMap.java |  3 +-
 .../baeldung/modelmapper/UserMappingTest.java | 85 -------------------
 2 files changed, 1 insertion(+), 87 deletions(-)
 delete mode 100644 java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 9fa945ce32..3d9059c520 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -7,10 +7,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * @author sasam0320
- * @description
  * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
  * In the configuration method, we call a converter to do the mapping.
+ * @author sasam0320
  */
 public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
deleted file mode 100644
index 44a929621b..0000000000
--- a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UserMappingTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.baeldung.modelmapper;
-
-import org.hamcrest.Matchers;
-import org.junit.Before;
-import org.junit.Test;
-import org.modelmapper.ModelMapper;
-import org.modelmapper.TypeToken;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasItems;
-import static org.hamcrest.Matchers.hasProperty;
-import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
-
-
-/**
- * @sasam0320
- * @description
- * This class has test methods of mapping Integer to Character list,
- * mapping user list to DTO list using MapperUtil generic methods and Converter
- */
-public class UserMappingTest {
-
-    private ModelMapper mapper;
-    private List<User> users;
-
-    @Before
-    public void init() {
-
-        mapper = new ModelMapper();
-        mapper.addMappings(new UserPropertyMap());
-        users = new ArrayList();
-        users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER"));
-        users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER"));
-        users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN"));
-
-    }
-
-    @Test
-    public void testMapIntegerList() {
-
-        List<Integer> integers = new ArrayList<Integer>();
-
-        integers.add(1);
-        integers.add(2);
-        integers.add(3);
-
-        List<Character> characters = mapper.map(integers, new TypeToken<List<Character>>() {
-        }.getType());
-
-        assertThat(characters, hasItems('1','2','3'));
-
-    }
-
-    @Test
-    public void testMapGenericTypeLists() {
-
-        // Mapping lists using generic type methods
-
-        List<UserDTO> userDtoList = MapperUtil.mapList(users, UserDTO.class);
-
-        assertThat(userDtoList, Matchers.<UserDTO>hasItem(
-                Matchers.both(hasProperty("userId", equalTo("b100")))
-                        .and(hasProperty("email", equalTo("user1@baeldung.com")))
-                        .and(hasProperty("userName", equalTo("user1")))));
-
-        // Mapping lists using PropertyMap and Converter
-
-        UserList userList = new UserList();
-        userList.setUsers(users);
-        UserListDTO dto = new UserListDTO();
-        mapper.map(userList, dto);
-
-        assertNotNull(dto);
-        assertThat(dto, Matchers.hasProperty("usernames"));
-        assertThat(dto.getUsernames(), hasSize(3));
-
-    }
-
-}
\ No newline at end of file

From 58dc739c3efd0f03dcbae6fe9743a2f60baadab2 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Tue, 21 Apr 2020 22:26:22 +0200
Subject: [PATCH 144/404] changes in build pom.xml

---
 .../main/java/com/baeldung/modelmapper/UserPropertyMap.java   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 3d9059c520..d2c32a307d 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -3,13 +3,15 @@ package com.baeldung.modelmapper;
 import org.modelmapper.AbstractConverter;
 import org.modelmapper.Converter;
 import org.modelmapper.PropertyMap;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
  * In the configuration method, we call a converter to do the mapping.
- * @author sasam0320
+ *
+ * @author Sasa Milenkovic
  */
 public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 

From 9f0d8cf6aba2043abddb6bb2c5ef63785ffbb4d0 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Sat, 25 Apr 2020 21:57:43 +0200
Subject: [PATCH 145/404] Refactoring code in com.baeldung.modelmapper package

---
 .../java/com/baeldung/modelmapper/UserPropertyMap.java     | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index d2c32a307d..0d2ebf7b4c 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -18,14 +18,15 @@ public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
     Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
 
-        List<String> usernames = new ArrayList<>();
+        protected List<String> usernames;
 
+        @Override
         protected List<String> convert(List<User> users) {
 
-            users.forEach(user -> usernames.add(user.getUserName()));
+            usernames = new ArrayList<String>();
+            users.forEach(user -> usernames.add(user.getUsername()));
             return usernames;
         }
-
     };
 
     @Override

From c2e64bea7273cb971caa03e750a1683a7e7a0fd8 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Sun, 26 Apr 2020 18:37:31 +0200
Subject: [PATCH 146/404] Customizing Java 8 code in modemmapper package

---
 .../com/baeldung/modelmapper/UserPropertyMap.java   | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
index 0d2ebf7b4c..5b2942b158 100644
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
@@ -4,11 +4,11 @@ import org.modelmapper.AbstractConverter;
 import org.modelmapper.Converter;
 import org.modelmapper.PropertyMap;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
- * UserPropertyMap class instantiates the converter to map the data from the user list to the user name list.
+ * UserPropertyMap class instantiates the converter to map the data from the UserList to the UsersLisDTO.
  * In the configuration method, we call a converter to do the mapping.
  *
  * @author Sasa Milenkovic
@@ -18,19 +18,20 @@ public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
 
     Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
 
-        protected List<String> usernames;
 
         @Override
         protected List<String> convert(List<User> users) {
 
-            usernames = new ArrayList<String>();
-            users.forEach(user -> usernames.add(user.getUsername()));
-            return usernames;
+            return users
+                    .stream()
+                    .map(User::getUsername)
+                    .collect(Collectors.toList());
         }
     };
 
     @Override
     protected void configure() {
+
         using(converter).map(source.getUsers(), destination.getUsernames());
     }
 }

From 9e6dd6f41bbe105e52e59139c5114ce5ae1fbf40 Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail>
Date: Wed, 29 Apr 2020 21:55:30 +0200
Subject: [PATCH 147/404] Creating TypeMap to use property mapping and
 converter class

---
 .../baeldung/modelmapper/UserPropertyMap.java | 37 -------------------
 1 file changed, 37 deletions(-)
 delete mode 100644 java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java

diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java b/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
deleted file mode 100644
index 5b2942b158..0000000000
--- a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserPropertyMap.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.baeldung.modelmapper;
-
-import org.modelmapper.AbstractConverter;
-import org.modelmapper.Converter;
-import org.modelmapper.PropertyMap;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * UserPropertyMap class instantiates the converter to map the data from the UserList to the UsersLisDTO.
- * In the configuration method, we call a converter to do the mapping.
- *
- * @author Sasa Milenkovic
- */
-public class UserPropertyMap extends PropertyMap<UserList, UserListDTO> {
-
-
-    Converter<List<User>, List<String>> converter = new AbstractConverter<List<User>, List<String>>() {
-
-
-        @Override
-        protected List<String> convert(List<User> users) {
-
-            return users
-                    .stream()
-                    .map(User::getUsername)
-                    .collect(Collectors.toList());
-        }
-    };
-
-    @Override
-    protected void configure() {
-
-        using(converter).map(source.getUsers(), destination.getUsernames());
-    }
-}

From b5159c71cb937b8f41ec51761953e327111c4865 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Thu, 30 Apr 2020 16:17:05 +0200
Subject: [PATCH 148/404] Java-1470 Fix failing integration tests

---
 libraries-4/pom.xml | 5 +++++
 libraries-5/pom.xml | 7 ++++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml
index 1b2db27861..f26e7fc055 100644
--- a/libraries-4/pom.xml
+++ b/libraries-4/pom.xml
@@ -88,6 +88,11 @@
             <artifactId>javax.el-api</artifactId>
             <version>${javax.el.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.web</groupId>
+            <artifactId>javax.el</artifactId>
+            <version>2.2.4</version>
+        </dependency>
     </dependencies>
 
     <properties>
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index 41c92e54c3..63296d4a89 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -43,12 +43,12 @@
         <!-- https://mvnrepository.com/artifact/com.typesafe.akka/akka-actor -->
         <dependency>
             <groupId>com.typesafe.akka</groupId>
-            <artifactId>akka-actor_2.12</artifactId>
+            <artifactId>akka-actor_${scala.version}</artifactId>
             <version>${typesafe-akka.version}</version>
         </dependency>
         <dependency>
             <groupId>com.typesafe.akka</groupId>
-            <artifactId>akka-testkit_2.12</artifactId>
+            <artifactId>akka-testkit_${scala.version}</artifactId>
             <version>${typesafe-akka.version}</version>
             <scope>test</scope>
 
@@ -130,7 +130,8 @@
         <jool.version>0.9.12</jool.version>
         <spring.version>4.3.8.RELEASE</spring.version>
         <assertj.version>3.6.2</assertj.version>
-        <typesafe-akka.version>2.5.26</typesafe-akka.version>
+        <scala.version>2.11</scala.version>
+        <typesafe-akka.version>2.5.11</typesafe-akka.version>
         <streamex.version>0.6.5</streamex.version>
         <bytebuddy.version>1.7.1</bytebuddy.version>
         <docker.version>3.0.14</docker.version>

From cd07a21b8e3bfe637016823dd5afd2e362893e1b Mon Sep 17 00:00:00 2001
From: Sasa M <sasam0320@gmail.com>
Date: Thu, 30 Apr 2020 16:20:39 +0200
Subject: [PATCH 149/404] Add hamcrest jar dependency in parent-java build

---
 java-collections-conversions-2/pom.xml | 2 +-
 parent-java/pom.xml                    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml
index 892d73cb2b..0f7cdadeb2 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/java-collections-conversions-2/pom.xml
@@ -33,7 +33,7 @@
         </dependency>
         <dependency>
             <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-all</artifactId>
+            <artifactId>hamcrest</artifactId>
             <version>${hamcrest.version}</version>
             <scope>test</scope>
         </dependency>
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index 3b2b5f59de..baad9fecf4 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -47,7 +47,7 @@
         <jmh.version>1.19</jmh.version>
         <modelmapper.version>2.3.7</modelmapper.version>
         <junit.version>4.12</junit.version>
-        <hamcrest.version>1.3</hamcrest.version>
+        <hamcrest.version>2.2</hamcrest.version>
     </properties>
 
 </project>

From f19c4d9b5d96aff843dc3a290d62ad5b221b89e6 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Thu, 30 Apr 2020 18:11:37 +0200
Subject: [PATCH 150/404] Java-1520 Split or move algorithms-miscellaneous-5
 module

---
 algorithms-miscellaneous-5/README.md          |   8 +-
 algorithms-miscellaneous-5/pom.xml            |  14 +-
 algorithms-miscellaneous-6/README.md          |   6 +
 algorithms-miscellaneous-6/pom.xml            |  25 +++
 .../BalancedBracketsUsingDeque.java           |   0
 .../BalancedBracketsUsingString.java          |   0
 .../algorithms/caesarcipher/CaesarCipher.java |   0
 .../baeldung/algorithms/greedy/Follower.java  |   0
 .../algorithms/greedy/FollowersPath.java      |   0
 .../algorithms/greedy/GreedyAlgorithm.java    |   0
 .../algorithms/greedy/NonGreedyAlgorithm.java |   0
 .../algorithms/greedy/SocialConnector.java    |   0
 .../algorithms/greedy/SocialUser.java         |   0
 .../algorithms/kruskal/CycleDetector.java     |   0
 .../algorithms/kruskal/DisjointSetInfo.java   |   0
 .../baeldung/algorithms/kruskal/Kruskal.java  |   0
 .../algorithms/minheapmerge/HeapNode.java     |  26 +--
 .../algorithms/minheapmerge/MinHeap.java      | 176 +++++++++---------
 .../BalancedBracketsUsingDequeUnitTest.java   |   0
 .../BalancedBracketsUsingStringUnitTest.java  |   0
 .../caesarcipher/CaesarCipherUnitTest.java    |   0
 .../greedy/GreedyAlgorithmUnitTest.java       |   0
 .../algorithms/kruskal/KruskalUnitTest.java   |   0
 .../minheapmerge/MinHeapUnitTest.java         |  44 ++---
 24 files changed, 160 insertions(+), 139 deletions(-)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/Follower.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java (95%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java (96%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java (100%)
 rename {algorithms-miscellaneous-5 => algorithms-miscellaneous-6}/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java (96%)

diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md
index 6e0de7d64e..3e6eeb4c93 100644
--- a/algorithms-miscellaneous-5/README.md
+++ b/algorithms-miscellaneous-5/README.md
@@ -15,9 +15,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
 - [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray)
 - [How to Merge Two Sorted Arrays](https://www.baeldung.com/java-merge-sorted-arrays)
 - [Median of Stream of Integers using Heap](https://www.baeldung.com/java-stream-integers-median-using-heap)
-- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
-- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
-- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
-- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
-- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
-- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-4) [[next -->]](/../algorithms-miscellaneous-6)
+
diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml
index 4131e1791d..9d0326241a 100644
--- a/algorithms-miscellaneous-5/pom.xml
+++ b/algorithms-miscellaneous-5/pom.xml
@@ -21,16 +21,10 @@
             <version>${commons-codec.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-math3</artifactId>
-            <version>${commons-math3.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
-            <scope>provided</scope>
-        </dependency>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-math3</artifactId>
+        <version>${commons-math3.version}</version>
+    </dependency>
         <dependency>
             <groupId>pl.allegro.finance</groupId>
             <artifactId>tradukisto</artifactId>
diff --git a/algorithms-miscellaneous-6/README.md b/algorithms-miscellaneous-6/README.md
index 99be63d7ca..22ee51530f 100644
--- a/algorithms-miscellaneous-6/README.md
+++ b/algorithms-miscellaneous-6/README.md
@@ -2,3 +2,9 @@
 
 - [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm)
 - [Gradient Descent in Java](https://www.baeldung.com/java-gradient-descent)
+- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
+- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
+- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
+- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
+- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-5)
diff --git a/algorithms-miscellaneous-6/pom.xml b/algorithms-miscellaneous-6/pom.xml
index fda9cf10f9..0a0edcbb3f 100644
--- a/algorithms-miscellaneous-6/pom.xml
+++ b/algorithms-miscellaneous-6/pom.xml
@@ -18,10 +18,35 @@
             <artifactId>guava</artifactId>
             <version>${guava.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-commons</artifactId>
+            <version>${junit.platform.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${org.assertj.core.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>${commons-math3.version}</version>
+        </dependency>
     </dependencies>
     
     <properties>
         <guava.version>28.1-jre</guava.version>
+        <org.assertj.core.version>3.9.0</org.assertj.core.version>
+        <junit.platform.version>1.6.0</junit.platform.version>
+        <commons-math3.version>3.6.1</commons-math3.version>
     </properties>
 
 </project>
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
similarity index 95%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
index 9e8439cb87..e2e41baf4d 100644
--- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
+++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
@@ -1,13 +1,13 @@
-package com.baeldung.algorithms.minheapmerge;
-
-public class HeapNode {
-
-    int element;
-    int arrayIndex;
-    int nextElementIndex = 1;
-
-    public HeapNode(int element, int arrayIndex) {
-        this.element = element;
-        this.arrayIndex = arrayIndex;
-    }
-}
+package com.baeldung.algorithms.minheapmerge;
+
+public class HeapNode {
+
+    int element;
+    int arrayIndex;
+    int nextElementIndex = 1;
+
+    public HeapNode(int element, int arrayIndex) {
+        this.element = element;
+        this.arrayIndex = arrayIndex;
+    }
+}
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
similarity index 96%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
rename to algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
index b77ce43160..0217480e9e 100644
--- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
+++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
@@ -1,88 +1,88 @@
-package com.baeldung.algorithms.minheapmerge;
-
-public class MinHeap {
-
-    HeapNode[] heapNodes;
-
-    public MinHeap(HeapNode heapNodes[]) {
-        this.heapNodes = heapNodes;
-        heapifyFromLastLeafsParent();
-    }
-
-    void heapifyFromLastLeafsParent() {
-        int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
-        while (lastLeafsParentIndex >= 0) {
-            heapify(lastLeafsParentIndex);
-            lastLeafsParentIndex--;
-        }
-    }
-
-    void heapify(int index) {
-        int leftNodeIndex = getLeftNodeIndex(index);
-        int rightNodeIndex = getRightNodeIndex(index);
-        int smallestElementIndex = index;
-        if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
-            smallestElementIndex = leftNodeIndex;
-        }
-        if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
-            smallestElementIndex = rightNodeIndex;
-        }
-        if (smallestElementIndex != index) {
-            swap(index, smallestElementIndex);
-            heapify(smallestElementIndex);
-        }
-    }
-
-    int getParentNodeIndex(int index) {
-        return (index - 1) / 2;
-    }
-
-    int getLeftNodeIndex(int index) {
-        return (2 * index + 1);
-    }
-
-    int getRightNodeIndex(int index) {
-        return (2 * index + 2);
-    }
-
-    HeapNode getRootNode() {
-        return heapNodes[0];
-    }
-
-    void heapifyFromRoot() {
-        heapify(0);
-    }
-
-    void swap(int i, int j) {
-        HeapNode temp = heapNodes[i];
-        heapNodes[i] = heapNodes[j];
-        heapNodes[j] = temp;
-    }
-    
-    static int[] merge(int[][] array) {
-        HeapNode[] heapNodes = new HeapNode[array.length];
-        int resultingArraySize = 0;
-
-        for (int i = 0; i < array.length; i++) {
-            HeapNode node = new HeapNode(array[i][0], i);
-            heapNodes[i] = node;
-            resultingArraySize += array[i].length;
-        }
-        
-        MinHeap minHeap = new MinHeap(heapNodes);
-        int[] resultingArray = new int[resultingArraySize];
-
-        for (int i = 0; i < resultingArraySize; i++) {
-            HeapNode root = minHeap.getRootNode();
-            resultingArray[i] = root.element;
-
-            if (root.nextElementIndex < array[root.arrayIndex].length) {
-                root.element = array[root.arrayIndex][root.nextElementIndex++];
-            } else {
-                root.element = Integer.MAX_VALUE;
-            }
-            minHeap.heapifyFromRoot();
-        }
-        return resultingArray;
-    }
-}
+package com.baeldung.algorithms.minheapmerge;
+
+public class MinHeap {
+
+    HeapNode[] heapNodes;
+
+    public MinHeap(HeapNode heapNodes[]) {
+        this.heapNodes = heapNodes;
+        heapifyFromLastLeafsParent();
+    }
+
+    void heapifyFromLastLeafsParent() {
+        int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
+        while (lastLeafsParentIndex >= 0) {
+            heapify(lastLeafsParentIndex);
+            lastLeafsParentIndex--;
+        }
+    }
+
+    void heapify(int index) {
+        int leftNodeIndex = getLeftNodeIndex(index);
+        int rightNodeIndex = getRightNodeIndex(index);
+        int smallestElementIndex = index;
+        if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
+            smallestElementIndex = leftNodeIndex;
+        }
+        if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
+            smallestElementIndex = rightNodeIndex;
+        }
+        if (smallestElementIndex != index) {
+            swap(index, smallestElementIndex);
+            heapify(smallestElementIndex);
+        }
+    }
+
+    int getParentNodeIndex(int index) {
+        return (index - 1) / 2;
+    }
+
+    int getLeftNodeIndex(int index) {
+        return (2 * index + 1);
+    }
+
+    int getRightNodeIndex(int index) {
+        return (2 * index + 2);
+    }
+
+    HeapNode getRootNode() {
+        return heapNodes[0];
+    }
+
+    void heapifyFromRoot() {
+        heapify(0);
+    }
+
+    void swap(int i, int j) {
+        HeapNode temp = heapNodes[i];
+        heapNodes[i] = heapNodes[j];
+        heapNodes[j] = temp;
+    }
+    
+    static int[] merge(int[][] array) {
+        HeapNode[] heapNodes = new HeapNode[array.length];
+        int resultingArraySize = 0;
+
+        for (int i = 0; i < array.length; i++) {
+            HeapNode node = new HeapNode(array[i][0], i);
+            heapNodes[i] = node;
+            resultingArraySize += array[i].length;
+        }
+        
+        MinHeap minHeap = new MinHeap(heapNodes);
+        int[] resultingArray = new int[resultingArraySize];
+
+        for (int i = 0; i < resultingArraySize; i++) {
+            HeapNode root = minHeap.getRootNode();
+            resultingArray[i] = root.element;
+
+            if (root.nextElementIndex < array[root.arrayIndex].length) {
+                root.element = array[root.arrayIndex][root.nextElementIndex++];
+            } else {
+                root.element = Integer.MAX_VALUE;
+            }
+            minHeap.heapifyFromRoot();
+        }
+        return resultingArray;
+    }
+}
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
rename to algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
rename to algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
rename to algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java
rename to algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java
rename to algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
similarity index 96%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
rename to algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
index 80d0d20f05..f84c860dcc 100644
--- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
+++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
@@ -1,22 +1,22 @@
-package com.baeldung.algorithms.minheapmerge;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import org.junit.Test;
-
-public class MinHeapUnitTest {
-
-    private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
-    private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
-
-    @Test
-    public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
-        int[] resultArray = MinHeap.merge(inputArray);
-        
-        assertThat(resultArray.length, is(equalTo(10)));
-        assertThat(resultArray, is(equalTo(expectedArray)));
-    }
-    
-}
+package com.baeldung.algorithms.minheapmerge;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class MinHeapUnitTest {
+
+    private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
+    private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
+
+    @Test
+    public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
+        int[] resultArray = MinHeap.merge(inputArray);
+        
+        assertThat(resultArray.length, is(equalTo(10)));
+        assertThat(resultArray, is(equalTo(expectedArray)));
+    }
+    
+}

From 23bc2db643ff723e4c2d899c7dd0d1c008dc3454 Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Thu, 30 Apr 2020 18:44:05 +0200
Subject: [PATCH 151/404] [BAEL-3944] Minor changes on examples and identations

---
 .../PhoneNumbersRegexUnitTest.java            | 35 ++++++++++---------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
index f7a9d70850..ec0380c450 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
@@ -15,37 +15,38 @@ public class PhoneNumbersRegexUnitTest {
         Matcher matcher = pattern.matcher("2055550125");
         assertTrue(matcher.matches());
     }
-    
+
     @Test
-    public void whenMatchesTenDigitsNumberWhitespacesHyphen_thenCorrect() {
-        Pattern pattern = Pattern.compile("^(\\d{3}[- ]?){2}\\d{4}$");
+    public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() {
+        Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
         Matcher matcher = pattern.matcher("202 555 0125");
         assertTrue(matcher.matches());
     }
-    
+
     @Test
     public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
-        Pattern pattern = Pattern.compile("^\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
-        Matcher matcher = pattern.matcher("(202)-555-0125");
+        Pattern pattern = Pattern.compile("^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+        Matcher matcher = pattern.matcher("(202) 555-0125");
         assertTrue(matcher.matches());
     }
-    
+
     @Test
     public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
-        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$");
-        Matcher matcher = pattern.matcher("+111 (202)-555-0125");
+        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+        Matcher matcher = pattern.matcher("+111 (202) 555-0125");
         assertTrue(matcher.matches());
     }
-    
+
     @Test
     public void whenMatchesPhoneNumber_thenCorrect() {
-        String patterns = "^(\\+\\d{1,3}( )?)?\\(?\\d{3}\\)?[- ]?\\d{3}[- ]?\\d{4}$" + 
-                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + 
-                         "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
-        
-        String[] validPhoneNumbers = {"2055550125","202 555 0125", "(202)-555-0125", "+111 (202)-555-0125",
-                                      "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};
-        
+        String patterns 
+          = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"
+          + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" 
+          + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
+
+        String[] validPhoneNumbers 
+        = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};
+
         Pattern pattern = Pattern.compile(patterns);
         for(String phoneNumber : validPhoneNumbers) {
             Matcher matcher = pattern.matcher(phoneNumber);

From 5a73101deb657414252d3ddfa91cab365504c90d Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Thu, 30 Apr 2020 19:09:11 +0200
Subject: [PATCH 152/404] [BAEL-3944] Identation

---
 .../baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
index ec0380c450..afabf47baa 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
@@ -45,7 +45,7 @@ public class PhoneNumbersRegexUnitTest {
           + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
 
         String[] validPhoneNumbers 
-        = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};
+          = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};
 
         Pattern pattern = Pattern.compile(patterns);
         for(String phoneNumber : validPhoneNumbers) {

From 80caea157507e5edf3c368342ad6b97de57872e1 Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Thu, 30 Apr 2020 23:36:38 +0200
Subject: [PATCH 153/404] [ BAEL-3751] : Reformat pom.xml

---
 spring-boot-ci-cd/pom.xml | 192 +++++++++++++++++++-------------------
 1 file changed, 96 insertions(+), 96 deletions(-)

diff --git a/spring-boot-ci-cd/pom.xml b/spring-boot-ci-cd/pom.xml
index 32d0950d78..e5204d53fd 100644
--- a/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-ci-cd/pom.xml
@@ -1,107 +1,107 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>spring-boot-ci-cd</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  <name>spring-boot-ci-cd</name>
-  <packaging>jar</packaging>
-
-  <parent>
-    <groupId>com.baeldung</groupId>
-    <artifactId>parent-boot-2</artifactId>
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>spring-boot-ci-cd</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <relativePath>../parent-boot-2</relativePath>
-  </parent>
+    <name>spring-boot-ci-cd</name>
+    <packaging>jar</packaging>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-web</artifactId>
-    </dependency>
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../parent-boot-2</relativePath>
+    </parent>
 
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-actuator</artifactId>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-maven-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.jacoco</groupId>
-        <artifactId>jacoco-maven-plugin</artifactId>
-        <version>0.8.5</version>
-        <executions>
-          <execution>
-            <id>default-prepare-agent</id>
-            <goals>
-              <goal>prepare-agent</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>report</id>
-            <phase>test</phase>
-            <goals>
-              <goal>report</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+    </dependencies>
 
-  <profiles>
-    <profile>
-      <id>deploy-heroku</id>
-      <properties>
-        <maven.deploy.skip>true</maven.deploy.skip>
-      </properties>
-      <build>
+    <build>
         <plugins>
-          <plugin>
-            <groupId>com.heroku.sdk</groupId>
-            <artifactId>heroku-maven-plugin</artifactId>
-            <version>3.0.2</version>
-            <configuration>
-              <appName>spring-boot-ci-cd</appName>
-              <processTypes>
-                <web>java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar</web>
-              </processTypes>
-            </configuration>
-          </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>0.8.5</version>
+                <executions>
+                    <execution>
+                        <id>default-prepare-agent</id>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>report</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
-      </build>
-    </profile>
-    <profile>
-      <id>deploy-docker</id>
-      <properties>
-        <maven.deploy.skip>true</maven.deploy.skip>
-      </properties>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>com.google.cloud.tools</groupId>
-            <artifactId>jib-maven-plugin</artifactId>
-            <version>2.2.0</version>
-            <configuration>
-              <to>
-                <image>registry.hub.docker.com/baeldungjib/baeldung-ci-cd-process</image>
-                <tags>
-                  <tag>${project.version}</tag>
-                  <tag>latest</tag>
-                </tags>
-              </to>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>deploy-heroku</id>
+            <properties>
+                <maven.deploy.skip>true</maven.deploy.skip>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>com.heroku.sdk</groupId>
+                        <artifactId>heroku-maven-plugin</artifactId>
+                        <version>3.0.2</version>
+                        <configuration>
+                            <appName>spring-boot-ci-cd</appName>
+                            <processTypes>
+                                <web>java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar</web>
+                            </processTypes>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>deploy-docker</id>
+            <properties>
+                <maven.deploy.skip>true</maven.deploy.skip>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>com.google.cloud.tools</groupId>
+                        <artifactId>jib-maven-plugin</artifactId>
+                        <version>2.2.0</version>
+                        <configuration>
+                            <to>
+                                <image>registry.hub.docker.com/baeldungjib/baeldung-ci-cd-process</image>
+                                <tags>
+                                    <tag>${project.version}</tag>
+                                    <tag>latest</tag>
+                                </tags>
+                            </to>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 
 </project>
\ No newline at end of file

From 100c78e15b33a44a3c4733bcf3e80fc733ba6f9e Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Fri, 1 May 2020 16:34:19 +0200
Subject: [PATCH 154/404] Java-1520 Fix whitespaces in
 algorithms-miscellaneous-5 pom

---
 algorithms-miscellaneous-5/pom.xml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml
index 9d0326241a..615cf03467 100644
--- a/algorithms-miscellaneous-5/pom.xml
+++ b/algorithms-miscellaneous-5/pom.xml
@@ -21,10 +21,10 @@
             <version>${commons-codec.version}</version>
         </dependency>
         <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-math3</artifactId>
-        <version>${commons-math3.version}</version>
-    </dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>${commons-math3.version}</version>
+        </dependency>
         <dependency>
             <groupId>pl.allegro.finance</groupId>
             <artifactId>tradukisto</artifactId>

From 44cb3a230a894f86783575a92b8f5b322e26211a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samet=20Y=C4=B1lmaz?= <sametyilmazx@gmail.com>
Date: Fri, 1 May 2020 20:50:13 +0300
Subject: [PATCH 155/404] Consumer changed as DefaultConsumer.

---
 rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java b/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java
index d0612406e9..b2779a6b29 100644
--- a/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java
+++ b/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java
@@ -17,7 +17,7 @@ public class Receiver {
 
         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
 
-        Consumer consumer = new DefaultConsumer(channel) {
+        DefaultConsumer consumer = new DefaultConsumer(channel) {
             @Override
             public void handleDelivery(String consumerTag,
                                        Envelope envelope, AMQP.BasicProperties properties,

From 5bfa01ec05e0d3d9364a042c307425f370877691 Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sat, 2 May 2020 00:20:16 +0530
Subject: [PATCH 156/404] "spring-data-jpa-5 new module"

---
 .../baeldung/composite/BookApplication.java   | 12 ----
 .../com/baeldung/composite/entity/Book.java   | 47 --------------
 .../com/baeldung/composite/entity/BookId.java | 51 ---------------
 .../composite/repository/BookRepository.java  | 16 -----
 .../BookRepositoryIntegrationTest.java        | 63 -------------------
 5 files changed, 189 deletions(-)
 delete mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java
 delete mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java
 delete mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java
 delete mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java
 delete mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java

diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java
deleted file mode 100644
index 52f06058aa..0000000000
--- a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/BookApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.composite;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class BookApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(BookApplication.class);
-    }
-}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java
deleted file mode 100644
index e4f1727654..0000000000
--- a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/Book.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.baeldung.composite.entity;
-
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-
-@Entity
-public class Book {
-
-    @EmbeddedId
-    private BookId id;
-    private String genre;
-    private Integer price;
-
-    public Book() {
-    }
-
-    public Book(String author, String name, String genre, Integer price) {
-        BookId id = new BookId(author, name);
-        this.id = id;
-        this.genre = genre;
-        this.price = price;
-    }
-
-    public BookId getId() {
-        return id;
-    }
-
-    public void setId(BookId id) {
-        this.id = id;
-    }
-
-    public String getGenre() {
-        return genre;
-    }
-
-    public void setGenre(String genre) {
-        this.genre = genre;
-    }
-
-    public Integer getPrice() {
-        return price;
-    }
-
-    public void setPrice(Integer price) {
-        this.price = price;
-    }
-}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java
deleted file mode 100644
index 1524452412..0000000000
--- a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/entity/BookId.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.baeldung.composite.entity;
-
-import javax.persistence.Embeddable;
-import java.io.Serializable;
-import java.util.Objects;
-
-@Embeddable
-public class BookId implements Serializable {
-
-    private String author;
-    private String name;
-
-    public BookId() {
-    }
-
-    public BookId(String author, String name) {
-        this.author = author;
-        this.name = name;
-    }
-
-    public String getAuthor() {
-        return author;
-    }
-
-    public void setAuthor(String author) {
-        this.author = author;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-        BookId bookId = (BookId) o;
-        return Objects.equals(author, bookId.author) && Objects.equals(name, bookId.name);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(author, name);
-    }
-}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java
deleted file mode 100644
index 3c09f909f0..0000000000
--- a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/composite/repository/BookRepository.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.baeldung.composite.repository;
-
-import com.baeldung.composite.entity.Book;
-import com.baeldung.composite.entity.BookId;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface BookRepository extends JpaRepository<Book, BookId> {
-
-    List<Book> findByIdName(String name);
-
-    List<Book> findByIdAuthor(String author);
-}
diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
deleted file mode 100644
index 362950bea9..0000000000
--- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.baeldung.composite.repository;
-
-import com.baeldung.composite.BookApplication;
-import com.baeldung.composite.entity.Book;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = BookApplication.class)
-public class BookRepositoryIntegrationTest {
-
-    public static final String JAVA_101 = "Java101";
-    public static final String JANE = "Jane";
-    @Autowired
-    BookRepository repository;
-
-    @Before
-    public void setUp() {
-        Book book1 = new Book("John", JAVA_101, "Tech", 20);
-        Book book2 = new Book(JANE, JAVA_101, "Arch", 25);
-        Book book3 = new Book(JANE, "Scala101", "Tech", 23);
-
-        repository.saveAll(Arrays.asList(book1, book2, book3));
-    }
-
-    @After
-    public void tearDown() {
-        repository.deleteAll();
-    }
-
-    @Test
-    public void testFindByName() {
-        List<Book> books = repository.findByIdName(JAVA_101);
-
-        assertEquals(2, books.size());
-    }
-
-    @Test
-    public void testFindByAuthor() {
-        List<Book> books = repository.findByIdAuthor(JANE);
-
-        assertEquals(2, books.size());
-    }
-
-    @Test
-    public void testFindByGenre() {
-        List<Book> books = repository.findByIdAuthor(JANE);
-
-        assertEquals(2, books.size());
-    }
-}
\ No newline at end of file

From 8ef7cc6b81e62d42ca8afa533610cec0cf489337 Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sat, 2 May 2020 00:23:59 +0530
Subject: [PATCH 157/404] all files

---
 .../spring-data-jpa-5/README.md               | 11 ++++
 persistence-modules/spring-data-jpa-5/pom.xml | 47 ++++++++++++++
 .../baeldung/composite/BookApplication.java   | 12 ++++
 .../com/baeldung/composite/entity/Book.java   | 47 ++++++++++++++
 .../com/baeldung/composite/entity/BookId.java | 51 +++++++++++++++
 .../composite/repository/BookRepository.java  | 18 ++++++
 .../src/main/resources/application.properties |  2 +
 .../BookRepositoryIntegrationTest.java        | 64 +++++++++++++++++++
 .../resources/application-test.properties     |  2 +
 9 files changed, 254 insertions(+)
 create mode 100644 persistence-modules/spring-data-jpa-5/README.md
 create mode 100644 persistence-modules/spring-data-jpa-5/pom.xml
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/BookApplication.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/Book.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/BookId.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/repository/BookRepository.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
 create mode 100644 persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties

diff --git a/persistence-modules/spring-data-jpa-5/README.md b/persistence-modules/spring-data-jpa-5/README.md
new file mode 100644
index 0000000000..51c39f7bb0
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/README.md
@@ -0,0 +1,11 @@
+### Relevant Articles: 
+- [Derived Query Methods in Spring Data JPA Repositories](TBD)
+
+### Eclipse Config 
+After importing the project into Eclipse, you may see the following error:  
+"No persistence xml file found in project"
+
+This can be ignored: 
+- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
+Or: 
+- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator 
diff --git a/persistence-modules/spring-data-jpa-5/pom.xml b/persistence-modules/spring-data-jpa-5/pom.xml
new file mode 100644
index 0000000000..c71cec1d08
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>spring-data-jpa-5</artifactId>
+    <name>spring-data-jpa-5</name>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../../parent-boot-2</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jdbc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/BookApplication.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/BookApplication.java
new file mode 100644
index 0000000000..52f06058aa
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/BookApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.composite;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class BookApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BookApplication.class);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/Book.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/Book.java
new file mode 100644
index 0000000000..e4f1727654
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/Book.java
@@ -0,0 +1,47 @@
+package com.baeldung.composite.entity;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+@Entity
+public class Book {
+
+    @EmbeddedId
+    private BookId id;
+    private String genre;
+    private Integer price;
+
+    public Book() {
+    }
+
+    public Book(String author, String name, String genre, Integer price) {
+        BookId id = new BookId(author, name);
+        this.id = id;
+        this.genre = genre;
+        this.price = price;
+    }
+
+    public BookId getId() {
+        return id;
+    }
+
+    public void setId(BookId id) {
+        this.id = id;
+    }
+
+    public String getGenre() {
+        return genre;
+    }
+
+    public void setGenre(String genre) {
+        this.genre = genre;
+    }
+
+    public Integer getPrice() {
+        return price;
+    }
+
+    public void setPrice(Integer price) {
+        this.price = price;
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/BookId.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/BookId.java
new file mode 100644
index 0000000000..1524452412
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/entity/BookId.java
@@ -0,0 +1,51 @@
+package com.baeldung.composite.entity;
+
+import javax.persistence.Embeddable;
+import java.io.Serializable;
+import java.util.Objects;
+
+@Embeddable
+public class BookId implements Serializable {
+
+    private String author;
+    private String name;
+
+    public BookId() {
+    }
+
+    public BookId(String author, String name) {
+        this.author = author;
+        this.name = name;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        BookId bookId = (BookId) o;
+        return Objects.equals(author, bookId.author) && Objects.equals(name, bookId.name);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(author, name);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/repository/BookRepository.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/repository/BookRepository.java
new file mode 100644
index 0000000000..d5993eaf79
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/composite/repository/BookRepository.java
@@ -0,0 +1,18 @@
+package com.baeldung.composite.repository;
+
+import com.baeldung.composite.entity.Book;
+import com.baeldung.composite.entity.BookId;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface BookRepository extends JpaRepository<Book, BookId> {
+
+    List<Book> findByIdName(String name);
+
+    List<Book> findByIdAuthor(String author);
+
+    List<Book> findByGenre(String genre);
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
new file mode 100644
index 0000000000..dfc5e56e33
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+spring.jpa.show-sql=true
+
diff --git a/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..9d25acbd96
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/composite/repository/BookRepositoryIntegrationTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.composite.repository;
+
+import com.baeldung.composite.BookApplication;
+import com.baeldung.composite.entity.Book;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = BookApplication.class)
+public class BookRepositoryIntegrationTest {
+
+    public static final String JAVA_101 = "Java101";
+    public static final String JANE = "Jane";
+    public static final String TECH = "Tech";
+    @Autowired
+    BookRepository repository;
+
+    @Before
+    public void setUp() {
+        Book book1 = new Book("John", JAVA_101, TECH, 20);
+        Book book2 = new Book(JANE, JAVA_101, "Arch", 25);
+        Book book3 = new Book(JANE, "Scala101", TECH, 23);
+
+        repository.saveAll(Arrays.asList(book1, book2, book3));
+    }
+
+    @After
+    public void tearDown() {
+        repository.deleteAll();
+    }
+
+    @Test
+    public void testFindByName() {
+        List<Book> books = repository.findByIdName(JAVA_101);
+
+        assertEquals(2, books.size());
+    }
+
+    @Test
+    public void testFindByAuthor() {
+        List<Book> books = repository.findByIdAuthor(JANE);
+
+        assertEquals(2, books.size());
+    }
+
+    @Test
+    public void testFindByGenre() {
+        List<Book> books = repository.findByGenre(TECH);
+
+        assertEquals(2, books.size());
+    }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
new file mode 100644
index 0000000000..f9497c8f37
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
@@ -0,0 +1,2 @@
+spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:h2:mem:jpa3
\ No newline at end of file

From ed27094b5b53b122cbd392f43743333479fd45d8 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Fri, 1 May 2020 20:56:43 +0200
Subject: [PATCH 158/404] [JAVA-621] Got last compilation error

---
 .../com/baeldung/hashcode/application/ApplicationUnitTest.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
index 49857f355a..18b2d4d570 100644
--- a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
@@ -1,6 +1,6 @@
 package com.baeldung.hashcode.application;
 
-import com.baeldung.hashcode.entities.User;
+import com.baeldung.hashcode.standard.User;
 import org.junit.Test;
 
 import java.util.HashMap;

From 5724e188a07a73612802981271b5f367fbc858be Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sat, 2 May 2020 00:28:53 +0530
Subject: [PATCH 159/404] "updated README.md"

---
 persistence-modules/spring-data-jpa-5/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/persistence-modules/spring-data-jpa-5/README.md b/persistence-modules/spring-data-jpa-5/README.md
index 51c39f7bb0..dd4ac22e4a 100644
--- a/persistence-modules/spring-data-jpa-5/README.md
+++ b/persistence-modules/spring-data-jpa-5/README.md
@@ -1,5 +1,5 @@
 ### Relevant Articles: 
-- [Derived Query Methods in Spring Data JPA Repositories](TBD)
+- [Spring JPA @Embedded and @EmbeddedId](TBD)
 
 ### Eclipse Config 
 After importing the project into Eclipse, you may see the following error:  

From 52df2121273352051f1e620c57a78cf7f1905224 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Fri, 1 May 2020 21:34:10 +0200
Subject: [PATCH 160/404] Java-1470 Move libraries-4/5/6 to different profile

---
 pom.xml | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/pom.xml b/pom.xml
index ed4b3e5b30..171c652994 100644
--- a/pom.xml
+++ b/pom.xml
@@ -497,9 +497,6 @@
                 <!-- <module>lagom</module> --> <!-- Not a maven project -->
                 <module>libraries-2</module>
                 <module>libraries-3</module>
-                <module>libraries-4</module>
-                <module>libraries-5</module>
-                <module>libraries-6</module>
                 <module>libraries-apache-commons</module>
                 <module>libraries-apache-commons-collections</module>
                 <module>libraries-apache-commons-io</module>
@@ -814,6 +811,9 @@
                 <module>jws</module>
 
                 <module>libraries</module> <!-- very long running -->
+                <module>libraries-4</module>
+                <module>libraries-5</module>
+                <module>libraries-6</module>
 
                 <module>vaadin</module>
                 <module>vavr</module>
@@ -1014,9 +1014,6 @@
                 <!-- <module>lagom</module> --> <!-- Not a maven project -->
                 <module>libraries-2</module>
                 <module>libraries-3</module>
-                <module>libraries-4</module>
-                <module>libraries-5</module>
-                <module>libraries-6</module>
 
                 <module>libraries-apache-commons</module>
                 <module>libraries-apache-commons-collections</module>
@@ -1317,6 +1314,9 @@
                 <module>jws</module>
 
                 <module>libraries</module> <!-- very long running -->
+                <module>libraries-4</module>
+                <module>libraries-5</module>
+                <module>libraries-6</module>
 
                 <module>vaadin</module>
                 <module>vavr</module>

From 9797d3a4fcce87047d2402efc1585ece9cf1147c Mon Sep 17 00:00:00 2001
From: Aaron Juarez <aarjuamtz@gmail.com>
Date: Fri, 1 May 2020 15:35:29 -0400
Subject: [PATCH 161/404] Bael-3966: code fixes after editor review (#9203)

---
 .../core-java-lang-operators/pom.xml          |  6 +++++
 .../com/baeldung/objectclass/Borrower.java    |  0
 .../java/com/baeldung/objectclass/Lender.java |  0
 .../java/com/baeldung/objectclass/User.java   |  0
 .../objectclass/CreditAppUnitTest.java        | 23 +++++++++++++++----
 5 files changed, 25 insertions(+), 4 deletions(-)
 rename core-java-modules/{core-java => core-java-lang-operators}/src/main/java/com/baeldung/objectclass/Borrower.java (100%)
 rename core-java-modules/{core-java => core-java-lang-operators}/src/main/java/com/baeldung/objectclass/Lender.java (100%)
 rename core-java-modules/{core-java => core-java-lang-operators}/src/main/java/com/baeldung/objectclass/User.java (100%)
 rename core-java-modules/{core-java => core-java-lang-operators}/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java (74%)

diff --git a/core-java-modules/core-java-lang-operators/pom.xml b/core-java-modules/core-java-lang-operators/pom.xml
index b95caa81b8..09fbce4b3c 100644
--- a/core-java-modules/core-java-lang-operators/pom.xml
+++ b/core-java-modules/core-java-lang-operators/pom.xml
@@ -17,6 +17,12 @@
     </parent>
 
     <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <!-- test scoped -->
         <dependency>
             <groupId>org.assertj</groupId>
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/objectclass/Borrower.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/objectclass/Borrower.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/objectclass/Lender.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/objectclass/Lender.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/objectclass/User.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/objectclass/User.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java
similarity index 74%
rename from core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java
index 8330ddbac5..bba30adcdb 100644
--- a/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class CreditAppUnitTest {
@@ -40,13 +41,28 @@ public class CreditAppUnitTest {
         assertNotNull(lender);
     }
     
+    @Ignore
+    @Test
+    public void givenBorrower_whenDoubleOrNotString_thenRequestLoan() {
+        Borrower borrower = new Borrower();
+        double amount = 100.0;
+        
+        /*if(amount instanceof Double) { // Compilation error, no autoboxing
+            borrower.requestLoan(amount);
+        }
+        
+        if(!(amount instanceof String)) { // Compilation error, incompatible operands
+            borrower.requestLoan(amount);
+        }*/
+        
+    }
+    
     @Test
     public void givenBorrower_whenLoanAmountIsDouble_thenRequestLoan() {
         Borrower borrower = new Borrower();
         double amount = 100.0;
         
-        //if(amount instanceof Double) // Compilation error, no autoboxing
-        if(Double.class.isInstance(amount)) {
+        if(Double.class.isInstance(amount)) { // No compilation error
             borrower.requestLoan(amount);
         }
         assertEquals(100, borrower.getTotalLoanAmount());
@@ -57,8 +73,7 @@ public class CreditAppUnitTest {
         Borrower borrower = new Borrower();
         Double amount = 100.0;
         
-        //if(amount instanceof String) // Compilation error, incompatible operands
-        if(!String.class.isInstance(amount)) {
+        if(!String.class.isInstance(amount)) { // No compilation error
             borrower.requestLoan(amount);
         }
         assertEquals(100, borrower.getTotalLoanAmount());

From c10208b4d926ad4ee6795082cecba8c3228415bc Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Fri, 1 May 2020 19:48:38 -0400
Subject: [PATCH 162/404] Bael 3893 - Code review updates

---
 .../awsappsync/AppSyncClientHelper.java       |  2 +-
 .../awsappsync/AwsAppSyncApplication.java     |  6 +-
 .../AwsAppSyncApplicationTests.java           | 77 ++++++++++++-------
 pom.xml                                       |  2 +-
 4 files changed, 53 insertions(+), 34 deletions(-)

diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
index fcbc0aa275..b310e60748 100644
--- a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
@@ -11,7 +11,7 @@ import java.util.Map;
 public class AppSyncClientHelper {
 
     static String apiUrl = "https://m4i3b6icrrb7livfbypfspiifi.appsync-api.us-east-2.amazonaws.com";
-    static String apiKey = "da2-es2s6oj4mzhbxk5yu26ss2ruj4";
+    static String apiKey = "da2-bm4rpatkkrc5jfyhvvq7itjeke";
     static String API_KEY_HEADER = "x-api-key";
 
     public static WebClient.ResponseSpec getResponseBodySpec(Map<String, Object> requestBody) {
diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
index ae012c91a5..19fffd2994 100644
--- a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AwsAppSyncApplication.java
@@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class AwsAppSyncApplication {
 
-	public static void main(String[] args) {
-		SpringApplication.run(AwsAppSyncApplication.class, args);
-	}
+    public static void main(String[] args) {
+        SpringApplication.run(AwsAppSyncApplication.class, args);
+    }
 
 }
diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
index cd14bcd5b2..6e94651789 100644
--- a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -12,42 +12,61 @@ import static org.junit.jupiter.api.Assertions.*;
 @SpringBootTest
 class AwsAppSyncApplicationTests {
 
-	@Test
-	void givenGraphQuery_whenListEvents_thenReturnAllEvents() {
+    @Test
+    void givenGraphQuery_whenListEvents_thenReturnAllEvents() {
 
-		Map<String, Object> requestBody = new HashMap<>();
-		requestBody.put("query", "query ListEvents { listEvents { items { id name where when description } } }");
-		requestBody.put("variables", "");
-		requestBody.put("operationName", "ListEvents");
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("query", "query ListEvents {" +
+                "  listEvents {" +
+                "    items {" +
+                "      id" +
+                "      name" +
+                "      where" +
+                "      when" +
+                "      description" +
+                "    }" +
+                "  }" +
+                "}");
+        requestBody.put("variables", "");
+        requestBody.put("operationName", "ListEvents");
 
-		String bodyString = AppSyncClientHelper.getResponseBodySpec(requestBody)
-				.bodyToMono(String.class).block();
+        String bodyString = AppSyncClientHelper.getResponseBodySpec(requestBody)
+                .bodyToMono(String.class).block();
 
-		assertNotNull(bodyString);
-		assertTrue(bodyString.contains("My First Event"));
-		assertTrue(bodyString.contains("where"));
-		assertTrue(bodyString.contains("when"));
-	}
+        assertNotNull(bodyString);
+        assertTrue(bodyString.contains("My First Event"));
+        assertTrue(bodyString.contains("where"));
+        assertTrue(bodyString.contains("when"));
+    }
 
-	@Test
-	void givenGraphAdd_whenMutation_thenReturnIdNameDesc() {
+    @Test
+    void givenGraphAdd_whenMutation_thenReturnIdNameDesc() {
 
-		String queryString = "mutation add { createEvent( name:\"My added GraphQL event\" where:\"Day 2\"" +
-						" when:\"Saturday night\" description:\"Studying GraphQL\" ){ id name description } }";
+        String queryString = "mutation add {" +
+                "    createEvent(" +
+                "        name:\"My added GraphQL event\"" +
+                "        where:\"Day 2\"" +
+                "        when:\"Saturday night\"" +
+                "        description:\"Studying GraphQL\"" +
+                "    ){" +
+                "        id" +
+                "        name" +
+                "        description" +
+                "    }" +
+                "}";
 
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("query", queryString);
+        requestBody.put("variables", "");
+        requestBody.put("operationName", "add");
 
-		Map<String, Object> requestBody = new HashMap<>();
-		requestBody.put("query", queryString);
-		requestBody.put("variables", "");
-		requestBody.put("operationName", "add");
+        WebClient.ResponseSpec response = AppSyncClientHelper.getResponseBodySpec(requestBody);
 
-		WebClient.ResponseSpec response = AppSyncClientHelper.getResponseBodySpec(requestBody);
+        String bodyString = response.bodyToMono(String.class).block();
 
-		String bodyString = response.bodyToMono(String.class).block();
-
-		assertNotNull(bodyString);
-		assertTrue(bodyString.contains("My added GraphQL event"));
-		assertFalse(bodyString.contains("where"));
-		assertFalse(bodyString.contains("when"));
-	}
+        assertNotNull(bodyString);
+        assertTrue(bodyString.contains("My added GraphQL event"));
+        assertFalse(bodyString.contains("where"));
+        assertFalse(bodyString.contains("when"));
+    }
 }
diff --git a/pom.xml b/pom.xml
index 22d73f3a9e..8f2cc8e902 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1015,7 +1015,7 @@
                 <module>asm</module>
                 <module>atomix</module>
                 <module>aws</module>
-				<module>aws-app-sync</module>
+                <module>aws-app-sync</module>
                 <module>aws-lambda</module>
                 <module>axon</module>
                 <module>azure</module>

From dd052eb2fc0457e67b20302392072136b242c7f9 Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Sat, 2 May 2020 18:27:41 +0200
Subject: [PATCH 163/404] BAEL-3730: Force simple cache manager usage (#9211)

---
 .../caching/boot/SimpleCacheCustomizerIntegrationTest.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java b/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java
index 56a4bd4745..3c83065c5c 100644
--- a/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java
+++ b/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java
@@ -10,7 +10,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(SpringRunner.class)
-@SpringBootTest
+@SpringBootTest("spring.cache.type=simple")
 public class SimpleCacheCustomizerIntegrationTest {
 
     @Autowired

From 2b4c2e3c8c9f75b4e65c8e351d34b98bee4d7720 Mon Sep 17 00:00:00 2001
From: Belma Jakupovic <jakupovicbelma1@gmail.com>
Date: Sat, 2 May 2020 18:30:36 +0200
Subject: [PATCH 164/404] bjakupovic remove sys. prints (#9208)

---
 .../src/main/java/com/baeldung/s/TextManipulator.java  | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java b/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java
index a6b32a0ff9..d084a78815 100644
--- a/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java
+++ b/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java
@@ -15,16 +15,18 @@ public class TextManipulator {
         text = text.concat(newText);
     }
 
-    public void findWordAndReplace(String word, String replacementWord) {
+    public String findWordAndReplace(String word, String replacementWord) {
         if (text.contains(word)) {
             text = text.replace(word, replacementWord);
-        } else System.out.println("Word you want to replace is not found in the text");
+        }
+        return text;
     }
 
-    public void findWordAndDelete(String word) {
+    public String findWordAndDelete(String word) {
         if (text.contains(word)) {
             text = text.replace(word, "");
-        } else System.out.println("Word you want to delete is not found in the text");
+        }
+        return text;
     }
 
  /*

From cb9ed74dab4f05a111023836dc2da902947217d1 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 3 May 2020 15:35:23 +0530
Subject: [PATCH 165/404] fix integration test cases

---
 spring-mvc-java/pom.xml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml
index 079a664a5d..30c6961f03 100644
--- a/spring-mvc-java/pom.xml
+++ b/spring-mvc-java/pom.xml
@@ -69,6 +69,12 @@
             <artifactId>commons-io</artifactId>
             <version>${commons-io.version}</version>
         </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.4</version>
+        </dependency>
+        
 
         <!-- Thymeleaf -->
         <dependency>

From 63fb2df0ba1f83e6b7451e7204f65ce08a12ae32 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 3 May 2020 15:37:23 +0530
Subject: [PATCH 166/404] fix integration test cases

---
 spring-mvc-java/pom.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml
index 30c6961f03..9e3457aa8a 100644
--- a/spring-mvc-java/pom.xml
+++ b/spring-mvc-java/pom.xml
@@ -72,7 +72,7 @@
         <dependency>
             <groupId>commons-fileupload</groupId>
             <artifactId>commons-fileupload</artifactId>
-            <version>1.4</version>
+            <version>${commons-fileupload.version}</version>
         </dependency>
         
 
@@ -243,6 +243,7 @@
         <commons-lang3.version>3.5</commons-lang3.version>
         <commons-fileupload.version>1.3.2</commons-fileupload.version>
         <commons-io.version>2.5</commons-io.version>
+        <commons-fileupload.version>1.4</commons-fileupload.version>
         <jsonpath.version>2.2.0</jsonpath.version>
 
         <!-- testing -->

From cbaf84501df11108b9afadcfcbf4b7a5e82f699d Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 3 May 2020 16:03:06 +0530
Subject: [PATCH 167/404] update spring 4 version to latest

---
 parent-spring-4/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml
index 3f9a22fb03..931cad374b 100644
--- a/parent-spring-4/pom.xml
+++ b/parent-spring-4/pom.xml
@@ -53,7 +53,7 @@
     </build>
 
     <properties>
-        <spring.version>4.3.26.RELEASE</spring.version>
+        <spring.version>4.3.27.RELEASE</spring.version>
         <cargo-maven2-plugin.version>1.6.1</cargo-maven2-plugin.version>
     </properties>
 

From e41cc37b61f7052c55bb297f1ee0ec4ea4291600 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 3 May 2020 16:38:26 +0530
Subject: [PATCH 168/404] updated readme file

---
 spring-core-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-core-2/README.md b/spring-core-2/README.md
index 947b816db8..6068e8c3c2 100644
--- a/spring-core-2/README.md
+++ b/spring-core-2/README.md
@@ -14,4 +14,5 @@ This module contains articles about core Spring functionality
 - [Spring Events](https://www.baeldung.com/spring-events)
 - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
 - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
+- [Running Setup Data in Startup] (https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
 - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3)

From a1cfe519cafd993135d54bd14af21d912d5f22b1 Mon Sep 17 00:00:00 2001
From: Anshul BANSAL <smartdiscover17@gmail.com>
Date: Sun, 3 May 2020 14:38:08 +0300
Subject: [PATCH 169/404] BAEL-3995 - Spring Security with Okta

---
 spring-security-modules/pom.xml               |  1 +
 .../spring-security-okta/pom.xml              | 62 +++++++++++++++++++
 .../java/com/baeldung/okta/Application.java   | 13 ++++
 .../okta/controller/AdminController.java      | 43 +++++++++++++
 .../okta/controller/HomeController.java       | 16 +++++
 .../src/main/resources/application.properties |  8 +++
 6 files changed, 143 insertions(+)
 create mode 100644 spring-security-modules/spring-security-okta/pom.xml
 create mode 100644 spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java
 create mode 100644 spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java
 create mode 100644 spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java
 create mode 100644 spring-security-modules/spring-security-okta/src/main/resources/application.properties

diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index 49a0db03ed..59dd75cbda 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -30,6 +30,7 @@
         <module>spring-security-mvc-login</module>
         <module>spring-security-mvc-persisted-remember-me</module>
         <module>spring-security-mvc-socket</module>
+        <module>spring-security-okta</module>
         <module>spring-security-oidc</module>
         <module>spring-security-react</module>   
         <module>spring-security-rest</module>
diff --git a/spring-security-modules/spring-security-okta/pom.xml b/spring-security-modules/spring-security-okta/pom.xml
new file mode 100644
index 0000000000..c5ff9013b5
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>spring-security-okta</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>spring-security-okta</name>
+    <packaging>war</packaging>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../../parent-boot-2</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.okta.spring</groupId>
+            <artifactId>okta-spring-boot-starter</artifactId>
+            <version>${okta.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.okta.spring</groupId>
+            <artifactId>okta-spring-sdk</artifactId>
+            <version>${okta.spring.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>spring-security-okta</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <addResources>true</addResources>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    
+    <properties>
+        <okta.spring.version>1.4.0</okta.spring.version>
+    </properties>
+</project>
diff --git a/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java
new file mode 100644
index 0000000000..0c5cc94f10
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.okta;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
diff --git a/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java
new file mode 100644
index 0000000000..c7786c4006
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java
@@ -0,0 +1,43 @@
+package com.baeldung.okta.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.okta.sdk.client.Client;
+import com.okta.sdk.resource.user.User;
+import com.okta.sdk.resource.user.UserBuilder;
+import com.okta.sdk.resource.user.UserList;
+
+@RestController
+public class AdminController {
+
+    @Autowired
+    public Client client;
+
+    @GetMapping("/users")
+    public UserList getUsers() {
+        return client.listUsers();
+    }
+
+    @GetMapping("/user")
+    public UserList searchUserByEmail(@RequestParam String query) {
+        return client.listUsers(query, null, null, null, null);
+    }
+    
+    @GetMapping("/createUser")
+    public User createUser() {
+        char[] tempPassword = {'P','a','$','$','w','0','r','d'};
+        User user = UserBuilder.instance()
+            .setEmail("norman.lewis@email.com")
+            .setFirstName("Norman")
+            .setLastName("Lewis")
+            .setPassword(tempPassword)
+            .setActive(true)
+            .buildAndCreate(client);
+        return user;
+    }
+    
+}
+
diff --git a/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java
new file mode 100644
index 0000000000..b8f3ec4e10
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java
@@ -0,0 +1,16 @@
+package com.baeldung.okta.controller;
+
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.oauth2.core.oidc.user.OidcUser;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HomeController {
+
+    @GetMapping("/")
+    public String home(@AuthenticationPrincipal OidcUser user) {
+        return "Welcome, "+ user.getFullName() +"!";
+    }
+    
+}
diff --git a/spring-security-modules/spring-security-okta/src/main/resources/application.properties b/spring-security-modules/spring-security-okta/src/main/resources/application.properties
new file mode 100644
index 0000000000..4a584e3c29
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+okta.oauth2.issuer= //Auth server issuer URL
+okta.oauth2.client-id= //Client ID of our Okta application
+okta.oauth2.client-secret= //Client secret of our Okta application
+okta.oauth2.redirect-uri=/authorization-code/callback
+
+#Okta Spring SDK configs
+okta.client.orgUrl= //orgURL
+okta.client.token= //token generated
\ No newline at end of file

From 05a4f60e38babd42b62b825157247195bd5778da Mon Sep 17 00:00:00 2001
From: Cristian Rosu <cristi.rosu4@gmail.com>
Date: Sun, 3 May 2020 17:28:27 +0300
Subject: [PATCH 170/404] BAEL-3826: creating PDFs using Thymeleaf as template
 engine

---
 pdf/pom.xml                                   | 10 ++++
 .../com/baeldung/pdf/PDFThymeleafExample.java | 48 +++++++++++++++++++
 .../main/resources/thymeleaf_template.html    |  7 +++
 3 files changed, 65 insertions(+)
 create mode 100644 pdf/src/main/java/com/baeldung/pdf/PDFThymeleafExample.java
 create mode 100644 pdf/src/main/resources/thymeleaf_template.html

diff --git a/pdf/pom.xml b/pdf/pom.xml
index d148aa1670..463c88948d 100644
--- a/pdf/pom.xml
+++ b/pdf/pom.xml
@@ -60,6 +60,16 @@
             <artifactId>poi-ooxml</artifactId>
             <version>${poi-ooxml.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.thymeleaf</groupId>
+            <artifactId>thymeleaf</artifactId>
+            <version>3.0.11.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.xhtmlrenderer</groupId>
+            <artifactId>flying-saucer-pdf</artifactId>
+            <version>9.1.20</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/pdf/src/main/java/com/baeldung/pdf/PDFThymeleafExample.java b/pdf/src/main/java/com/baeldung/pdf/PDFThymeleafExample.java
new file mode 100644
index 0000000000..2e1df1d320
--- /dev/null
+++ b/pdf/src/main/java/com/baeldung/pdf/PDFThymeleafExample.java
@@ -0,0 +1,48 @@
+package com.baeldung.pdf;
+
+import com.lowagie.text.DocumentException;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.templatemode.TemplateMode;
+import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
+import org.xhtmlrenderer.pdf.ITextRenderer;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class PDFThymeleafExample {
+
+    public static void main(String[] args) throws IOException, DocumentException {
+        PDFThymeleafExample thymeleaf2Pdf = new PDFThymeleafExample();
+        String html = thymeleaf2Pdf.parseThymeleafTemplate();
+        thymeleaf2Pdf.generatePdfFromHtml(html);
+    }
+
+    public void generatePdfFromHtml(String html) throws IOException, DocumentException {
+        String outputFolder = System.getProperty("user.home") + File.separator + "thymeleaf.pdf";
+        OutputStream outputStream = new FileOutputStream(outputFolder);
+
+        ITextRenderer renderer = new ITextRenderer();
+        renderer.setDocumentFromString(html);
+        renderer.layout();
+        renderer.createPDF(outputStream);
+
+        outputStream.close();
+    }
+
+    private String parseThymeleafTemplate() {
+        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
+        templateResolver.setSuffix(".html");
+        templateResolver.setTemplateMode(TemplateMode.HTML);
+
+        TemplateEngine templateEngine = new TemplateEngine();
+        templateEngine.setTemplateResolver(templateResolver);
+
+        Context context = new Context();
+        context.setVariable("to", "Baeldung.com");
+
+        return templateEngine.process("thymeleaf_template", context);
+    }
+}
diff --git a/pdf/src/main/resources/thymeleaf_template.html b/pdf/src/main/resources/thymeleaf_template.html
new file mode 100644
index 0000000000..3e856367cc
--- /dev/null
+++ b/pdf/src/main/resources/thymeleaf_template.html
@@ -0,0 +1,7 @@
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+  <body>
+    <h3 style="text-align: center; color: green">
+      <span th:text="'Welcome to ' + ${to} + '!'"></span>
+    </h3>
+  </body>
+</html>
\ No newline at end of file

From dbb4a85c1071d6d95dbbf6ee939945b5ddccbf15 Mon Sep 17 00:00:00 2001
From: sergio41 <sergiorr41@gmail.com>
Date: Sun, 3 May 2020 16:44:14 +0200
Subject: [PATCH 171/404] [BAEL-3944] Negative test cases

---
 .../PhoneNumbersRegexUnitTest.java            | 73 +++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
index afabf47baa..11bf1618b6 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
@@ -15,6 +15,13 @@ public class PhoneNumbersRegexUnitTest {
         Matcher matcher = pattern.matcher("2055550125");
         assertTrue(matcher.matches());
     }
+    
+    @Test
+    public void whenMOreThanTenDigits_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^\\d{10}$");
+        Matcher matcher = pattern.matcher("20555501251");
+        assertFalse(matcher.matches());
+    }
 
     @Test
     public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() {
@@ -22,6 +29,27 @@ public class PhoneNumbersRegexUnitTest {
         Matcher matcher = pattern.matcher("202 555 0125");
         assertTrue(matcher.matches());
     }
+    
+    @Test
+    public void whenIncludesBracket_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+        Matcher matcher = pattern.matcher("202]555 0125");
+        assertFalse(matcher.matches());
+    }
+    
+    @Test
+    public void whenNotStartsWithBatchesOfThreeDigits_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+        Matcher matcher = pattern.matcher("2021 555 0125");
+        assertFalse(matcher.matches());
+    }
+    
+    @Test
+    public void whenLastPartWithNoFourDigits_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+        Matcher matcher = pattern.matcher("202 555 012");
+        assertFalse(matcher.matches());
+    }
 
     @Test
     public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
@@ -30,6 +58,20 @@ public class PhoneNumbersRegexUnitTest {
         assertTrue(matcher.matches());
     }
 
+    @Test
+    public void whenJustOpeningParenthesis_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+        Matcher matcher = pattern.matcher("(202 555-0125");
+        assertFalse(matcher.matches());
+    }
+
+    @Test
+    public void whenJustClosingParenthesis_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+        Matcher matcher = pattern.matcher("202) 555-0125");
+        assertFalse(matcher.matches());
+    }
+
     @Test
     public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
         Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
@@ -37,6 +79,20 @@ public class PhoneNumbersRegexUnitTest {
         assertTrue(matcher.matches());
     }
 
+    @Test
+    public void whenIncorrectPrefix_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+        Matcher matcher = pattern.matcher("-111 (202) 555-0125");
+        assertFalse(matcher.matches());
+    }
+
+    @Test
+    public void whenTooLongPrefix_thenNotCorrect() {
+        Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+        Matcher matcher = pattern.matcher("+1111 (202) 555-0125");
+        assertFalse(matcher.matches());
+    }
+
     @Test
     public void whenMatchesPhoneNumber_thenCorrect() {
         String patterns 
@@ -53,4 +109,21 @@ public class PhoneNumbersRegexUnitTest {
             assertTrue(matcher.matches());
         }
     }
+
+    @Test
+    public void whenNotMatchesPhoneNumber_thenNotCorrect() {
+        String patterns 
+          = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"
+          + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" 
+          + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
+
+        String[] invalidPhoneNumbers 
+          = {"20555501251","202]555 0125", "2021 555 012", "(202 555-0125", "202) 555-0125", "-111 (202) 555-0125", "+1111 (202) 555-0125", "636 85 789", "636 85 67 893"};
+
+        Pattern pattern = Pattern.compile(patterns);
+        for(String phoneNumber : invalidPhoneNumbers) {
+            Matcher matcher = pattern.matcher(phoneNumber);
+            assertFalse(matcher.matches());
+        }
+    }
 }

From 04ac8037041d7df0edf4016629ff6e3235f1b899 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Sun, 3 May 2020 19:42:17 +0200
Subject: [PATCH 172/404] [JAVA-621] Fixed core-java-lang-oop-inheritance
 module description

---
 core-java-modules/core-java-lang-oop-inheritance/README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/core-java-modules/core-java-lang-oop-inheritance/README.md b/core-java-modules/core-java-lang-oop-inheritance/README.md
index e264f9fae4..c87bdf13d7 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/README.md
+++ b/core-java-modules/core-java-lang-oop-inheritance/README.md
@@ -1,6 +1,6 @@
-## Core Java Lang OOP - Types
+## Core Java Lang OOP - Inheritance
 
-This module contains articles about types in Java
+This module contains articles about inheritance in Java
 
 ### Relevant Articles: 
 - [Java Interfaces](https://www.baeldung.com/java-interfaces)

From 50a6563e30fd87dc040cdb6d72da0cac9f67928f Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sun, 3 May 2020 23:19:33 +0530
Subject: [PATCH 173/404] "updated pom.xml"

---
 persistence-modules/spring-data-jpa-5/pom.xml | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/persistence-modules/spring-data-jpa-5/pom.xml b/persistence-modules/spring-data-jpa-5/pom.xml
index c71cec1d08..390cfaf0c0 100644
--- a/persistence-modules/spring-data-jpa-5/pom.xml
+++ b/persistence-modules/spring-data-jpa-5/pom.xml
@@ -28,16 +28,6 @@
             <artifactId>spring-boot-starter-data-jdbc</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>

From f8cae12a3830b303442bcd808439a9f057027def Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Sun, 3 May 2020 13:53:19 -0400
Subject: [PATCH 174/404] Bael-3893 - Updated indents with 4 spaces

---
 aws-app-sync/pom.xml | 90 ++++++++++++++++++++++----------------------
 1 file changed, 45 insertions(+), 45 deletions(-)

diff --git a/aws-app-sync/pom.xml b/aws-app-sync/pom.xml
index ef2085ff35..1f915978ab 100644
--- a/aws-app-sync/pom.xml
+++ b/aws-app-sync/pom.xml
@@ -1,56 +1,56 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.2.6.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.6.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
 
-	<groupId>com.baeldung</groupId>
-	<artifactId>aws-app-sync</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>aws-app-sync</name>
+    <groupId>com.baeldung</groupId>
+    <artifactId>aws-app-sync</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>aws-app-sync</name>
 
-	<description>Spring Boot using AWS App Sync</description>
+    <description>Spring Boot using AWS App Sync</description>
 
-	<properties>
-		<java.version>1.8</java.version>
-	</properties>
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
 
-	<dependencies>
+    <dependencies>
 
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
 
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-			<exclusions>
-				<exclusion>
-					<groupId>org.junit.vintage</groupId>
-					<artifactId>junit-vintage-engine</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-webflux</artifactId>
-		</dependency>
-	</dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
+    </dependencies>
 
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

From 43816bc2822b0440860aba1a584dca33d5502d41 Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sun, 3 May 2020 23:33:39 +0530
Subject: [PATCH 175/404] update

---
 persistence-modules/spring-data-jpa-5/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/persistence-modules/spring-data-jpa-5/pom.xml b/persistence-modules/spring-data-jpa-5/pom.xml
index 390cfaf0c0..7f2c724f98 100644
--- a/persistence-modules/spring-data-jpa-5/pom.xml
+++ b/persistence-modules/spring-data-jpa-5/pom.xml
@@ -34,4 +34,4 @@
         </dependency>
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>

From 4487ac8654ac989a607998ae382dadb5979ab173 Mon Sep 17 00:00:00 2001
From: Arindum Roy <arindum.roy@gmail.com>
Date: Sun, 3 May 2020 23:36:14 +0530
Subject: [PATCH 176/404] update

---
 .../src/test/resources/application-test.properties               | 1 -
 1 file changed, 1 deletion(-)

diff --git a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
index f9497c8f37..207de2e8ec 100644
--- a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
+++ b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
@@ -1,2 +1 @@
 spring.jpa.hibernate.ddl-auto=update
-spring.datasource.url=jdbc:h2:mem:jpa3
\ No newline at end of file

From ba42ca2dbbd07c5e89abeda3aef065f50bb74a82 Mon Sep 17 00:00:00 2001
From: Maciej Glowka <maciejglowka.pl@gmail.com>
Date: Sun, 3 May 2020 22:05:04 +0200
Subject: [PATCH 177/404] BAEL-3829: example of dynamic bean autowiring in
 Spring

---
 .../BeanFactoryDynamicAutowireService.java    | 22 ++++++++++++++
 .../autowire/DynamicAutowireConfig.java       |  9 ++++++
 .../InterfaceDynamicAutowireService.java      | 26 ++++++++++++++++
 .../dynamic/autowire/RegionService.java       |  7 +++++
 .../dynamic/autowire/USARegionService.java    | 16 ++++++++++
 .../dynamic/autowire/UkRegionService.java     | 16 ++++++++++
 .../DynamicAutowireIntegrationTest.java       | 30 +++++++++++++++++++
 7 files changed, 126 insertions(+)
 create mode 100644 spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java
 create mode 100644 spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java

diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
new file mode 100644
index 0000000000..5f8f2e548e
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
@@ -0,0 +1,22 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BeanFactoryDynamicAutowireService {
+    private final BeanFactory beanFactory;
+
+    @Autowired
+    public BeanFactoryDynamicAutowireService(BeanFactory beanFactory) {
+        this.beanFactory = beanFactory;
+    }
+
+    public boolean isServerActive(String countryCode, int serverId) {
+        RegionService service = beanFactory.getBean(countryCode, RegionService.class);
+
+        return service.isServerActive(serverId);
+    }
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java
new file mode 100644
index 0000000000..256bd9b495
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java
@@ -0,0 +1,9 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan("com.baeldung.dynamic.autowire")
+public class DynamicAutowireConfig {
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java
new file mode 100644
index 0000000000..ad655f5c42
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java
@@ -0,0 +1,26 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+public class InterfaceDynamicAutowireService {
+    private final Map<String, RegionService> servicesByCountryCode;
+
+    @Autowired
+    public InterfaceDynamicAutowireService(List<RegionService> regionServices) {
+        servicesByCountryCode = regionServices.stream()
+                .collect(Collectors.toMap(RegionService::getCountryCode, Function.identity()));
+    }
+
+    public boolean isServerActive(String countryCode, int serverId) {
+        RegionService service = servicesByCountryCode.get(countryCode);
+
+        return service.isServerActive(serverId);
+    }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
new file mode 100644
index 0000000000..f9f92d045a
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
@@ -0,0 +1,7 @@
+package com.baeldung.dynamic.autowire;
+
+public interface RegionService {
+    boolean isServerActive(int serverId);
+
+    String getCountryCode();
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java
new file mode 100644
index 0000000000..cfad0146e5
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java
@@ -0,0 +1,16 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.stereotype.Service;
+
+@Service("usa")
+public class USARegionService implements RegionService {
+    @Override
+    public boolean isServerActive(int serverId) {
+        return true;
+    }
+
+    @Override
+    public String getCountryCode() {
+        return "usa";
+    }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java
new file mode 100644
index 0000000000..1fbe8ed96e
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java
@@ -0,0 +1,16 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.stereotype.Service;
+
+@Service("uk")
+public class UkRegionService implements RegionService {
+    @Override
+    public boolean isServerActive(int serverId) {
+        return false;
+    }
+
+    @Override
+    public String getCountryCode() {
+        return "uk";
+    }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
new file mode 100644
index 0000000000..5afab69c53
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.dynamic.autowire;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = DynamicAutowireConfig.class)
+public class DynamicAutowireIntegrationTest {
+
+    @Autowired
+    private BeanFactoryDynamicAutowireService beanFactoryDynamicAutowireService;
+
+    @Autowired
+    private InterfaceDynamicAutowireService interfaceDynamicAutowireService;
+
+    @Test
+    public void testConstructWorkerByJava() {
+        assertThat(beanFactoryDynamicAutowireService.isServerActive("uk", 101), is(false));
+        assertThat(interfaceDynamicAutowireService.isServerActive("uk", 101), is(false));
+
+        assertThat(beanFactoryDynamicAutowireService.isServerActive("usa", 101), is(true));
+        assertThat(interfaceDynamicAutowireService.isServerActive("usa", 101), is(true));
+    }
+}

From b26b71567acaafa778f4b97d08a6c95b7c2dd528 Mon Sep 17 00:00:00 2001
From: aitorcuesta <56877414+aitorcuesta@users.noreply.github.com>
Date: Sun, 3 May 2020 22:25:39 +0200
Subject: [PATCH 178/404] [BAEL-3614] - Spring Redis Configuration From
 application.properties File (#9226)

* BAEL-3614 - Initial commit

* BAEL-3614 - Removing unnecessary properties
---
 persistence-modules/redis/pom.xml             | 32 ++++++---
 .../redis/configuration/RedisConfig.java      | 24 +++++++
 .../SpringRedisConfigurationApplication.java  | 19 ++++++
 .../controller/BooksController.java           | 32 +++++++++
 .../redis/configuration/entity/Book.java      | 46 +++++++++++++
 .../repository/BooksRepository.java           | 25 +++++++
 .../src/main/resources/application.properties |  9 +++
 .../controller/BooksControllerUnitTest.java   | 52 +++++++++++++++
 .../repository/BooksRepositoryUnitTest.java   | 66 +++++++++++++++++++
 9 files changed, 295 insertions(+), 10 deletions(-)
 create mode 100644 persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/RedisConfig.java
 create mode 100644 persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/SpringRedisConfigurationApplication.java
 create mode 100644 persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/controller/BooksController.java
 create mode 100644 persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/entity/Book.java
 create mode 100644 persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/repository/BooksRepository.java
 create mode 100644 persistence-modules/redis/src/main/resources/application.properties
 create mode 100644 persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/controller/BooksControllerUnitTest.java
 create mode 100644 persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/repository/BooksRepositoryUnitTest.java

diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml
index fffcfbb96b..c9206e5f92 100644
--- a/persistence-modules/redis/pom.xml
+++ b/persistence-modules/redis/pom.xml
@@ -9,16 +9,31 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>persistence-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+ 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+    
         <dependency>
             <groupId>redis.clients</groupId>
             <artifactId>jedis</artifactId>
-            <version>${jedis.version}</version>
-        </dependency>
+            </dependency>
         <dependency>
             <groupId>com.github.kstyrc</groupId>
             <artifactId>embedded-redis</artifactId>
@@ -32,15 +47,12 @@
         <dependency>
             <groupId>io.lettuce</groupId>
             <artifactId>lettuce-core</artifactId>
-            <version>${lettuce-core.version}</version>
-        </dependency>
+            </dependency>
     </dependencies>
 
-    <properties>
-        <jedis.version>3.2.0</jedis.version>
+    <properties>        
         <embedded-redis.version>0.6</embedded-redis.version>
-        <redisson.version>3.3.0</redisson.version>
-        <lettuce-core.version>5.0.1.RELEASE</lettuce-core.version>
+        <redisson.version>3.3.0</redisson.version>        
     </properties>
 
 </project>
diff --git a/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/RedisConfig.java b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/RedisConfig.java
new file mode 100644
index 0000000000..ad43ad8159
--- /dev/null
+++ b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/RedisConfig.java
@@ -0,0 +1,24 @@
+package com.baeldung.spring.redis.configuration;
+
+import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import com.baeldung.spring.redis.configuration.entity.Book;
+
+@Configuration
+@EnableConfigurationProperties(RedisProperties.class)
+public class RedisConfig {
+
+    @Bean
+    public RedisTemplate<Long, Book> redisTemplate(RedisConnectionFactory connectionFactory) {
+        RedisTemplate<Long, Book> template = new RedisTemplate<>();
+        template.setConnectionFactory(connectionFactory);
+        // Add some specific configuration here. Key serializers, etc.
+        return template;
+    }
+
+}
diff --git a/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/SpringRedisConfigurationApplication.java b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/SpringRedisConfigurationApplication.java
new file mode 100644
index 0000000000..932a6b7478
--- /dev/null
+++ b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/SpringRedisConfigurationApplication.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.redis.configuration;
+
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringRedisConfigurationApplication implements CommandLineRunner {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SpringRedisConfigurationApplication.class, args);
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+
+    }
+
+}
diff --git a/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/controller/BooksController.java b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/controller/BooksController.java
new file mode 100644
index 0000000000..b3faf030c9
--- /dev/null
+++ b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/controller/BooksController.java
@@ -0,0 +1,32 @@
+package com.baeldung.spring.redis.configuration.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.spring.redis.configuration.entity.Book;
+import com.baeldung.spring.redis.configuration.repository.BooksRepository;
+
+@RestController
+@RequestMapping("/books")
+public class BooksController {
+
+    @Autowired
+    private BooksRepository repository;
+
+    @PostMapping("/create")
+    public String newBook(@RequestBody Book newBook) {
+        repository.save(newBook);
+        return "Added";
+    }
+
+    @GetMapping("/get/{id}")
+    public Book findOne(@PathVariable Long id) {
+        return repository.findById(id);
+    }
+
+}
diff --git a/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/entity/Book.java b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/entity/Book.java
new file mode 100644
index 0000000000..52d579d4fb
--- /dev/null
+++ b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/entity/Book.java
@@ -0,0 +1,46 @@
+package com.baeldung.spring.redis.configuration.entity;
+
+import java.io.Serializable;
+
+public class Book implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    public Book() {
+    }
+
+    public Book(String name) {
+        this.name = name;
+    }
+
+    public Book(Long id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return "Book [id=" + id + ", name=" + name + "]";
+    }
+
+}
diff --git a/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/repository/BooksRepository.java b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/repository/BooksRepository.java
new file mode 100644
index 0000000000..a6eba0e742
--- /dev/null
+++ b/persistence-modules/redis/src/main/java/com/baeldung/spring/redis/configuration/repository/BooksRepository.java
@@ -0,0 +1,25 @@
+package com.baeldung.spring.redis.configuration.repository;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.spring.redis.configuration.entity.Book;
+
+@Component
+public class BooksRepository {
+
+    @Autowired
+    private RedisTemplate<Long, Book> redisTemplate;
+
+    public void save(Book book) {
+        redisTemplate.opsForValue()
+            .set(book.getId(), book);
+    }
+
+    public Book findById(Long id) {
+        return redisTemplate.opsForValue()
+            .get(id);
+    }
+
+}
diff --git a/persistence-modules/redis/src/main/resources/application.properties b/persistence-modules/redis/src/main/resources/application.properties
new file mode 100644
index 0000000000..e3140c4e29
--- /dev/null
+++ b/persistence-modules/redis/src/main/resources/application.properties
@@ -0,0 +1,9 @@
+spring.redis.database=0
+spring.redis.host=localhost
+spring.redis.port=16379
+spring.redis.password=mypass
+spring.redis.timeout=60000
+spring.redis.lettuce.pool.max-active=8
+spring.redis.lettuce.pool.max-idle=8
+spring.redis.lettuce.pool.max-wait=-1
+spring.redis.lettuce.pool.min-idle=0
\ No newline at end of file
diff --git a/persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/controller/BooksControllerUnitTest.java b/persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/controller/BooksControllerUnitTest.java
new file mode 100644
index 0000000000..a5c3340065
--- /dev/null
+++ b/persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/controller/BooksControllerUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.spring.redis.configuration.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.spring.redis.configuration.entity.Book;
+import com.baeldung.spring.redis.configuration.repository.BooksRepository;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+public class BooksControllerUnitTest {
+
+    @Spy
+    @InjectMocks
+    private BooksController booksController;
+
+    @Mock
+    private BooksRepository booksRepository;
+
+    private static final Long BOOK_ID = 1l;
+    private static final Long OTHER_BOOK_ID = 2l;
+    private static final String BOOK_NAME = "Ulysses";
+    private static final String ADDED = "Added";
+
+    @Test
+    public void whenNewBook_thenCorrect() {
+        assertEquals(ADDED, booksController.newBook(new Book(BOOK_ID, BOOK_NAME)));
+    }
+
+    @Test
+    public void whenFindOneFinds_thenCorrect() {
+        Book book = new Book(BOOK_ID, BOOK_NAME);
+        when(booksRepository.findById(BOOK_ID)).thenReturn(book);
+        assertSame(book, booksController.findOne(BOOK_ID));
+    }
+
+    @Test
+    public void whenFindOneNotFound_thenReturnsNull() {
+        Book book = new Book(BOOK_ID, BOOK_NAME);
+        when(booksRepository.findById(BOOK_ID)).thenReturn(book);
+        assertNull(booksController.findOne(OTHER_BOOK_ID));
+    }
+
+}
diff --git a/persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/repository/BooksRepositoryUnitTest.java b/persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/repository/BooksRepositoryUnitTest.java
new file mode 100644
index 0000000000..1edf9c7e89
--- /dev/null
+++ b/persistence-modules/redis/src/test/java/com/baeldung/spring/redis/configuration/repository/BooksRepositoryUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.spring.redis.configuration.repository;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.spring.redis.configuration.entity.Book;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+public class BooksRepositoryUnitTest {
+
+    @Spy
+    @InjectMocks
+    private BooksRepository booksRepository;
+
+    @Mock
+    private RedisTemplate<Long, Book> redisTemplate;
+
+    @Mock
+    private ValueOperations<Long, Book> valueOperations;
+
+    private static final Long BOOK_ID = 1l;
+    private static final Long OTHER_BOOK_ID = 2l;
+    private static final String BOOK_NAME = "Ulysses";
+
+    @Test
+    public void whenSave_thenCorrect() {
+        Book book = new Book(BOOK_ID, BOOK_NAME);
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        booksRepository.save(book);
+        verify(redisTemplate, times(1)).opsForValue();
+        verify(valueOperations, times(1)).set(BOOK_ID, book);
+    }
+
+    @Test
+    public void whenFindByIdFound_thenReturnsBook() {
+        Book book = new Book(BOOK_ID, BOOK_NAME);
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get(BOOK_ID)).thenReturn(book);
+        assertSame(book, booksRepository.findById(BOOK_ID));
+        verify(redisTemplate, times(1)).opsForValue();
+        verify(valueOperations, times(1)).get(BOOK_ID);
+    }
+
+    @Test
+    public void whenFindByIdNotFound_thenReturnsNull() {
+        Book book = new Book(BOOK_ID, BOOK_NAME);
+        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
+        when(valueOperations.get(BOOK_ID)).thenReturn(book);
+        assertNull(booksRepository.findById(OTHER_BOOK_ID));
+        verify(redisTemplate, times(1)).opsForValue();
+        verify(valueOperations, times(1)).get(OTHER_BOOK_ID);
+    }
+
+}

From 7ec77df0960181bdf35e8770d332ac7602b43e8a Mon Sep 17 00:00:00 2001
From: Chirag Dewan <chirag.dewan@ericsson.com>
Date: Mon, 4 May 2020 18:11:12 +0530
Subject: [PATCH 179/404] BAEL1731 Adding listappender

---
 .../logging/log4j2/plugins/ListAppender.java  | 48 +++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/ListAppender.java

diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/ListAppender.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/ListAppender.java
new file mode 100644
index 0000000000..e3819028db
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/plugins/ListAppender.java
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package com.baeldung.logging.log4j2.plugins;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Core;
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static java.util.Collections.synchronizedList;
+
+@Plugin(name = "ListAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE)
+public class ListAppender extends AbstractAppender {
+
+    private List<LogEvent> logList;
+
+    protected ListAppender(String name, Filter filter) {
+        super(name, filter, null);
+        logList = synchronizedList(new ArrayList<>());
+    }
+
+    @PluginFactory
+    public static ListAppender createAppender(@PluginAttribute("name") String name, @PluginElement("Filter") final Filter filter) {
+        return new ListAppender(name, filter);
+    }
+
+    @Override
+    public void append(LogEvent event) {
+        if (event.getLevel()
+                .isLessSpecificThan(Level.WARN)) {
+            error("Unable to log less than WARN level.");
+            return;
+        }
+        logList.add(event);
+    }
+
+}

From 93074cdabc271fb356f30c16837d751313f309cb Mon Sep 17 00:00:00 2001
From: Sampada <46674082+sampada07@users.noreply.github.com>
Date: Mon, 4 May 2020 20:36:20 +0530
Subject: [PATCH 180/404] JAVA-929: Migrate spring-cloud-aws to parent-boot-2
 (#9230)

* JAVA-929: Migrate spring-cloud-aws to parent-boot-2

* JAVA-929: Corrected Live Tests

* JAVA-929: Updated README
---
 spring-cloud/spring-cloud-aws/README.md       |  1 -
 spring-cloud/spring-cloud-aws/pom.xml         | 12 +++++++---
 .../spring/cloud/aws/s3/SpringCloudS3.java    | 24 ++++++++++++-------
 .../src/main/resources/application.properties |  1 -
 4 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/spring-cloud/spring-cloud-aws/README.md b/spring-cloud/spring-cloud-aws/README.md
index bf33728c74..ddcc97420f 100644
--- a/spring-cloud/spring-cloud-aws/README.md
+++ b/spring-cloud/spring-cloud-aws/README.md
@@ -23,7 +23,6 @@ Let's say that the RDS instance is called `spring-cloud-test-db` having the mast
 to write the following in `application.properties`:
 
 ```
-cloud.aws.rds.spring-cloud-test-db
 cloud.aws.rds.spring-cloud-test-db.password=se3retpass
 ```
 Multiple application classes are available under this project. To launch InstanceProfileAwsApplication application, replace `start-class` under `pom.xml`:
diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml
index abf9363288..2b05020888 100644
--- a/spring-cloud/spring-cloud-aws/pom.xml
+++ b/spring-cloud/spring-cloud-aws/pom.xml
@@ -10,9 +10,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-boot-1</relativePath>
+        <relativePath>../../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
@@ -43,6 +43,12 @@
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
         </dependency>
+        
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        
     </dependencies>
 
     <dependencyManagement>
@@ -60,7 +66,7 @@
     <properties>
         <start-class>com.baeldung.spring.cloud.aws.SpringCloudAwsApplication</start-class>
         <spring-cloud.version>Dalston.SR4</spring-cloud.version>
-        <spring-cloud>2.0.1.RELEASE</spring-cloud>
+        <spring-cloud>2.2.1.RELEASE</spring-cloud>
     </properties>
     
 </project>
diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java
index cfad6e904f..acfd6d339e 100644
--- a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java
+++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java
@@ -1,12 +1,5 @@
 package com.baeldung.spring.cloud.aws.s3;
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.ResourceLoader;
-import org.springframework.core.io.WritableResource;
-import org.springframework.core.io.support.ResourcePatternResolver;
-import org.springframework.stereotype.Component;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -14,14 +7,29 @@ import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.aws.core.io.s3.PathMatchingSimpleStorageResourcePatternResolver;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.core.io.WritableResource;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.stereotype.Component;
+
+import com.amazonaws.services.s3.AmazonS3;
+
 @Component
 public class SpringCloudS3 {
 
     @Autowired
     ResourceLoader resourceLoader;
 
+    private ResourcePatternResolver resourcePatternResolver;
+
     @Autowired
-    ResourcePatternResolver resourcePatternResolver;
+    public void setupResolver(ApplicationContext applicationContext, AmazonS3 amazonS3) {
+        this.resourcePatternResolver = new PathMatchingSimpleStorageResourcePatternResolver(amazonS3, applicationContext);
+    }
 
     public void downloadS3Object(String s3Url) throws IOException {
         Resource resource = resourceLoader.getResource(s3Url);
diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/application.properties b/spring-cloud/spring-cloud-aws/src/main/resources/application.properties
index 690eda13a2..e8139326b9 100644
--- a/spring-cloud/spring-cloud-aws/src/main/resources/application.properties
+++ b/spring-cloud/spring-cloud-aws/src/main/resources/application.properties
@@ -2,7 +2,6 @@ cloud.aws.credentials.accessKey=YourAccessKey
 cloud.aws.credentials.secretKey=YourSecretKey
 cloud.aws.region.static=us-east-1
 
-cloud.aws.rds.spring-cloud-test-db
 cloud.aws.rds.spring-cloud-test-db.password=se3retpass
 
 # These 3 properties are optional

From b3f1413445507f4c921de74950dce9e7c5f9532d Mon Sep 17 00:00:00 2001
From: marc06210 <47176686+marc06210@users.noreply.github.com>
Date: Mon, 4 May 2020 18:03:21 +0200
Subject: [PATCH 181/404] BAEL-3960 (#9070)

Bael-3960, asserting log messages with junit code.
---
 testing-modules/pom.xml                       |  1 +
 testing-modules/testing-assertions/pom.xml    | 28 ++++++++++
 .../baeldung/junit/log/BusinessWorker.java    | 16 ++++++
 .../src/main/resources/logback.xml            | 16 ++++++
 .../junit/log/BusinessWorkerUnitTest.java     | 48 +++++++++++++++++
 .../baeldung/junit/log/MemoryAppender.java    | 51 +++++++++++++++++++
 .../src/test/resources/logback.xml            | 13 +++++
 7 files changed, 173 insertions(+)
 create mode 100644 testing-modules/testing-assertions/pom.xml
 create mode 100644 testing-modules/testing-assertions/src/main/java/com/baeldung/junit/log/BusinessWorker.java
 create mode 100644 testing-modules/testing-assertions/src/main/resources/logback.xml
 create mode 100644 testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/BusinessWorkerUnitTest.java
 create mode 100644 testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/MemoryAppender.java
 create mode 100644 testing-modules/testing-assertions/src/test/resources/logback.xml

diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml
index 951909b36f..b467b3c503 100644
--- a/testing-modules/pom.xml
+++ b/testing-modules/pom.xml
@@ -33,6 +33,7 @@
         <module>selenium-junit-testng</module>
         <module>spring-testing</module>
         <module>test-containers</module>
+        <module>testing-assertions</module>
         <module>testng</module>
         <module>junit-5-basics</module>
         <module>easymock</module>
diff --git a/testing-modules/testing-assertions/pom.xml b/testing-modules/testing-assertions/pom.xml
new file mode 100644
index 0000000000..0a7c4b0860
--- /dev/null
+++ b/testing-modules/testing-assertions/pom.xml
@@ -0,0 +1,28 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>testing-assertions</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-java</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../../parent-java</relativePath>
+    </parent>
+    
+    <dependencies>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>3.15.0</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/testing-modules/testing-assertions/src/main/java/com/baeldung/junit/log/BusinessWorker.java b/testing-modules/testing-assertions/src/main/java/com/baeldung/junit/log/BusinessWorker.java
new file mode 100644
index 0000000000..86cd38824c
--- /dev/null
+++ b/testing-modules/testing-assertions/src/main/java/com/baeldung/junit/log/BusinessWorker.java
@@ -0,0 +1,16 @@
+package com.baeldung.junit.log;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BusinessWorker {
+    private static Logger LOGGER = LoggerFactory.getLogger(BusinessWorker.class);
+
+    public void generateLogs(String msg) {
+        LOGGER.trace(msg);
+        LOGGER.debug(msg);
+        LOGGER.info(msg);
+        LOGGER.warn(msg);
+        LOGGER.error(msg);
+    }
+}
diff --git a/testing-modules/testing-assertions/src/main/resources/logback.xml b/testing-modules/testing-assertions/src/main/resources/logback.xml
new file mode 100644
index 0000000000..d485da62ff
--- /dev/null
+++ b/testing-modules/testing-assertions/src/main/resources/logback.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>
+                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
+            </Pattern>
+        </layout>
+    </appender>
+    <logger name="com.baeldung.junit.log" level="debug" additivity="false">
+        <appender-ref ref="CONSOLE"/>
+    </logger>
+    <root level="error">
+        <appender-ref ref="CONSOLE"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/BusinessWorkerUnitTest.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/BusinessWorkerUnitTest.java
new file mode 100644
index 0000000000..9200caf13d
--- /dev/null
+++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/BusinessWorkerUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.junit.log;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+
+public class BusinessWorkerUnitTest {
+    private static MemoryAppender memoryAppender;
+    private static final String LOGGER_NAME = "com.baeldung.junit.log";
+    private static final String MSG = "This is a test message!!!";
+
+    @Before
+    public void setup() {
+        Logger logger = (Logger) LoggerFactory.getLogger(LOGGER_NAME);
+        memoryAppender = new MemoryAppender();
+        memoryAppender.setContext((LoggerContext) LoggerFactory.getILoggerFactory());
+        logger.setLevel(Level.DEBUG);
+        logger.addAppender(memoryAppender);
+        memoryAppender.start();
+
+    }
+
+    @After
+    public void cleanUp() {
+        memoryAppender.reset();
+        memoryAppender.stop();
+    }
+
+    @Test
+    public void test() {
+        BusinessWorker worker = new BusinessWorker();
+        worker.generateLogs(MSG);
+        
+        // I check that I only have 4 messages (all but trace)
+        assertThat(memoryAppender.countEventsForLogger(LOGGER_NAME)).isEqualTo(4);
+        // I look for a specific message at a specific level, and I only have 1
+        assertThat(memoryAppender.search(MSG, Level.INFO).size()).isEqualTo(1);
+        // I check that the entry that is not present is the trace level
+        assertThat(memoryAppender.contains(MSG, Level.TRACE)).isFalse();
+    }
+}
diff --git a/testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/MemoryAppender.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/MemoryAppender.java
new file mode 100644
index 0000000000..31c5c69766
--- /dev/null
+++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/MemoryAppender.java
@@ -0,0 +1,51 @@
+package com.baeldung.junit.log;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
+
+/**
+ * In memory slf4j appender<br/>
+ * Convenient appender to be able to check slf4j invocations
+ */
+public class MemoryAppender extends ListAppender<ILoggingEvent> {
+    public void reset() {
+        this.list.clear();
+    }
+
+    public boolean contains(String string, Level level) {
+        return this.list.stream()
+          .anyMatch(event -> event.getMessage().toString().contains(string) 
+            && event.getLevel().equals(level));
+    }
+
+    public int countEventsForLogger(String loggerName) {
+        return (int) this.list.stream()
+          .filter(event -> event.getLoggerName().contains(loggerName)).count();
+    }
+
+    public List<ILoggingEvent> search(String string) {
+        return this.list.stream()
+          .filter(event -> event.getMessage().toString().contains(string))
+          .collect(Collectors.toList());
+    }
+
+    public List<ILoggingEvent> search(String string, Level level) {
+        return this.list.stream()
+          .filter(event -> event.getMessage().toString().contains(string) 
+            && event.getLevel().equals(level))
+          .collect(Collectors.toList());
+    }
+
+    public int getSize() {
+        return this.list.size();
+    }
+
+    public List<ILoggingEvent> getLoggedEvents() {
+        return Collections.unmodifiableList(this.list);
+    }
+}
diff --git a/testing-modules/testing-assertions/src/test/resources/logback.xml b/testing-modules/testing-assertions/src/test/resources/logback.xml
new file mode 100644
index 0000000000..980ce897ff
--- /dev/null
+++ b/testing-modules/testing-assertions/src/test/resources/logback.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>
+                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
+            </Pattern>
+        </layout>
+    </appender>
+    <root level="error">
+        <appender-ref ref="CONSOLE"/>
+    </root>
+</configuration>
\ No newline at end of file

From ab9e0e164fe3662deaf3697f5e8cfa440217eac6 Mon Sep 17 00:00:00 2001
From: Roque Santos <roquesantosdev@gmail.com>
Date: Mon, 4 May 2020 13:37:38 -0300
Subject: [PATCH 182/404] BAEL-3842 : How to add proxy support to Jsoup (#9202)

---
 .../jsonproxy/JsoupProxyIntegrationTest.java  | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java

diff --git a/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java b/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java
new file mode 100644
index 0000000000..8e854ead6a
--- /dev/null
+++ b/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.jsonproxy;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+
+import org.jsoup.Jsoup;
+import org.junit.Test;
+
+public class JsoupProxyIntegrationTest {
+
+    @Test
+    public void whenUsingHostAndPort_thenConnect() throws IOException {
+        Jsoup.connect("https://spring.io/blog")
+            .proxy("200.216.227.141", 53281)
+            .get();
+    }
+
+    @Test
+    public void whenUsingProxyClass_thenConnect() throws IOException {
+        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("200.216.227.141", 53281));
+
+        Jsoup.connect("https://spring.io/blog")
+            .proxy(proxy)
+            .get();
+    }
+}

From aee002eecaae940b0164a5ec44b136a00f794406 Mon Sep 17 00:00:00 2001
From: Benjamin Caure <bcaure@gmail.com>
Date: Mon, 4 May 2020 22:00:03 +0200
Subject: [PATCH 183/404] rename integration to live test (#9232)

---
 ...ationTest.java => BsonToJsonLiveTest.java} | 284 +++++++++---------
 1 file changed, 142 insertions(+), 142 deletions(-)
 rename persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/{BsonToJsonIntegrationTest.java => BsonToJsonLiveTest.java} (96%)

diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java
similarity index 96%
rename from persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java
rename to persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java
index e382ea4ab2..4e70394069 100644
--- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java
+++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java
@@ -1,142 +1,142 @@
-package com.baeldung.bsontojson;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Timestamp;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.TimeZone;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.bson.Document;
-import org.bson.json.Converter;
-import org.bson.json.JsonMode;
-import org.bson.json.JsonWriterSettings;
-import org.bson.json.StrictJsonWriter;
-import org.bson.types.ObjectId;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.jupiter.api.AfterEach;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.baeldung.morphia.domain.Book;
-import com.baeldung.morphia.domain.Publisher;
-import com.mongodb.MongoClient;
-import com.mongodb.client.MongoDatabase;
-
-import dev.morphia.Datastore;
-import dev.morphia.Morphia;
-
-public class BsonToJsonIntegrationTest {
-    
-    private static final String DB_NAME = "library";
-    private static Datastore datastore;
-
-    @BeforeClass
-    public static void setUp() {
-        Morphia morphia = new Morphia();
-        morphia.mapPackage("com.baeldung.morphia");
-        datastore = morphia.createDatastore(new MongoClient(), DB_NAME);
-        datastore.ensureIndexes();
-        
-        datastore.save(new Book()
-            .setIsbn("isbn")
-            .setTitle("title")
-            .setAuthor("author")
-            .setCost(3.95)
-            .setPublisher(new Publisher(new ObjectId("fffffffffffffffffffffffa"),"publisher"))
-            .setPublishDate(LocalDateTime.parse("2020-01-01T18:13:32Z", DateTimeFormatter.ISO_DATE_TIME))
-            .addCompanionBooks(new Book().setIsbn("isbn2")));
-    }
-    
-    @AfterClass
-    public static void tearDown() {
-        datastore.delete(datastore.createQuery(Book.class));
-    }
-
-    @Test
-    public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime() {
-
-        String json = null;
-        try (MongoClient mongoClient = new MongoClient()) {
-            MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME);
-            Document bson = mongoDatabase.getCollection("Books").find().first();
-            json = bson.toJson();
-        }
-        
-        String expectedJson = "{\"_id\": \"isbn\", " + 
-            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
-            "\"title\": \"title\", " + 
-            "\"author\": \"author\", " + 
-            "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
-            "\"name\": \"publisher\"}, " + 
-            "\"price\": 3.95, " + 
-            "\"publishDate\": {\"$date\": 1577898812000}}";
-
-        assertNotNull(json);
-        
-        assertEquals(expectedJson, json);
-    }
-    
-
-    @Test
-    public void givenBsonDocument_whenUsingRelaxedJsonTransformation_thenJsonDateIsObjectIsoDate() {
-   
-        String json = null;
-        try (MongoClient mongoClient = new MongoClient()) {
-            MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME);
-            Document bson = mongoDatabase.getCollection("Books").find().first();
-            json = bson.toJson(JsonWriterSettings
-                .builder()
-                .outputMode(JsonMode.RELAXED)
-                .build());
-        }
-        
-        String expectedJson = "{\"_id\": \"isbn\", " + 
-            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
-            "\"title\": \"title\", " + 
-            "\"author\": \"author\", " + 
-            "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
-            "\"name\": \"publisher\"}, " + 
-            "\"price\": 3.95, " + 
-            "\"publishDate\": {\"$date\": \"2020-01-01T17:13:32Z\"}}";
-
-        assertNotNull(json);
-        
-        assertEquals(expectedJson, json);
-    }
-    
-    @Test
-    public void givenBsonDocument_whenUsingCustomJsonTransformation_thenJsonDateIsStringField() {
-
-        String json = null;
-        try (MongoClient mongoClient = new MongoClient()) {
-            MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME);
-            Document bson = mongoDatabase.getCollection("Books").find().first();
-            json = bson.toJson(JsonWriterSettings
-                .builder()
-                .dateTimeConverter(new JsonDateTimeConverter())
-                .build());
-        }
-
-        String expectedJson = "{\"_id\": \"isbn\", " + 
-            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
-            "\"title\": \"title\", " + 
-            "\"author\": \"author\", " + 
-            "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
-            "\"name\": \"publisher\"}, " + 
-            "\"price\": 3.95, " + 
-            "\"publishDate\": \"2020-01-01T17:13:32Z\"}";
-
-        assertEquals(expectedJson, json);
-
-    }
-
-}
+package com.baeldung.bsontojson;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.bson.Document;
+import org.bson.json.Converter;
+import org.bson.json.JsonMode;
+import org.bson.json.JsonWriterSettings;
+import org.bson.json.StrictJsonWriter;
+import org.bson.types.ObjectId;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.morphia.domain.Book;
+import com.baeldung.morphia.domain.Publisher;
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoDatabase;
+
+import dev.morphia.Datastore;
+import dev.morphia.Morphia;
+
+public class BsonToJsonLiveTest {
+    
+    private static final String DB_NAME = "library";
+    private static Datastore datastore;
+
+    @BeforeClass
+    public static void setUp() {
+        Morphia morphia = new Morphia();
+        morphia.mapPackage("com.baeldung.morphia");
+        datastore = morphia.createDatastore(new MongoClient(), DB_NAME);
+        datastore.ensureIndexes();
+        
+        datastore.save(new Book()
+            .setIsbn("isbn")
+            .setTitle("title")
+            .setAuthor("author")
+            .setCost(3.95)
+            .setPublisher(new Publisher(new ObjectId("fffffffffffffffffffffffa"),"publisher"))
+            .setPublishDate(LocalDateTime.parse("2020-01-01T18:13:32Z", DateTimeFormatter.ISO_DATE_TIME))
+            .addCompanionBooks(new Book().setIsbn("isbn2")));
+    }
+    
+    @AfterClass
+    public static void tearDown() {
+        datastore.delete(datastore.createQuery(Book.class));
+    }
+
+    @Test
+    public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime() {
+
+        String json = null;
+        try (MongoClient mongoClient = new MongoClient()) {
+            MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME);
+            Document bson = mongoDatabase.getCollection("Books").find().first();
+            json = bson.toJson();
+        }
+        
+        String expectedJson = "{\"_id\": \"isbn\", " + 
+            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
+            "\"title\": \"title\", " + 
+            "\"author\": \"author\", " + 
+            "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
+            "\"name\": \"publisher\"}, " + 
+            "\"price\": 3.95, " + 
+            "\"publishDate\": {\"$date\": 1577898812000}}";
+
+        assertNotNull(json);
+        
+        assertEquals(expectedJson, json);
+    }
+    
+
+    @Test
+    public void givenBsonDocument_whenUsingRelaxedJsonTransformation_thenJsonDateIsObjectIsoDate() {
+   
+        String json = null;
+        try (MongoClient mongoClient = new MongoClient()) {
+            MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME);
+            Document bson = mongoDatabase.getCollection("Books").find().first();
+            json = bson.toJson(JsonWriterSettings
+                .builder()
+                .outputMode(JsonMode.RELAXED)
+                .build());
+        }
+        
+        String expectedJson = "{\"_id\": \"isbn\", " + 
+            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
+            "\"title\": \"title\", " + 
+            "\"author\": \"author\", " + 
+            "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
+            "\"name\": \"publisher\"}, " + 
+            "\"price\": 3.95, " + 
+            "\"publishDate\": {\"$date\": \"2020-01-01T17:13:32Z\"}}";
+
+        assertNotNull(json);
+        
+        assertEquals(expectedJson, json);
+    }
+    
+    @Test
+    public void givenBsonDocument_whenUsingCustomJsonTransformation_thenJsonDateIsStringField() {
+
+        String json = null;
+        try (MongoClient mongoClient = new MongoClient()) {
+            MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME);
+            Document bson = mongoDatabase.getCollection("Books").find().first();
+            json = bson.toJson(JsonWriterSettings
+                .builder()
+                .dateTimeConverter(new JsonDateTimeConverter())
+                .build());
+        }
+
+        String expectedJson = "{\"_id\": \"isbn\", " + 
+            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
+            "\"title\": \"title\", " + 
+            "\"author\": \"author\", " + 
+            "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
+            "\"name\": \"publisher\"}, " + 
+            "\"price\": 3.95, " + 
+            "\"publishDate\": \"2020-01-01T17:13:32Z\"}";
+
+        assertEquals(expectedJson, json);
+
+    }
+
+}

From 2d7bc17dda09aa2a524963ec5f3a3739e977fdd7 Mon Sep 17 00:00:00 2001
From: SippingCode <55111084+SippingCode@users.noreply.github.com>
Date: Tue, 5 May 2020 00:08:00 +0200
Subject: [PATCH 184/404] Bael 3970 (#9236)

* Manual logout with Spring Security
- Basic manual logout
- logout with Clear Data Site Header

* Add missing annotation for controller. Change mapping URL value.

* Add intergration tests for manual logouts.

* BAEL-3970 - Add asserts on test. Fix tests names. Remove unused imports.

* BAEL-3970 - Use PostMapping annotation. Remove unnecessary information for security configuration.

* remove logout controllers

* Add multiple entrypoints configurations. Create custom handlers for different logouts (basic, cookie clearing, clear-site-data).

* Refactor configuration with lambda DSL.

* BAEL-3970 - Remove unnecessary handler for basic logout. Fix integration tests for basic logout.
---
 .../SimpleSecurityConfiguration.java          | 58 +++++++++----------
 .../ManualLogoutIntegrationTest.java          |  9 +--
 2 files changed, 29 insertions(+), 38 deletions(-)

diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java
index 63394b64f2..08c2d83b99 100644
--- a/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java
+++ b/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java
@@ -2,14 +2,12 @@ package com.baeldung.manuallogout;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.annotation.Order;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler;
 import org.springframework.security.web.authentication.logout.HeaderWriterLogoutHandler;
 import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
-import org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices;
 import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter;
 
 import javax.servlet.http.Cookie;
@@ -26,13 +24,11 @@ public class SimpleSecurityConfiguration {
         @Override
         protected void configure(HttpSecurity http) throws Exception {
             http
-                    .antMatcher("/basic/**")
-                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
-                    .logout(logout -> logout
-                            .logoutUrl("/basic/basiclogout")
-                            .addLogoutHandler(new SecurityContextLogoutHandler())
-                            .addLogoutHandler(new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY))
-                    );
+                .antMatcher("/basic/**")
+                .authorizeRequests(authz -> authz.anyRequest().permitAll())
+                .logout(logout -> logout
+                    .logoutUrl("/basic/basiclogout")
+                );
         }
     }
 
@@ -42,20 +38,20 @@ public class SimpleSecurityConfiguration {
         @Override
         protected void configure(HttpSecurity http) throws Exception {
             http
-                    .antMatcher("/cookies/**")
-                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
-                    .logout(logout -> logout
-                            .logoutUrl("/cookies/cookielogout")
-                            .addLogoutHandler(new SecurityContextLogoutHandler())
-                            .addLogoutHandler((request, response, auth) -> {
-                                        for (Cookie cookie : request.getCookies()) {
-                                            String cookieName = cookie.getName();
-                                            Cookie cookieToDelete = new Cookie(cookieName, null);
-                                            cookieToDelete.setMaxAge(0);
-                                            response.addCookie(cookieToDelete);
-                                        }
-                                    }
-                            ));
+                .antMatcher("/cookies/**")
+                .authorizeRequests(authz -> authz.anyRequest().permitAll())
+                .logout(logout -> logout
+                    .logoutUrl("/cookies/cookielogout")
+                    .addLogoutHandler(new SecurityContextLogoutHandler())
+                    .addLogoutHandler((request, response, auth) -> {
+                        for (Cookie cookie : request.getCookies()) {
+                            String cookieName = cookie.getName();
+                            Cookie cookieToDelete = new Cookie(cookieName, null);
+                            cookieToDelete.setMaxAge(0);
+                            response.addCookie(cookieToDelete);
+                        }
+                    })
+                );
         }
     }
 
@@ -64,17 +60,17 @@ public class SimpleSecurityConfiguration {
     public static class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter {
 
         private static final ClearSiteDataHeaderWriter.Directive[] SOURCE =
-                { CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS };
+            {CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS};
 
         @Override
         protected void configure(HttpSecurity http) throws Exception {
             http
-                    .antMatcher("/csd/**")
-                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
-                    .logout(logout -> logout
-                            .logoutUrl("/csd/csdlogout")
-                            .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE)))
-                    );
+                .antMatcher("/csd/**")
+                .authorizeRequests(authz -> authz.anyRequest().permitAll())
+                .logout(logout -> logout
+                    .logoutUrl("/csd/csdlogout")
+                    .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE)))
+                );
         }
     }
 }
diff --git a/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java b/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java
index 09e7daf877..8909dc2620 100644
--- a/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java
+++ b/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java
@@ -39,15 +39,10 @@ public class ManualLogoutIntegrationTest {
     @Test
     public void givenLoggedUserWhenUserLogoutThenSessionClearedAndNecessaryCookieCleared() throws Exception {
 
-        MockHttpServletRequest requestStateAfterLogout = this.mockMvc.perform(post("/basic/basiclogout").secure(true).with(csrf()))
+        this.mockMvc.perform(post("/basic/basiclogout").secure(true).with(csrf()))
                 .andExpect(status().is3xxRedirection())
                 .andExpect(unauthenticated())
-                .andExpect(cookie().maxAge(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, 0))
-                .andReturn()
-                .getRequest();
-
-        HttpSession sessionStateAfterLogout = requestStateAfterLogout.getSession();
-        assertNull(sessionStateAfterLogout.getAttribute(ATTRIBUTE_NAME));
+                .andReturn();
     }
 
     @WithMockUser(value = "spring")

From 7f4368556772836b2dd53b3360c8a735b742290b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 08:35:36 +0800
Subject: [PATCH 185/404] Update README.md

---
 libraries-3/README.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libraries-3/README.md b/libraries-3/README.md
index ec433960ef..62bd3b9f66 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -16,4 +16,3 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
 - [Introduction to Takes](https://www.baeldung.com/java-takes)
 - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
 - [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro)
-- [Quick Guide to Spring Cloud Circuit Breaker](https://www.baeldung.com/spring-cloud-circuit-breaker)

From dd4b25e855a1a94127f73420b92f1ee285cb3123 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 08:43:18 +0800
Subject: [PATCH 186/404] Update README.md

---
 spring-mvc-basics-2/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-mvc-basics-2/README.md b/spring-mvc-basics-2/README.md
index e52459bd6e..673b7b1fef 100644
--- a/spring-mvc-basics-2/README.md
+++ b/spring-mvc-basics-2/README.md
@@ -9,7 +9,7 @@ This module contains articles about Spring MVC
 - [Servlet Redirect vs Forward](https://www.baeldung.com/servlet-redirect-forward)
 - [Apache Tiles Integration with Spring MVC](https://www.baeldung.com/spring-mvc-apache-tiles)
 - [Guide to Spring Email](https://www.baeldung.com/spring-email)
-- [Using ThymeLeaf and FreeMarker Emails Templates with Spring](https://www.baeldung.com/thymeleaf-freemarker-email)
+- [Using ThymeLeaf and FreeMarker Emails Templates with Spring](https://www.baeldung.com/spring-email-templates)
 - [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405)
 - [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param)
 - More articles: [[more -->]](/spring-mvc-basics-3)

From 1f95843c36f170d285b432d61091d7989b89cbdd Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 08:47:17 +0800
Subject: [PATCH 187/404] Delete README.md

---
 bazel/bazelapp/README.md | 3 ---
 1 file changed, 3 deletions(-)
 delete mode 100644 bazel/bazelapp/README.md

diff --git a/bazel/bazelapp/README.md b/bazel/bazelapp/README.md
deleted file mode 100644
index 528f797c21..0000000000
--- a/bazel/bazelapp/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool)

From e164ae4c72a806049f4054947b28c3df1194a0e0 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 08:53:16 +0800
Subject: [PATCH 188/404] Delete README.md

---
 oauth2-framework-impl/oauth2-authorization-server/README.md | 3 ---
 1 file changed, 3 deletions(-)
 delete mode 100644 oauth2-framework-impl/oauth2-authorization-server/README.md

diff --git a/oauth2-framework-impl/oauth2-authorization-server/README.md b/oauth2-framework-impl/oauth2-authorization-server/README.md
deleted file mode 100644
index 4bcb9790b1..0000000000
--- a/oauth2-framework-impl/oauth2-authorization-server/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation)

From 33fa3b7275fe96aaee04a14f7f8a9dfcdb1aca59 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 08:57:04 +0800
Subject: [PATCH 189/404] Delete README.md

---
 oauth2-framework-impl/oauth2-resource-server/README.md | 3 ---
 1 file changed, 3 deletions(-)
 delete mode 100644 oauth2-framework-impl/oauth2-resource-server/README.md

diff --git a/oauth2-framework-impl/oauth2-resource-server/README.md b/oauth2-framework-impl/oauth2-resource-server/README.md
deleted file mode 100644
index 4bcb9790b1..0000000000
--- a/oauth2-framework-impl/oauth2-resource-server/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation)

From caca2dbea73fa638ff7fd24d2798c0296bf07e99 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 09:00:24 +0800
Subject: [PATCH 190/404] Update README.md

---
 spring-swagger-codegen/spring-swagger-codegen-app/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/README.md b/spring-swagger-codegen/spring-swagger-codegen-app/README.md
index 1cb9e35d99..8740b17ba3 100644
--- a/spring-swagger-codegen/spring-swagger-codegen-app/README.md
+++ b/spring-swagger-codegen/spring-swagger-codegen-app/README.md
@@ -1,3 +1,3 @@
 ## Spring Swagger Codegen App
 
-This module contains the code for [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen).
+This module contains the code for Generate Spring Boot REST Client with Swagger.

From 0167480f880aae12f1af7bfd5a6b7ce81a7eb6e4 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 09:21:38 +0800
Subject: [PATCH 191/404] Update README.md

---
 core-java-modules/core-java-concurrency-2/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md
index ab7eebc26a..23471a237e 100644
--- a/core-java-modules/core-java-concurrency-2/README.md
+++ b/core-java-modules/core-java-concurrency-2/README.md
@@ -4,5 +4,5 @@
 
 ### Relevant Articles: 
 - [Using a Mutex Object in Java](https://www.baeldung.com/java-mutex)
-- [Testing Multi-Threaded Code in Java] (https://www.baeldung.com/java-testing-multithreaded)
+- [Testing Multi-Threaded Code in Java](https://www.baeldung.com/java-testing-multithreaded)
 

From 714d60351b93e1dac87065e88e8c27dc93075217 Mon Sep 17 00:00:00 2001
From: Kirill Vlasov <mail@kvlasov.ru>
Date: Tue, 5 May 2020 11:44:30 +0500
Subject: [PATCH 192/404] Replacing postgres database with h2 for integration
 test

---
 .../resources/customlogouthandler/application.properties   | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties
index 9edd853f2c..84347c2664 100644
--- a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties
@@ -1,5 +1,4 @@
-spring.datasource.url=jdbc:postgresql://localhost:5432/test
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
 spring.datasource.username=test
-spring.datasource.password=test
-
-spring.jpa.hibernate.ddl-auto=create
+spring.datasource.password=test
\ No newline at end of file

From d95a78b1924fe104b8de116bfc8c4e306ec52199 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 15:26:18 +0800
Subject: [PATCH 193/404] Update README.md

---
 spring-core-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-core-2/README.md b/spring-core-2/README.md
index 947b816db8..10d3080b45 100644
--- a/spring-core-2/README.md
+++ b/spring-core-2/README.md
@@ -14,4 +14,5 @@ This module contains articles about core Spring functionality
 - [Spring Events](https://www.baeldung.com/spring-events)
 - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
 - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
+- [Running Setup Data on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
 - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3)

From 0cad7c5cc584059d15901f9270214e07dc533294 Mon Sep 17 00:00:00 2001
From: Eduard Ardeleanu <eduard-andrei.ardeleanu@1and1.ro>
Date: Tue, 5 May 2020 10:37:20 +0300
Subject: [PATCH 194/404] BAEL-3971: Generate DDL script in Spring (#9120)

* BAEL-3971: Generate DDL script in Spring

* BAEL-3971: implement review comments

* BAEL-3971: fix typo

* BAEL-3971: move code examples to module spring-data-jpa-5

Co-authored-by: ashleyfrieze <ashley@incredible.org.uk>
---
 persistence-modules/pom.xml                   |  1 +
 .../spring-data-jpa-5/README.md               |  2 +
 persistence-modules/spring-data-jpa-5/pom.xml |  2 +-
 .../schemageneration/AccountApplication.java  | 12 +++
 .../schemageneration/HibernateUtil.java       | 39 ++++++++++
 .../schemageneration/model/Account.java       | 74 +++++++++++++++++++
 .../model/AccountSetting.java                 | 68 +++++++++++++++++
 .../repository/AccountRepository.java         |  8 ++
 .../repository/AccountSettingRepository.java  |  8 ++
 .../src/main/resources/application.properties | 11 +++
 .../AccountRepositoryIntegrationTest.java     | 72 ++++++++++++++++++
 .../resources/application-test.properties     |  2 +
 12 files changed, 298 insertions(+), 1 deletion(-)
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java
 create mode 100644 persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java

diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index ec7f0bcec2..78da896861 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -61,6 +61,7 @@
         <module>spring-data-jpa-2</module>
         <module>spring-data-jpa-3</module>
         <module>spring-data-jpa-4</module>
+        <module>spring-data-jpa-5</module>
         <module>spring-data-keyvalue</module>
         <module>spring-data-mongodb</module>
         <module>spring-data-neo4j</module>
diff --git a/persistence-modules/spring-data-jpa-5/README.md b/persistence-modules/spring-data-jpa-5/README.md
index dd4ac22e4a..e8f83654df 100644
--- a/persistence-modules/spring-data-jpa-5/README.md
+++ b/persistence-modules/spring-data-jpa-5/README.md
@@ -1,4 +1,5 @@
 ### Relevant Articles: 
+
 - [Spring JPA @Embedded and @EmbeddedId](TBD)
 
 ### Eclipse Config 
@@ -9,3 +10,4 @@ This can be ignored:
 - Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
 Or: 
 - Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator 
+
diff --git a/persistence-modules/spring-data-jpa-5/pom.xml b/persistence-modules/spring-data-jpa-5/pom.xml
index 7f2c724f98..3053384559 100644
--- a/persistence-modules/spring-data-jpa-5/pom.xml
+++ b/persistence-modules/spring-data-jpa-5/pom.xml
@@ -33,5 +33,5 @@
             <artifactId>h2</artifactId>
         </dependency>
     </dependencies>
-
 </project>
+
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java
new file mode 100644
index 0000000000..547992a6c1
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.schemageneration;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AccountApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AccountApplication.class, args);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java
new file mode 100644
index 0000000000..7d69d65705
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java
@@ -0,0 +1,39 @@
+package com.baeldung.schemageneration;
+
+import com.baeldung.schemageneration.model.Account;
+import com.baeldung.schemageneration.model.AccountSetting;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistry;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Environment;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.schema.TargetType;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HibernateUtil {
+
+    /**
+     * Generates database create commands for the specified entities using Hibernate native API, SchemaExport.
+     * Creation commands are exported into the create.sql file.
+     */
+    public static void generateSchema() {
+        Map<String, String> settings = new HashMap<>();
+        settings.put(Environment.URL, "jdbc:h2:mem:schema");
+
+        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(settings).build();
+
+        MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+        metadataSources.addAnnotatedClass(Account.class);
+        metadataSources.addAnnotatedClass(AccountSetting.class);
+        Metadata metadata = metadataSources.buildMetadata();
+
+        SchemaExport schemaExport = new SchemaExport();
+        schemaExport.setFormat(true);
+        schemaExport.setOutputFile("create.sql");
+        schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT), metadata);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java
new file mode 100644
index 0000000000..785e275e26
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java
@@ -0,0 +1,74 @@
+package com.baeldung.schemageneration.model;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Table(name = "accounts")
+public class Account {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(nullable = false, length = 100)
+    private String name;
+
+    @Column(name = "email_address")
+    private String emailAddress;
+
+    @OneToMany(mappedBy = "account", cascade = CascadeType.ALL)
+    private List<AccountSetting> accountSettings = new ArrayList<>();
+
+    public Account() {
+    }
+
+    public Account(String name, String emailAddress) {
+        this.name = name;
+        this.emailAddress = emailAddress;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEmailAddress() {
+        return emailAddress;
+    }
+
+    public void setEmailAddress(String emailAddress) {
+        this.emailAddress = emailAddress;
+    }
+
+    public List<AccountSetting> getAccountSettings() {
+        return accountSettings;
+    }
+
+    public void setAccountSettings(List<AccountSetting> accountSettings) {
+        this.accountSettings = accountSettings;
+    }
+
+    public void addAccountSetting(AccountSetting setting) {
+        this.accountSettings.add(setting);
+        setting.setAccount(this);
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java
new file mode 100644
index 0000000000..61e43894a8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java
@@ -0,0 +1,68 @@
+package com.baeldung.schemageneration.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "account_settings")
+public class AccountSetting {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "name", nullable = false)
+    private String settingName;
+
+    @Column(name = "value", nullable = false)
+    private String settingValue;
+
+    @ManyToOne()
+    @JoinColumn(name ="account_id", nullable = false)
+    private Account account;
+
+    public AccountSetting() {
+    }
+
+    public AccountSetting(String settingName, String settingValue) {
+        this.settingName = settingName;
+        this.settingValue = settingValue;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSettingName() {
+        return settingName;
+    }
+
+    public void setSettingName(String settingName) {
+        this.settingName = settingName;
+    }
+
+    public String getSettingValue() {
+        return settingValue;
+    }
+
+    public void setSettingValue(String settingValue) {
+        this.settingValue = settingValue;
+    }
+
+    public Account getAccount() {
+        return account;
+    }
+
+    public void setAccount(Account account) {
+        this.account = account;
+    }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java
new file mode 100644
index 0000000000..dc57ffe6d3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.schemageneration.repository;
+
+import com.baeldung.schemageneration.model.Account;
+import org.springframework.data.repository.CrudRepository;
+
+public interface AccountRepository extends CrudRepository<Account, Long> {
+    Account findByName(String name);
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java
new file mode 100644
index 0000000000..c2b8ff7398
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.schemageneration.repository;
+
+import com.baeldung.schemageneration.model.AccountSetting;
+import org.springframework.data.repository.CrudRepository;
+
+public interface AccountSettingRepository extends CrudRepository<AccountSetting, Long> {
+    AccountSetting findByAccountId(Long accountId);
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
index dfc5e56e33..f55ad438ff 100644
--- a/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
@@ -1,2 +1,13 @@
+
+spring.datasource.url=jdbc:h2:mem:baeldung
+
+# JPA-Schema-Generation
+# Use below configuration to generate database schema create commands based on the entity models
+# and export them into the create.sql file
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
+#spring.jpa.properties.hibernate.format_sql=true
+
 spring.jpa.show-sql=true
 
diff --git a/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..86a7671fe4
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.schemageneration;
+
+import com.baeldung.schemageneration.model.Account;
+import com.baeldung.schemageneration.model.AccountSetting;
+import com.baeldung.schemageneration.repository.AccountRepository;
+import com.baeldung.schemageneration.repository.AccountSettingRepository;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = AccountApplication.class)
+public class AccountRepositoryIntegrationTest {
+
+    private static final String USER_NAME = "Eduard";
+    private static final String USER_EMAIL_ADDRESS = "eduard@gmx.com";
+    private static final String ACCOUNT_SETTING_NAME = "Timezone";
+    private static final String ACCOUNT_SETTING_VALUE = "UTC+02";
+
+    @Autowired
+    private AccountRepository accountRepository;
+
+    @Autowired
+    private AccountSettingRepository accountSettingRepository;
+
+    @After
+    public void tearDown() {
+        accountRepository.deleteAll();
+    }
+
+    @Test
+    public void givenNewAccount_whenSave_thenSuccess() {
+        Account account = new Account(USER_NAME, USER_EMAIL_ADDRESS);
+        accountRepository.save(account);
+
+        assertEquals(1, accountRepository.count());
+    }
+
+    @Test
+    public void givenSavedAccount_whenFindByName_thenFound() {
+        Account account = new Account(USER_NAME, USER_EMAIL_ADDRESS);
+        accountRepository.save(account);
+
+        Account accountFound = accountRepository.findByName(USER_NAME);
+
+        assertNotNull(accountFound);
+        assertEquals(USER_NAME, accountFound.getName());
+        assertEquals(USER_EMAIL_ADDRESS, accountFound.getEmailAddress());
+    }
+
+    @Test
+    public void givenSavedAccount_whenAccountSettingIsAdded_thenPersisted() {
+        Account account = new Account(USER_NAME, USER_EMAIL_ADDRESS);
+        account.addAccountSetting(new AccountSetting(ACCOUNT_SETTING_NAME, ACCOUNT_SETTING_VALUE));
+        accountRepository.save(account);
+
+        Account accountFound = accountRepository.findByName(USER_NAME);
+        assertNotNull(accountFound);
+        AccountSetting accountSetting = accountSettingRepository.findByAccountId(accountFound.getId());
+
+        assertNotNull(accountSetting);
+        assertEquals(ACCOUNT_SETTING_NAME, accountSetting.getSettingName());
+        assertEquals(ACCOUNT_SETTING_VALUE, accountSetting.getSettingValue());
+    }
+
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
index 207de2e8ec..e3d39fe1e2 100644
--- a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
+++ b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
@@ -1 +1,3 @@
 spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:h2:mem:baeldung
+

From efa810462107cdbc98de292f81eb4c7c1c72fccd Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 16:42:15 +0800
Subject: [PATCH 195/404] Update README.md

---
 spring-thymeleaf-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-thymeleaf-2/README.md b/spring-thymeleaf-2/README.md
index d5c5ead43d..d2d10f81da 100644
--- a/spring-thymeleaf-2/README.md
+++ b/spring-thymeleaf-2/README.md
@@ -13,4 +13,5 @@ This module contains articles about Spring with Thymeleaf
 - [Working with Boolean in Thymeleaf](https://www.baeldung.com/thymeleaf-boolean)
 - [Working With Custom HTML Attributes in Thymeleaf](https://www.baeldung.com/thymeleaf-custom-html-attributes)
 - [How to Create an Executable JAR with Maven](https://www.baeldung.com/executable-jar-with-maven)
+- [https://www.baeldung.com/spring-mvc-thymeleaf-data](https://www.baeldung.com/spring-mvc-thymeleaf-data)
 - [[<-- prev]](/spring-thymeleaf)

From 66cf67cc7c6ac5b21efbcf47fd50ef2f466c598a Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 16:45:16 +0800
Subject: [PATCH 196/404] Update README.md

---
 spring-cloud/spring-cloud-circuit-breaker/README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/spring-cloud/spring-cloud-circuit-breaker/README.md b/spring-cloud/spring-cloud-circuit-breaker/README.md
index 040eb0ccee..894be93408 100644
--- a/spring-cloud/spring-cloud-circuit-breaker/README.md
+++ b/spring-cloud/spring-cloud-circuit-breaker/README.md
@@ -3,3 +3,5 @@
 This module contains articles about Spring Cloud Circuit Breaker
 
 ### Relevant Articles:
+
+- [Quick Guide to Spring Cloud Circuit Breaker](https://www.baeldung.com/spring-cloud-circuit-breaker)

From 38bc3707712404e25431a2c1d1b8ba2222eb3984 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 16:47:03 +0800
Subject: [PATCH 197/404] Update README.md

---
 persistence-modules/hibernate-jpa/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/hibernate-jpa/README.md b/persistence-modules/hibernate-jpa/README.md
index fb48f975bc..514fcedb8a 100644
--- a/persistence-modules/hibernate-jpa/README.md
+++ b/persistence-modules/hibernate-jpa/README.md
@@ -14,3 +14,4 @@ This module contains articles specific to use of Hibernate as a JPA implementati
 - [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception)
 - [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context)
 - [Quick Guide to EntityManager#getReference()](https://www.baeldung.com/jpa-entity-manager-get-reference)
+- [Hibernate Error “No Persistence Provider for EntityManager”](https://www.baeldung.com/hibernate-no-persistence-provider)

From 66832ae37ec0c57512b8466c5feed6867a0b81be Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 16:51:28 +0800
Subject: [PATCH 198/404] Update README.md

---
 core-java-modules/core-java-streams-3/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md
index 05c4b99900..65713aa04f 100644
--- a/core-java-modules/core-java-streams-3/README.md
+++ b/core-java-modules/core-java-streams-3/README.md
@@ -10,4 +10,5 @@ This module contains articles about the Stream API in Java.
 - [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams)
 - [Debugging Java 8 Streams with IntelliJ](https://www.baeldung.com/intellij-debugging-java-streams)
 - [Add BigDecimals using the Stream API](https://www.baeldung.com/java-stream-add-bigdecimals)
+- [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close)
 - More articles: [[<-- prev>]](/../core-java-streams-2)

From 44c7cecd657092a6fb68c5944d2b2236d1f7f450 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 16:53:27 +0800
Subject: [PATCH 199/404] Update README.md

---
 core-java-modules/core-java-collections-maps-3/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-collections-maps-3/README.md b/core-java-modules/core-java-collections-maps-3/README.md
index 64a3b75d83..7386f7e9b7 100644
--- a/core-java-modules/core-java-collections-maps-3/README.md
+++ b/core-java-modules/core-java-collections-maps-3/README.md
@@ -5,4 +5,5 @@ This module contains articles about Map data structures in Java.
 ### Relevant Articles: 
 - [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap)
 - [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps)
+- [The Map.computeIfAbsent() Method](https://www.baeldung.com/java-map-computeifabsent)
 - More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2)

From 48525264a085b93b8810ac175c5539720a8abd7b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 16:57:15 +0800
Subject: [PATCH 200/404] Update README.md

---
 core-java-modules/core-java-networking-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md
index 120b111ff5..662d97252e 100644
--- a/core-java-modules/core-java-networking-2/README.md
+++ b/core-java-modules/core-java-networking-2/README.md
@@ -11,4 +11,5 @@ This module contains articles about networking in Java
 - [Sending Emails with Java](https://www.baeldung.com/java-email)
 - [Authentication with HttpUrlConnection](https://www.baeldung.com/java-http-url-connection)
 - [Download a File from an URL in Java](https://www.baeldung.com/java-download-file)
+- [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception)
 - [[<-- Prev]](/core-java-modules/core-java-networking)

From 01dc9eec8d506bbd6e8dceaf6d3c93a8731c605c Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:03:15 +0800
Subject: [PATCH 201/404] Create README.md

---
 spring-boot-modules/spring-boot/src/test/resources/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot/src/test/resources/README.md

diff --git a/spring-boot-modules/spring-boot/src/test/resources/README.md b/spring-boot-modules/spring-boot/src/test/resources/README.md
new file mode 100644
index 0000000000..51c95afd9d
--- /dev/null
+++ b/spring-boot-modules/spring-boot/src/test/resources/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [How to Test GraphQL Using Postman](https://www.baeldung.com/graphql-postman)

From 60364c19e5f642785bcba10cee9f322f66cb697b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:05:25 +0800
Subject: [PATCH 202/404] Update README.md

---
 libraries-testing/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries-testing/README.md b/libraries-testing/README.md
index 7098c10d28..ffdefe4b19 100644
--- a/libraries-testing/README.md
+++ b/libraries-testing/README.md
@@ -11,4 +11,4 @@ This module contains articles about test libraries.
 - [Introduction to Awaitlity](https://www.baeldung.com/awaitlity-testing)
 - [Introduction to Hoverfly in Java](https://www.baeldung.com/hoverfly)
 - [Testing with Hamcrest](https://www.baeldung.com/java-junit-hamcrest-guide)
-- [Introduction To DBUnit](https://www.baeldung.com/dbunit)
+- [Introduction To DBUnit](https://www.baeldung.com/java-dbunit)

From e232346eb937bab9bf2d74a727e90d833f1d5982 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:08:45 +0800
Subject: [PATCH 203/404] Update README.md

---
 testing-modules/junit5-annotations/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md
index 02d4cd652a..bd51bb3d2d 100644
--- a/testing-modules/junit5-annotations/README.md
+++ b/testing-modules/junit5-annotations/README.md
@@ -7,3 +7,4 @@ This module contains articles about JUnit 5 Annotations
 - [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution)
 - [JUnit5 Programmatic Extension Registration with @RegisterExtension](https://www.baeldung.com/junit-5-registerextension-annotation)
 - [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)
+- [Writing Templates for Test Cases Using JUnit 5](https://www.baeldung.com/junit5-test-templates)

From 4ef6e5efbd0236c1b031a8f53f197b7bcac412b3 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:10:54 +0800
Subject: [PATCH 204/404] Update README.md

---
 reactor-core/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/reactor-core/README.md b/reactor-core/README.md
index e3cca35f86..0214aa26fd 100644
--- a/reactor-core/README.md
+++ b/reactor-core/README.md
@@ -7,3 +7,4 @@ This module contains articles about Reactor Core.
 - [Intro To Reactor Core](https://www.baeldung.com/reactor-core)
 - [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams)
 - [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor)
+- [How to Extract a Mono’s Content in Java](https://www.baeldung.com/java-string-from-mono)

From bae59eade948e8f1ebb479db84e36637336a66ff Mon Sep 17 00:00:00 2001
From: CHANDRAKANT Kumar <kumar.chandrakant@soprabanking.com>
Date: Tue, 5 May 2020 14:41:10 +0530
Subject: [PATCH 205/404] Adding the sourcecode for tutorial tracked under
 BAEL-2957

---
 java-es-cqrs/.gitignore                       |  29 +++++
 java-es-cqrs/pom.xml                          |  20 +++
 .../java/com/baeldung/patterns/cqrs/Main.java |  57 ++++++++
 .../cqrs/aggregates/UserAggregate.java        |  30 +++++
 .../cqrs/commands/CreateUserCommand.java      |  14 ++
 .../cqrs/commands/UpdateUserCommand.java      |  20 +++
 .../cqrs/projections/UserProjection.java      |  37 ++++++
 .../cqrs/projectors/UserProjector.java        |  56 ++++++++
 .../cqrs/queries/AddressByRegionQuery.java    |  12 ++
 .../cqrs/queries/ContactByTypeQuery.java      |  12 ++
 .../cqrs/repository/UserReadRepository.java   |  31 +++++
 .../cqrs/repository/UserWriteRepository.java  |  20 +++
 .../java/com/baeldung/patterns/crud/Main.java |  48 +++++++
 .../crud/repository/UserRepository.java       |  20 +++
 .../patterns/crud/service/UserService.java    |  55 ++++++++
 .../com/baeldung/patterns/domain/Address.java |  14 ++
 .../com/baeldung/patterns/domain/Contact.java |  13 ++
 .../com/baeldung/patterns/domain/User.java    |  22 ++++
 .../baeldung/patterns/domain/UserAddress.java |  16 +++
 .../baeldung/patterns/domain/UserContact.java |  16 +++
 .../java/com/baeldung/patterns/es/Main.java   |  48 +++++++
 .../baeldung/patterns/es/events/Event.java    |  15 +++
 .../es/events/UserAddressAddedEvent.java      |  16 +++
 .../es/events/UserAddressRemovedEvent.java    |  16 +++
 .../es/events/UserContactAddedEvent.java      |  15 +++
 .../es/events/UserContactRemovedEvent.java    |  15 +++
 .../patterns/es/events/UserCreatedEvent.java  |  16 +++
 .../patterns/es/events/UserRemovedEvent.java  |  12 ++
 .../patterns/es/repository/EventStore.java    |  29 +++++
 .../patterns/es/service/UserService.java      |  94 +++++++++++++
 .../patterns/es/service/UserUtility.java      |  66 ++++++++++
 .../com/baeldung/patterns/escqrs/Main.java    |  61 +++++++++
 .../escqrs/aggregates/UserAggregate.java      |  87 +++++++++++++
 .../escqrs/projectors/UserProjector.java      | 123 ++++++++++++++++++
 34 files changed, 1155 insertions(+)
 create mode 100644 java-es-cqrs/.gitignore
 create mode 100644 java-es-cqrs/pom.xml
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
 create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java

diff --git a/java-es-cqrs/.gitignore b/java-es-cqrs/.gitignore
new file mode 100644
index 0000000000..153c9335eb
--- /dev/null
+++ b/java-es-cqrs/.gitignore
@@ -0,0 +1,29 @@
+HELP.md
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
+
+### VS Code ###
+.vscode/
diff --git a/java-es-cqrs/pom.xml b/java-es-cqrs/pom.xml
new file mode 100644
index 0000000000..4160c62b0c
--- /dev/null
+++ b/java-es-cqrs/pom.xml
@@ -0,0 +1,20 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.sapient.learning</groupId>
+	<artifactId>java-events</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>java-es-cqrs</name>
+	<properties>
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+	</properties>
+	<dependencies>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>1.18.12</version>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java
new file mode 100644
index 0000000000..4e9c872cf1
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java
@@ -0,0 +1,57 @@
+package com.baeldung.patterns.cqrs;
+
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.baeldung.patterns.cqrs.aggregates.UserAggregate;
+import com.baeldung.patterns.cqrs.commands.CreateUserCommand;
+import com.baeldung.patterns.cqrs.commands.UpdateUserCommand;
+import com.baeldung.patterns.cqrs.projections.UserProjection;
+import com.baeldung.patterns.cqrs.projectors.UserProjector;
+import com.baeldung.patterns.cqrs.queries.AddressByRegionQuery;
+import com.baeldung.patterns.cqrs.queries.ContactByTypeQuery;
+import com.baeldung.patterns.cqrs.repository.UserReadRepository;
+import com.baeldung.patterns.cqrs.repository.UserWriteRepository;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.User;
+
+public class Main {
+
+    public static void main(String[] args) throws Exception {
+        UserWriteRepository writeRepository = new UserWriteRepository();
+        UserReadRepository readRepository = new UserReadRepository();
+        UserProjector projector = new UserProjector(readRepository);
+        UserAggregate userAggregate = new UserAggregate(writeRepository);
+        UserProjection userProjection = new UserProjection(readRepository);
+
+        String userId = UUID.randomUUID()
+            .toString();
+        User user = null;
+        CreateUserCommand createUserCommand = new CreateUserCommand(userId, "Tom", "Sawyer");
+        user = userAggregate.handleCreateUserCommand(createUserCommand);
+        projector.project(user);
+
+        UpdateUserCommand updateUserCommand = new UpdateUserCommand(user.getUserid(), Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com"))
+                .collect(Collectors.toSet()));
+        user = userAggregate.handleUpdateUserCommand(updateUserCommand);
+        projector.project(user);
+
+        updateUserCommand = new UpdateUserCommand(userId, Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001"))
+                .collect(Collectors.toSet()));
+        user = userAggregate.handleUpdateUserCommand(updateUserCommand);
+        projector.project(user);
+
+        AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(user.getUserid(), "NY");
+        System.out.println(userProjection.handle(addressByRegionQuery));
+
+        ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(user.getUserid(), "EMAIL");
+        System.out.println(userProjection.handle(contactByTypeQuery));
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
new file mode 100644
index 0000000000..b5e16cff0e
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
@@ -0,0 +1,30 @@
+package com.baeldung.patterns.cqrs.aggregates;
+
+import com.baeldung.patterns.cqrs.commands.CreateUserCommand;
+import com.baeldung.patterns.cqrs.commands.UpdateUserCommand;
+import com.baeldung.patterns.cqrs.repository.UserWriteRepository;
+import com.baeldung.patterns.domain.User;
+
+public class UserAggregate {
+
+    private UserWriteRepository writeRepository;
+
+    public UserAggregate(UserWriteRepository repository) {
+        this.writeRepository = repository;
+    }
+
+    public User handleCreateUserCommand(CreateUserCommand command) {
+        User user = new User(command.getUserId(), command.getFiratName(), command.getLastName());
+        writeRepository.addUser(user.getUserid(), user);
+        return user;
+    }
+
+    public User handleUpdateUserCommand(UpdateUserCommand command) {
+        User user = writeRepository.getUser(command.getUserId());
+        user.setAddresses(command.getAddresses());
+        user.setContacts(command.getContacts());
+        writeRepository.addUser(user.getUserid(), user);
+        return user;
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
new file mode 100644
index 0000000000..4ab939dbab
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
@@ -0,0 +1,14 @@
+package com.baeldung.patterns.cqrs.commands;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class CreateUserCommand {
+
+    private String userId;
+    private String firatName;
+    private String lastName;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java
new file mode 100644
index 0000000000..58a4889458
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java
@@ -0,0 +1,20 @@
+package com.baeldung.patterns.cqrs.commands;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class UpdateUserCommand {
+
+    private String userId;
+    private Set<Address> addresses = new HashSet<>();
+    private Set<Contact> contacts = new HashSet<>();
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java
new file mode 100644
index 0000000000..40a56e727f
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java
@@ -0,0 +1,37 @@
+package com.baeldung.patterns.cqrs.projections;
+
+import java.util.Set;
+
+import com.baeldung.patterns.cqrs.queries.AddressByRegionQuery;
+import com.baeldung.patterns.cqrs.queries.ContactByTypeQuery;
+import com.baeldung.patterns.cqrs.repository.UserReadRepository;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.UserAddress;
+import com.baeldung.patterns.domain.UserContact;
+
+public class UserProjection {
+
+    private UserReadRepository repository;
+
+    public UserProjection(UserReadRepository repository) {
+        this.repository = repository;
+    }
+
+    public Set<Contact> handle(ContactByTypeQuery query) throws Exception {
+        UserContact userContact = repository.getUserContact(query.getUserId());
+        if (userContact == null)
+            throw new Exception("User does not exist.");
+        return userContact.getContactByType()
+            .get(query.getContactType());
+    }
+
+    public Set<Address> handle(AddressByRegionQuery query) throws Exception {
+        UserAddress userAddress = repository.getUserAddress(query.getUserId());
+        if (userAddress == null)
+            throw new Exception("User does not exist.");
+        return userAddress.getAddressByRegion()
+            .get(query.getState());
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
new file mode 100644
index 0000000000..25c10094c1
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
@@ -0,0 +1,56 @@
+package com.baeldung.patterns.cqrs.projectors;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import com.baeldung.patterns.cqrs.repository.UserReadRepository;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.User;
+import com.baeldung.patterns.domain.UserAddress;
+import com.baeldung.patterns.domain.UserContact;
+
+public class UserProjector {
+
+    UserReadRepository readRepository = new UserReadRepository();
+
+    public UserProjector(UserReadRepository readRepository) {
+        this.readRepository = readRepository;
+    }
+
+    public void project(User user) {
+        UserContact userContact = readRepository.getUserContact(user.getUserid());
+        if (userContact == null)
+            userContact = new UserContact();
+        userContact.setContacts(user.getContacts());
+        Map<String, Set<Contact>> contactByType = new HashMap<>();
+        for (Contact contact : user.getContacts()) {
+            Set<Contact> contacts = contactByType.get(contact.getType());
+            if (contacts == null)
+                contacts = new HashSet<>();
+            contacts.add(contact);
+            contactByType.put(contact.getType(), contacts);
+        }
+        userContact.setContactByType(contactByType);
+        readRepository.addUserContact(user.getUserid(), userContact);
+
+        UserAddress userAddress = readRepository.getUserAddress(user.getUserid());
+        if (userAddress == null)
+            userAddress = new UserAddress();
+        userAddress.setAddresses(user.getAddresses());
+        Map<String, Set<Address>> addressByRegion = new HashMap<>();
+        for (Address address : user.getAddresses()) {
+            Set<Address> addresses = addressByRegion.get(address.getState());
+            if (addresses == null)
+                addresses = new HashSet<>();
+            addresses.add(address);
+            addressByRegion.put(address.getState(), addresses);
+        }
+        userAddress.setAddressByRegion(addressByRegion);
+        readRepository.addUserAddress(user.getUserid(), userAddress);
+
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java
new file mode 100644
index 0000000000..4a0f0769f2
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java
@@ -0,0 +1,12 @@
+package com.baeldung.patterns.cqrs.queries;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class AddressByRegionQuery {
+
+    private String userId;
+    private String state;
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java
new file mode 100644
index 0000000000..b6c271b472
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java
@@ -0,0 +1,12 @@
+package com.baeldung.patterns.cqrs.queries;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ContactByTypeQuery {
+
+    private String userId;
+    private String contactType;
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java
new file mode 100644
index 0000000000..a7ef2f6f96
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java
@@ -0,0 +1,31 @@
+package com.baeldung.patterns.cqrs.repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.baeldung.patterns.domain.UserAddress;
+import com.baeldung.patterns.domain.UserContact;
+
+public class UserReadRepository {
+
+    private Map<String, UserAddress> userAddress = new HashMap<>();
+
+    private Map<String, UserContact> userContact = new HashMap<>();
+
+    public void addUserAddress(String id, UserAddress user) {
+        userAddress.put(id, user);
+    }
+
+    public UserAddress getUserAddress(String id) {
+        return userAddress.get(id);
+    }
+
+    public void addUserContact(String id, UserContact user) {
+        userContact.put(id, user);
+    }
+
+    public UserContact getUserContact(String id) {
+        return userContact.get(id);
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java
new file mode 100644
index 0000000000..8636e36225
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java
@@ -0,0 +1,20 @@
+package com.baeldung.patterns.cqrs.repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.baeldung.patterns.domain.User;
+
+public class UserWriteRepository {
+
+    private Map<String, User> store = new HashMap<>();
+
+    public void addUser(String id, User user) {
+        store.put(id, user);
+    }
+
+    public User getUser(String id) {
+        return store.get(id);
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java
new file mode 100644
index 0000000000..1f20e0be38
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java
@@ -0,0 +1,48 @@
+package com.baeldung.patterns.crud;
+
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.baeldung.patterns.crud.repository.UserRepository;
+import com.baeldung.patterns.crud.service.UserService;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+
+public class Main {
+
+    public static void main(String[] args) throws Exception {
+
+        UserRepository repository = new UserRepository();
+        UserService service = new UserService(repository);
+        String userId = UUID.randomUUID()
+            .toString();
+
+        service.createUser(userId, "Tom", "Sawyer");
+        service.updateUser(userId, 
+            Stream.of(
+              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
+              new Contact("EMAIL", "tom.sawyer@rediff.com"), 
+              new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(
+              new Address("New York", "NY", "10001"), 
+              new Address("Los Angeles", "CA", "90001"), 
+              new Address("Housten", "TX", "77001"))
+            .collect(Collectors.toSet()));
+        service.updateUser(userId, 
+            Stream.of(
+              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
+              new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(
+              new Address("New York", "NY", "10001"), 
+              new Address("Housten", "TX", "77001"))
+            .collect(Collectors.toSet()));
+
+        System.out.println(service.getContactByType(userId, "EMAIL"));
+        System.out.println(service.getAddressByRegion(userId, "NY"));
+
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java
new file mode 100644
index 0000000000..b22d40e6e0
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java
@@ -0,0 +1,20 @@
+package com.baeldung.patterns.crud.repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.baeldung.patterns.domain.User;
+
+public class UserRepository {
+
+    private Map<String, User> store = new HashMap<>();
+
+    public void addUser(String id, User user) {
+        store.put(id, user);
+    }
+
+    public User getUser(String id) {
+        return store.get(id);
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java
new file mode 100644
index 0000000000..d21a796304
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java
@@ -0,0 +1,55 @@
+package com.baeldung.patterns.crud.service;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.baeldung.patterns.crud.repository.UserRepository;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.User;
+
+public class UserService {
+
+    private UserRepository repository;
+
+    public UserService(UserRepository repository) {
+        this.repository = repository;
+    }
+
+    public void createUser(String userId, String firstName, String lastName) {
+        User user = new User(userId, firstName, lastName);
+        repository.addUser(userId, user);
+    }
+
+    public void updateUser(String userId, Set<Contact> contacts, Set<Address> addresses) throws Exception {
+        User user = repository.getUser(userId);
+        if (user == null)
+            throw new Exception("User does not exist.");
+        user.setContacts(contacts);
+        user.setAddresses(addresses);
+        repository.addUser(userId, user);
+    }
+
+    public Set<Contact> getContactByType(String userId, String contactType) throws Exception {
+        User user = repository.getUser(userId);
+        if (user == null)
+            throw new Exception("User does not exit.");
+        Set<Contact> contacts = user.getContacts();
+        return contacts.stream()
+            .filter(c -> c.getType()
+                .equals(contactType))
+            .collect(Collectors.toSet());
+    }
+
+    public Set<Address> getAddressByRegion(String userId, String state) throws Exception {
+        User user = repository.getUser(userId);
+        if (user == null)
+            throw new Exception("User does not exist.");
+        Set<Address> addresses = user.getAddresses();
+        return addresses.stream()
+            .filter(a -> a.getState()
+                .equals(state))
+            .collect(Collectors.toSet());
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java
new file mode 100644
index 0000000000..dfaa724434
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java
@@ -0,0 +1,14 @@
+package com.baeldung.patterns.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Address {
+
+    private String city;
+    private String state;
+    private String postcode;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java
new file mode 100644
index 0000000000..a151cdb4ff
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java
@@ -0,0 +1,13 @@
+package com.baeldung.patterns.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Contact {
+
+    private String type;
+    private String detail;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java
new file mode 100644
index 0000000000..8f59723894
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java
@@ -0,0 +1,22 @@
+package com.baeldung.patterns.domain;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import lombok.Data;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+
+@Data
+@RequiredArgsConstructor
+public class User {
+    @NonNull
+    private String userid;
+    @NonNull
+    private String firstname;
+    @NonNull
+    private String lastname;
+    private Set<Contact> contacts = new HashSet<>();
+    private Set<Address> addresses = new HashSet<>();
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
new file mode 100644
index 0000000000..33f9bdf28f
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
@@ -0,0 +1,16 @@
+package com.baeldung.patterns.domain;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import lombok.Data;
+
+@Data
+public class UserAddress {
+
+    private Set<Address> addresses = new HashSet<>();
+    private Map<String, Set<Address>> addressByRegion = new HashMap<>();
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
new file mode 100644
index 0000000000..4f2ba812a4
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
@@ -0,0 +1,16 @@
+package com.baeldung.patterns.domain;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import lombok.Data;
+
+@Data
+public class UserContact {
+
+    private Set<Contact> contacts = new HashSet<>();
+    private Map<String, Set<Contact>> contactByType = new HashMap<>();
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java
new file mode 100644
index 0000000000..77649088e9
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java
@@ -0,0 +1,48 @@
+package com.baeldung.patterns.es;
+
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.es.repository.EventStore;
+import com.baeldung.patterns.es.service.UserService;
+
+public class Main {
+
+    public static void main(String[] args) throws Exception {
+
+        EventStore repository = new EventStore();
+        UserService service = new UserService(repository);
+        String userId = UUID.randomUUID()
+            .toString();
+
+        service.createUser(userId, "Tom", "Sawyer");
+        service.updateUser(userId, 
+            Stream.of(
+              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
+              new Contact("EMAIL", "tom.sawyer@rediff.com"), 
+              new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(
+              new Address("New York", "NY", "10001"), 
+              new Address("Los Angeles", "CA", "90001"), 
+              new Address("Housten", "TX", "77001"))
+            .collect(Collectors.toSet()));
+        service.updateUser(userId, 
+            Stream.of(
+              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
+              new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(
+              new Address("New York", "NY", "10001"), 
+              new Address("Housten", "TX", "77001"))
+            .collect(Collectors.toSet()));
+
+        System.out.println(service.getContactByType(userId, "EMAIL"));
+        System.out.println(service.getAddressByRegion(userId, "NY"));
+
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java
new file mode 100644
index 0000000000..4718450cac
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java
@@ -0,0 +1,15 @@
+package com.baeldung.patterns.es.events;
+
+import java.util.Date;
+import java.util.UUID;
+
+import lombok.ToString;
+
+@ToString
+public abstract class Event {
+
+    public final UUID id = UUID.randomUUID();
+
+    public final Date created = new Date();
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java
new file mode 100644
index 0000000000..caa640798b
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java
@@ -0,0 +1,16 @@
+package com.baeldung.patterns.es.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class UserAddressAddedEvent extends Event {
+
+    private String city;
+    private String state;
+    private String postCode;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java
new file mode 100644
index 0000000000..f0702d8810
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java
@@ -0,0 +1,16 @@
+package com.baeldung.patterns.es.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class UserAddressRemovedEvent extends Event {
+
+    private String city;
+    private String state;
+    private String postCode;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java
new file mode 100644
index 0000000000..0bce2f997e
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java
@@ -0,0 +1,15 @@
+package com.baeldung.patterns.es.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class UserContactAddedEvent extends Event {
+
+    private String contactType;
+    private String contactDetails;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java
new file mode 100644
index 0000000000..9c043971e7
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java
@@ -0,0 +1,15 @@
+package com.baeldung.patterns.es.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class UserContactRemovedEvent extends Event {
+
+    private String contactType;
+    private String contactDetails;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java
new file mode 100644
index 0000000000..8e725cd667
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java
@@ -0,0 +1,16 @@
+package com.baeldung.patterns.es.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class UserCreatedEvent extends Event {
+
+    private String userId;
+    private String firstName;
+    private String lastName;
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java
new file mode 100644
index 0000000000..b609cb1daf
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java
@@ -0,0 +1,12 @@
+package com.baeldung.patterns.es.events;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class UserRemovedEvent extends Event {
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java
new file mode 100644
index 0000000000..87914d8c12
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java
@@ -0,0 +1,29 @@
+package com.baeldung.patterns.es.repository;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.baeldung.patterns.es.events.Event;
+
+public class EventStore {
+
+    private Map<String, List<Event>> store = new HashMap<>();
+
+    public void addEvent(String id, Event event) {
+        List<Event> events = store.get(id);
+        if (events == null) {
+            events = new ArrayList<Event>();
+            events.add(event);
+            store.put(id, events);
+        } else {
+            events.add(event);
+        }
+    }
+
+    public List<Event> getEvents(String id) {
+        return store.get(id);
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
new file mode 100644
index 0000000000..0233453d68
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
@@ -0,0 +1,94 @@
+package com.baeldung.patterns.es.service;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.User;
+import com.baeldung.patterns.es.events.UserAddressAddedEvent;
+import com.baeldung.patterns.es.events.UserAddressRemovedEvent;
+import com.baeldung.patterns.es.events.UserContactAddedEvent;
+import com.baeldung.patterns.es.events.UserContactRemovedEvent;
+import com.baeldung.patterns.es.events.UserCreatedEvent;
+import com.baeldung.patterns.es.repository.EventStore;
+
+public class UserService {
+
+    private EventStore repository;
+
+    public UserService(EventStore repository) {
+        this.repository = repository;
+    }
+
+    public void createUser(String userId, String firstName, String lastName) {
+        UserCreatedEvent event = new UserCreatedEvent(userId, firstName, lastName);
+        repository.addEvent(userId, event);
+    }
+
+    public void updateUser(String userId, Set<Contact> contacts, Set<Address> addresses) throws Exception {
+        User user = UserUtility.recreateUserState(repository, userId);
+        if (user == null)
+            throw new Exception("User does not exist.");
+
+        List<Contact> contactsToRemove = user.getContacts()
+            .stream()
+            .filter(c -> !contacts.contains(c))
+            .collect(Collectors.toList());
+        for (Contact contact : contactsToRemove) {
+            UserContactRemovedEvent contactRemovedEvent = new UserContactRemovedEvent(contact.getType(), contact.getDetail());
+            repository.addEvent(userId, contactRemovedEvent);
+        }
+
+        List<Contact> contactsToAdd = contacts.stream()
+            .filter(c -> !user.getContacts()
+                .contains(c))
+            .collect(Collectors.toList());
+        for (Contact contact : contactsToAdd) {
+            UserContactAddedEvent contactAddedEvent = new UserContactAddedEvent(contact.getType(), contact.getDetail());
+            repository.addEvent(userId, contactAddedEvent);
+        }
+
+        List<Address> addressesToRemove = user.getAddresses()
+            .stream()
+            .filter(a -> !addresses.contains(a))
+            .collect(Collectors.toList());
+        for (Address address : addressesToRemove) {
+            UserAddressRemovedEvent addressRemovedEvent = new UserAddressRemovedEvent(address.getCity(), address.getState(), address.getPostcode());
+            repository.addEvent(userId, addressRemovedEvent);
+        }
+
+        List<Address> addressesToAdd = addresses.stream()
+            .filter(a -> !user.getAddresses()
+                .contains(a))
+            .collect(Collectors.toList());
+        for (Address address : addressesToAdd) {
+            UserAddressAddedEvent addressAddedEvent = new UserAddressAddedEvent(address.getCity(), address.getState(), address.getPostcode());
+            repository.addEvent(userId, addressAddedEvent);
+        }
+    }
+
+    public Set<Contact> getContactByType(String userId, String contactType) throws Exception {
+        User user = UserUtility.recreateUserState(repository, userId);
+        if (user == null)
+            throw new Exception("User does not exist.");
+        Set<Contact> contacts = user.getContacts();
+        return contacts.stream()
+            .filter(c -> c.getType()
+                .equals(contactType))
+            .collect(Collectors.toSet());
+    }
+
+    public Set<Address> getAddressByRegion(String userId, String state) throws Exception {
+        User user = UserUtility.recreateUserState(repository, userId);
+        if (user == null)
+            throw new Exception("User does not exist.");
+        Set<Address> addresses = user.getAddresses();
+        return addresses.stream()
+            .filter(a -> a.getState()
+                .equals(state))
+            .collect(Collectors.toSet());
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
new file mode 100644
index 0000000000..b7ed9208b2
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
@@ -0,0 +1,66 @@
+package com.baeldung.patterns.es.service;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.User;
+import com.baeldung.patterns.es.events.Event;
+import com.baeldung.patterns.es.events.UserAddressAddedEvent;
+import com.baeldung.patterns.es.events.UserAddressRemovedEvent;
+import com.baeldung.patterns.es.events.UserContactAddedEvent;
+import com.baeldung.patterns.es.events.UserContactRemovedEvent;
+import com.baeldung.patterns.es.events.UserCreatedEvent;
+import com.baeldung.patterns.es.events.UserRemovedEvent;
+import com.baeldung.patterns.es.repository.EventStore;
+
+public class UserUtility {
+
+    public static User recreateUserState(EventStore store, String userId) {
+        User user = null;
+
+        List<Event> events = store.getEvents(userId);
+        for (Event event : events) {
+            if (event instanceof UserCreatedEvent) {
+                UserCreatedEvent e = (UserCreatedEvent) event;
+                user = new User(UUID.randomUUID()
+                    .toString(), e.getFirstName(), e.getLastName());
+            }
+            if (event instanceof UserRemovedEvent) {
+                user = null;
+            }
+            if (event instanceof UserAddressAddedEvent) {
+                UserAddressAddedEvent e = (UserAddressAddedEvent) event;
+                Address address = new Address(e.getCity(), e.getState(), e.getPostCode());
+                if (user != null)
+                    user.getAddresses()
+                        .add(address);
+            }
+            if (event instanceof UserAddressRemovedEvent) {
+                UserAddressRemovedEvent e = (UserAddressRemovedEvent) event;
+                Address address = new Address(e.getCity(), e.getState(), e.getPostCode());
+                if (user != null)
+                    user.getAddresses()
+                        .remove(address);
+            }
+            if (event instanceof UserContactAddedEvent) {
+                UserContactAddedEvent e = (UserContactAddedEvent) event;
+                Contact contact = new Contact(e.getContactType(), e.getContactDetails());
+                if (user != null)
+                    user.getContacts()
+                        .add(contact);
+            }
+            if (event instanceof UserContactRemovedEvent) {
+                UserContactRemovedEvent e = (UserContactRemovedEvent) event;
+                Contact contact = new Contact(e.getContactType(), e.getContactDetails());
+                if (user != null)
+                    user.getContacts()
+                        .remove(contact);
+            }
+        }
+
+        return user;
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java
new file mode 100644
index 0000000000..44395a75a7
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java
@@ -0,0 +1,61 @@
+package com.baeldung.patterns.escqrs;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.baeldung.patterns.cqrs.commands.CreateUserCommand;
+import com.baeldung.patterns.cqrs.commands.UpdateUserCommand;
+import com.baeldung.patterns.cqrs.projections.UserProjection;
+import com.baeldung.patterns.cqrs.queries.AddressByRegionQuery;
+import com.baeldung.patterns.cqrs.queries.ContactByTypeQuery;
+import com.baeldung.patterns.cqrs.repository.UserReadRepository;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.es.events.Event;
+import com.baeldung.patterns.es.repository.EventStore;
+import com.baeldung.patterns.escqrs.aggregates.UserAggregate;
+import com.baeldung.patterns.escqrs.projectors.UserProjector;
+
+public class Main {
+
+    public static void main(String[] args) throws Exception {
+
+        EventStore writeRepository = new EventStore();
+        UserReadRepository readRepository = new UserReadRepository();
+        UserProjector projector = new UserProjector(readRepository);
+        UserAggregate userAggregate = new UserAggregate(writeRepository);
+        UserProjection userProjection = new UserProjection(readRepository);
+
+        String userId = UUID.randomUUID()
+            .toString();
+        List<Event> events = null;
+        CreateUserCommand createUserCommand = new CreateUserCommand(userId, "Kumar", "Chandrakant");
+        events = userAggregate.handleCreateUserCommand(createUserCommand);
+
+        projector.project(userId, events);
+
+        UpdateUserCommand updateUserCommand = new UpdateUserCommand(userId, Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com"))
+                .collect(Collectors.toSet()));
+        events = userAggregate.handleUpdateUserCommand(updateUserCommand);
+        projector.project(userId, events);
+
+        updateUserCommand = new UpdateUserCommand(userId, Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001"))
+                .collect(Collectors.toSet()));
+        events = userAggregate.handleUpdateUserCommand(updateUserCommand);
+        projector.project(userId, events);
+
+        AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY");
+        System.out.println(userProjection.handle(addressByRegionQuery));
+
+        ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(userId, "EMAIL");
+        System.out.println(userProjection.handle(contactByTypeQuery));
+
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
new file mode 100644
index 0000000000..7d32aeb2a2
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
@@ -0,0 +1,87 @@
+package com.baeldung.patterns.escqrs.aggregates;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.baeldung.patterns.cqrs.commands.CreateUserCommand;
+import com.baeldung.patterns.cqrs.commands.UpdateUserCommand;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.User;
+import com.baeldung.patterns.es.events.Event;
+import com.baeldung.patterns.es.events.UserAddressAddedEvent;
+import com.baeldung.patterns.es.events.UserAddressRemovedEvent;
+import com.baeldung.patterns.es.events.UserContactAddedEvent;
+import com.baeldung.patterns.es.events.UserContactRemovedEvent;
+import com.baeldung.patterns.es.events.UserCreatedEvent;
+import com.baeldung.patterns.es.repository.EventStore;
+import com.baeldung.patterns.es.service.UserUtility;
+
+public class UserAggregate {
+
+    private EventStore writeRepository;
+
+    public UserAggregate(EventStore repository) {
+        this.writeRepository = repository;
+    }
+
+    public List<Event> handleCreateUserCommand(CreateUserCommand command) {
+        UserCreatedEvent event = new UserCreatedEvent(command.getUserId(), command.getFiratName(), command.getLastName());
+        writeRepository.addEvent(command.getUserId(), event);
+        return Arrays.asList(event);
+    }
+
+    public List<Event> handleUpdateUserCommand(UpdateUserCommand command) {
+        User user = UserUtility.recreateUserState(writeRepository, command.getUserId());
+        List<Event> events = new ArrayList<>();
+
+        List<Contact> contactsToRemove = user.getContacts()
+            .stream()
+            .filter(c -> !command.getContacts()
+                .contains(c))
+            .collect(Collectors.toList());
+        for (Contact contact : contactsToRemove) {
+            UserContactRemovedEvent contactRemovedEvent = new UserContactRemovedEvent(contact.getType(), contact.getDetail());
+            events.add(contactRemovedEvent);
+            writeRepository.addEvent(command.getUserId(), contactRemovedEvent);
+        }
+
+        List<Contact> contactsToAdd = command.getContacts()
+            .stream()
+            .filter(c -> !user.getContacts()
+                .contains(c))
+            .collect(Collectors.toList());
+        for (Contact contact : contactsToAdd) {
+            UserContactAddedEvent contactAddedEvent = new UserContactAddedEvent(contact.getType(), contact.getDetail());
+            events.add(contactAddedEvent);
+            writeRepository.addEvent(command.getUserId(), contactAddedEvent);
+        }
+
+        List<Address> addressesToRemove = user.getAddresses()
+            .stream()
+            .filter(a -> !command.getAddresses()
+                .contains(a))
+            .collect(Collectors.toList());
+        for (Address address : addressesToRemove) {
+            UserAddressRemovedEvent addressRemovedEvent = new UserAddressRemovedEvent(address.getCity(), address.getState(), address.getPostcode());
+            events.add(addressRemovedEvent);
+            writeRepository.addEvent(command.getUserId(), addressRemovedEvent);
+        }
+
+        List<Address> addressesToAdd = command.getAddresses()
+            .stream()
+            .filter(a -> !user.getAddresses()
+                .contains(a))
+            .collect(Collectors.toList());
+        for (Address address : addressesToAdd) {
+            UserAddressAddedEvent addressAddedEvent = new UserAddressAddedEvent(address.getCity(), address.getState(), address.getPostcode());
+            events.add(addressAddedEvent);
+            writeRepository.addEvent(command.getUserId(), addressAddedEvent);
+        }
+
+        return events;
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
new file mode 100644
index 0000000000..036b6e8396
--- /dev/null
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
@@ -0,0 +1,123 @@
+package com.baeldung.patterns.escqrs.projectors;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.baeldung.patterns.cqrs.repository.UserReadRepository;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.domain.UserAddress;
+import com.baeldung.patterns.domain.UserContact;
+import com.baeldung.patterns.es.events.Event;
+import com.baeldung.patterns.es.events.UserAddressAddedEvent;
+import com.baeldung.patterns.es.events.UserAddressRemovedEvent;
+import com.baeldung.patterns.es.events.UserContactAddedEvent;
+import com.baeldung.patterns.es.events.UserContactRemovedEvent;
+import com.baeldung.patterns.es.events.UserCreatedEvent;
+import com.baeldung.patterns.es.events.UserRemovedEvent;
+
+public class UserProjector {
+
+    UserReadRepository readRepository = new UserReadRepository();
+
+    public UserProjector(UserReadRepository readRepository) {
+        this.readRepository = readRepository;
+    }
+
+    public void project(String userId, List<Event> events) {
+
+        for (Event event : events) {
+            if (event instanceof UserCreatedEvent)
+                apply(userId, (UserCreatedEvent) event);
+            if (event instanceof UserRemovedEvent)
+                apply(userId, (UserRemovedEvent) event);
+            if (event instanceof UserAddressAddedEvent)
+                apply(userId, (UserAddressAddedEvent) event);
+            if (event instanceof UserAddressRemovedEvent)
+                apply(userId, (UserAddressRemovedEvent) event);
+            if (event instanceof UserContactAddedEvent)
+                apply(userId, (UserContactAddedEvent) event);
+            if (event instanceof UserContactRemovedEvent)
+                apply(userId, (UserContactRemovedEvent) event);
+        }
+
+    }
+
+    public void apply(String userId, UserCreatedEvent event) {
+
+    }
+
+    public void apply(String userId, UserRemovedEvent event) {
+
+    }
+
+    public void apply(String userId, UserAddressAddedEvent event) {
+        Address address = new Address(event.getCity(), event.getState(), event.getPostCode());
+        UserAddress userAddress = readRepository.getUserAddress(userId);
+        if (userAddress == null)
+            userAddress = new UserAddress();
+        userAddress.getAddresses()
+            .add(address);
+        Set<Address> addresses = userAddress.getAddressByRegion()
+            .get(address.getState());
+        if (addresses == null)
+            addresses = new HashSet<>();
+        addresses.add(address);
+        userAddress.getAddressByRegion()
+            .put(address.getState(), addresses);
+        readRepository.addUserAddress(userId, userAddress);
+    }
+
+    public void apply(String userId, UserAddressRemovedEvent event) {
+        Address address = new Address(event.getCity(), event.getState(), event.getPostCode());
+        UserAddress userAddress = readRepository.getUserAddress(userId);
+        if (userAddress != null) {
+            userAddress.getAddresses()
+                .remove(address);
+            Set<Address> addresses = userAddress.getAddressByRegion()
+                .get(address.getState());
+            if (addresses != null) {
+                addresses.remove(address);
+                userAddress.getAddressByRegion()
+                    .put(address.getState(), addresses);
+            }
+            readRepository.addUserAddress(userId, userAddress);
+        }
+    }
+
+    public void apply(String userId, UserContactAddedEvent event) {
+        Contact contact = new Contact(event.getContactType(), event.getContactDetails());
+        UserContact userContact = readRepository.getUserContact(userId);
+        if (userContact == null)
+            userContact = new UserContact();
+        userContact.getContacts()
+            .add(contact);
+        Set<Contact> contacts = userContact.getContactByType()
+            .get(contact.getType());
+        if (contacts == null)
+            contacts = new HashSet<>();
+        contacts.add(contact);
+        userContact.getContactByType()
+            .put(contact.getType(), contacts);
+        readRepository.addUserContact(userId, userContact);
+    }
+
+    public void apply(String userId, UserContactRemovedEvent event) {
+        Contact contact = new Contact(event.getContactType(), event.getContactDetails());
+        UserContact userContact = readRepository.getUserContact(userId);
+        if (userContact != null) {
+            userContact.getContacts()
+                .remove(contact);
+            Set<Contact> contacts = userContact.getContactByType()
+                .get(contact.getType());
+            if (contacts != null) {
+                contacts.remove(contact);
+                userContact.getContactByType()
+                    .put(contact.getType(), contacts);
+            }
+            readRepository.addUserContact(userId, userContact);
+        }
+    }
+
+}

From c034df09fc1118f67b403c11bc8dbdf9f3b554c5 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:16:27 +0800
Subject: [PATCH 206/404] Update README.md

---
 core-groovy/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/core-groovy/README.md b/core-groovy/README.md
index 25a0aece3a..f852b3ccf2 100644
--- a/core-groovy/README.md
+++ b/core-groovy/README.md
@@ -12,4 +12,5 @@ This module contains articles about core Groovy concepts
 - [Closures in Groovy](https://www.baeldung.com/groovy-closures)
 - [Converting a String to a Date in Groovy](https://www.baeldung.com/groovy-string-to-date)
 - [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io)
-- [[More -->]](/core-groovy-2)
\ No newline at end of file
+- [Convert String to Integer in Groovy](https://www.baeldung.com/groovy-convert-string-to-integer)
+- [[More -->]](/core-groovy-2)

From 424fecc7d9c44d0953405f7e5a1df882e6be00d4 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:23:23 +0800
Subject: [PATCH 207/404] Update README.md

---
 testing-modules/mockito-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md
index 6c9ddee01d..329228186f 100644
--- a/testing-modules/mockito-2/README.md
+++ b/testing-modules/mockito-2/README.md
@@ -5,3 +5,4 @@
 - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception)
 - [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis)
 - [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value)
+- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers)

From 629ba77f5676616d0c8aad7eeb8fc6121c1e5c94 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:27:51 +0800
Subject: [PATCH 208/404] Update README.md

---
 persistence-modules/java-mongodb/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md
index 5c3c448b03..b79cea6781 100644
--- a/persistence-modules/java-mongodb/README.md
+++ b/persistence-modules/java-mongodb/README.md
@@ -11,3 +11,4 @@ This module contains articles about MongoDB in Java.
 - [Introduction to Morphia – Java ODM for MongoDB](https://www.baeldung.com/mongodb-morphia)
 - [MongoDB Aggregations Using Java](https://www.baeldung.com/java-mongodb-aggregations)
 - [MongoDB BSON to JSON](https://www.baeldung.com/bson-to-json)
+- [BSON to JSON Document Conversion in Java](https://www.baeldung.com/java-convert-bson-to-json)

From e0c1a17a68e69c737153ea97951ce3729927b471 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:31:23 +0800
Subject: [PATCH 209/404] Create README.md

---
 terraform/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 terraform/README.md

diff --git a/terraform/README.md b/terraform/README.md
new file mode 100644
index 0000000000..19abd2ff20
--- /dev/null
+++ b/terraform/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Terraform](https://www.baeldung.com/ops/terraform-intro)

From 1793a19bfc8dde7c1fcc14e44a68566072104512 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:36:42 +0800
Subject: [PATCH 210/404] Update README.md

---
 persistence-modules/spring-data-jpa-4/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/spring-data-jpa-4/README.md b/persistence-modules/spring-data-jpa-4/README.md
index 3884435f75..085dfcb366 100644
--- a/persistence-modules/spring-data-jpa-4/README.md
+++ b/persistence-modules/spring-data-jpa-4/README.md
@@ -6,6 +6,7 @@
 - [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events)
 - [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
 - [Calling Stored Procedures from Spring Data JPA Repositories](https://www.baeldung.com/spring-data-jpa-stored-procedures)
+- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
 
 ### Eclipse Config 
 After importing the project into Eclipse, you may see the following error:  

From 7d3aa9f3e594acb660606993b060963ab06430b0 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:43:34 +0800
Subject: [PATCH 211/404] Create README.md

---
 java-collections-maps-3/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 java-collections-maps-3/README.md

diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md
new file mode 100644
index 0000000000..4da8547824
--- /dev/null
+++ b/java-collections-maps-3/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-with-case-insensitive-keys)

From 6335a8eaa526fa5040e10f639e951e4acea64fbf Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:47:21 +0800
Subject: [PATCH 212/404] Create README.md

---
 netty/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 netty/README.md

diff --git a/netty/README.md b/netty/README.md
new file mode 100644
index 0000000000..30c63cd5a8
--- /dev/null
+++ b/netty/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [HTTP/2 in Netty](https://www.baeldung.com/netty-http2)

From 9d62a60deb4e6dec5909da86fbe41b56b75059c1 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:50:35 +0800
Subject: [PATCH 213/404] Update README.md

---
 persistence-modules/spring-boot-persistence-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md
index 5d171fb2ca..3ea93db4fe 100644
--- a/persistence-modules/spring-boot-persistence-2/README.md
+++ b/persistence-modules/spring-boot-persistence-2/README.md
@@ -1,3 +1,4 @@
 ### Relevant Articles:
 
 - [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi)
+- [Oracle Connection Pooling With Spring](https://www.baeldung.com/spring-oracle-connection-pooling)

From 22b4859f6269868251ee42854d6a909059bcfdf1 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 5 May 2020 17:54:09 +0800
Subject: [PATCH 214/404] Update README.md

---
 atomikos/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/atomikos/README.md b/atomikos/README.md
index 19f2e871d4..2c44e388fe 100644
--- a/atomikos/README.md
+++ b/atomikos/README.md
@@ -4,4 +4,4 @@ This module contains articles about Atomikos
 
 ### Relevant Articles: 
 
-- [Guide Transactions Using Atomikos]()
+- [A Guide to Atomikos](https://www.baeldung.com/java-atomikos)

From da533f662a495d2fb78d619c4e2edfd9db65dc77 Mon Sep 17 00:00:00 2001
From: Tyrell Flurry <tyrellflurry@gmail.com>
Date: Tue, 5 May 2020 08:01:34 -0400
Subject: [PATCH 215/404] BAEL-3929: changed plugin version.

---
 maven-all/maven-unused-dependencies/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/maven-all/maven-unused-dependencies/pom.xml b/maven-all/maven-unused-dependencies/pom.xml
index c8f6c1f04b..825858e481 100644
--- a/maven-all/maven-unused-dependencies/pom.xml
+++ b/maven-all/maven-unused-dependencies/pom.xml
@@ -9,7 +9,7 @@
     <properties>
         <commons-collections.version>3.2.2</commons-collections.version>
         <slf4j-api.version>1.7.25</slf4j-api.version>
-        <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
+        <maven-dependency-plugin.version>3.1.2</maven-dependency-plugin.version>
         <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
     </properties>
 

From 0f78e9a073b1c8b941375ac5e725a7180288fd42 Mon Sep 17 00:00:00 2001
From: Vikas Rajput <vkhaas.rajput1993@gmail.com>
Date: Tue, 5 May 2020 19:53:34 +0530
Subject: [PATCH 216/404] Bael 3557: Deleted /app package (#9242)

* BAEL-3557: Completed a simple web application in spring boot and groovy

* BAEL-3557: renamed packagename from com.baeldung.app to more unique name - com.baeldung.springwithgroovy

* BAEL-3557: Deleted /app package

Co-authored-by: Vikas Ramsingh Rajput <vikas.rajput@crownconsult.com>
---
 .../app/SpringBootGroovyApplication.groovy    | 13 ---
 .../app/controller/TodoController.groovy      | 48 ---------
 .../com/baeldung/app/entity/Todo.groovy       | 23 -----
 .../app/repository/TodoRepository.groovy      |  9 --
 .../baeldung/app/service/TodoService.groovy   | 16 ---
 .../app/service/impl/TodoServiceImpl.groovy   | 40 --------
 .../com/baeldung/app/TodoAppUnitTest.groovy   | 97 -------------------
 7 files changed, 246 deletions(-)
 delete mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy
 delete mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy
 delete mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy
 delete mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy
 delete mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy
 delete mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy
 delete mode 100644 spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy

diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy
deleted file mode 100644
index 226a2ff53d..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.baeldung.app
-
-import org.springframework.boot.SpringApplication
-import org.springframework.boot.autoconfigure.SpringBootApplication
-
-import com.baeldung.app.SpringBootGroovyApplication
-
-@SpringBootApplication
-class SpringBootGroovyApplication {
-    static void main(String[] args) {
-        SpringApplication.run SpringBootGroovyApplication, args
-    }
-}
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy
deleted file mode 100644
index 02f6d0223b..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.baeldung.app.controller
-
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.web.bind.annotation.DeleteMapping
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.PutMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestMethod
-import org.springframework.web.bind.annotation.RestController
-
-import com.baeldung.app.entity.Todo
-import com.baeldung.app.service.TodoService
-
-@RestController
-@RequestMapping('todo')
-public class TodoController {
-
-    @Autowired
-    TodoService todoService
-
-    @GetMapping
-    List<Todo> getAllTodoList(){
-        todoService.findAll()
-    }
-
-    @PostMapping
-    Todo saveTodo(@RequestBody Todo todo){
-        todoService.saveTodo todo
-    }
-
-    @PutMapping
-    Todo updateTodo(@RequestBody Todo todo){
-        todoService.updateTodo todo
-    }
-
-    @DeleteMapping('/{todoId}')
-    deleteTodo(@PathVariable Integer todoId){
-        todoService.deleteTodo todoId
-    }
-
-    @GetMapping('/{todoId}')
-    Todo getTodoById(@PathVariable Integer todoId){
-        todoService.findById todoId
-    }
-}
\ No newline at end of file
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy
deleted file mode 100644
index 9f1253c5b3..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.app.entity
-
-import javax.persistence.Column
-import javax.persistence.Entity
-import javax.persistence.GeneratedValue
-import javax.persistence.GenerationType
-import javax.persistence.Id
-import javax.persistence.Table
-
-@Entity
-@Table(name = 'todo')
-class Todo {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    Integer id
-    
-    @Column
-    String task
-    
-    @Column
-    Boolean isCompleted
-
-}
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy
deleted file mode 100644
index c0b35cc37d..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.app.repository
-
-import org.springframework.data.jpa.repository.JpaRepository
-import org.springframework.stereotype.Repository
-
-import com.baeldung.app.entity.Todo
-
-@Repository
-interface TodoRepository extends JpaRepository<Todo, Integer> {}
\ No newline at end of file
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy
deleted file mode 100644
index 0a59d93330..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.baeldung.app.service
-
-import com.baeldung.app.entity.Todo
-
-interface TodoService {
-
-    List<Todo> findAll()
-
-    Todo findById(Integer todoId)
-
-    Todo saveTodo(Todo todo)
-
-    Todo updateTodo(Todo todo)
-
-    Todo deleteTodo(Integer todoId)
-}
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy
deleted file mode 100644
index 6d0ee03a9f..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.baeldung.app.service.impl
-
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-import com.baeldung.app.entity.Todo
-import com.baeldung.app.repository.TodoRepository
-import com.baeldung.app.service.TodoService
-
-@Service
-class TodoServiceImpl implements TodoService {
-
-    @Autowired
-    TodoRepository todoRepository
-
-    @Override
-    List<Todo> findAll() {
-        todoRepository.findAll()
-    }
-
-    @Override
-    Todo findById(Integer todoId) {
-        todoRepository.findById todoId get()
-    }
-
-    @Override
-    Todo saveTodo(Todo todo){
-        todoRepository.save todo
-    }
-
-    @Override
-    Todo updateTodo(Todo todo){
-        todoRepository.save todo
-    }
-
-    @Override
-    Todo deleteTodo(Integer todoId){
-        todoRepository.deleteById todoId
-    }
-}
diff --git a/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy b/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy
deleted file mode 100644
index faf2d64ba7..0000000000
--- a/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.baeldung.app
-
-import static org.junit.jupiter.api.Assertions.assertEquals
-import static org.junit.jupiter.api.Assertions.assertTrue
-
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.http.HttpStatus
-import org.springframework.http.MediaType
-import org.springframework.test.context.event.annotation.BeforeTestClass
-import org.springframework.test.context.junit4.SpringRunner
-
-import com.baeldung.app.entity.Todo
-
-import io.restassured.RestAssured
-import io.restassured.response.Response
-
-class TodoAppUnitTest {
-    static API_ROOT = 'http://localhost:8081/todo'
-    static readingTodoId
-    static writingTodoId
-
-    @BeforeClass
-    static void populateDummyData() {
-        Todo readingTodo = new Todo(task: 'Reading', isCompleted: false)
-        Todo writingTodo = new Todo(task: 'Writing', isCompleted: false)
-
-        final Response readingResponse = 
-          RestAssured.given()
-            .contentType(MediaType.APPLICATION_JSON_VALUE)
-              .body(readingTodo).post(API_ROOT)
-              
-        Todo cookingTodoResponse = readingResponse.as Todo.class
-        readingTodoId = cookingTodoResponse.getId()
-
-        final Response writingResponse = 
-          RestAssured.given()
-            .contentType(MediaType.APPLICATION_JSON_VALUE)
-              .body(writingTodo).post(API_ROOT)
-              
-        Todo writingTodoResponse = writingResponse.as Todo.class
-        writingTodoId = writingTodoResponse.getId()
-    }
-
-    @Test
-    void whenGetAllTodoList_thenOk(){
-        final Response response = RestAssured.get(API_ROOT)
-        
-        assertEquals HttpStatus.OK.value(),response.getStatusCode()
-        assertTrue response.as(List.class).size() > 0
-    }
-
-    @Test
-    void whenGetTodoById_thenOk(){
-        final Response response = 
-          RestAssured.get("$API_ROOT/$readingTodoId")
-        
-        assertEquals HttpStatus.OK.value(),response.getStatusCode()
-        Todo todoResponse = response.as Todo.class
-        assertEquals readingTodoId,todoResponse.getId()
-    }
-
-    @Test
-    void whenUpdateTodoById_thenOk(){
-        Todo todo = new Todo(id:readingTodoId, isCompleted: true)
-        final Response response = 
-          RestAssured.given()
-            .contentType(MediaType.APPLICATION_JSON_VALUE)
-              .body(todo).put(API_ROOT)
-              
-        assertEquals HttpStatus.OK.value(),response.getStatusCode()
-        Todo todoResponse = response.as Todo.class
-        assertTrue todoResponse.getIsCompleted()
-    }
-
-    @Test
-    void whenDeleteTodoById_thenOk(){
-        final Response response = 
-          RestAssured.given()
-            .delete("$API_ROOT/$writingTodoId")
-        
-        assertEquals HttpStatus.OK.value(),response.getStatusCode()
-    }
-
-    @Test
-    void whenSaveTodo_thenOk(){
-        Todo todo = new Todo(task: 'Blogging', isCompleted: false)
-        final Response response = 
-          RestAssured.given()
-            .contentType(MediaType.APPLICATION_JSON_VALUE)
-              .body(todo).post(API_ROOT)
-              
-        assertEquals HttpStatus.OK.value(),response.getStatusCode()
-    }
-}
\ No newline at end of file

From 87b4ea1d0d1e32e58be4bd335f539e4631965f7e Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Tue, 5 May 2020 22:19:53 +0200
Subject: [PATCH 217/404] JAVA-1529: Move Working with Date Parameters in
 Spring

---
 spring-mvc-java-2/README.md                                      | 1 +
 .../src/main/java/com/baeldung/datetime/DateTimeConfig.java      | 0
 .../src/main/java/com/baeldung/datetime/DateTimeController.java  | 0
 spring-mvc-java/README.md                                        | 1 -
 4 files changed, 1 insertion(+), 1 deletion(-)
 rename {spring-mvc-java => spring-mvc-java-2}/src/main/java/com/baeldung/datetime/DateTimeConfig.java (100%)
 rename {spring-mvc-java => spring-mvc-java-2}/src/main/java/com/baeldung/datetime/DateTimeController.java (100%)

diff --git a/spring-mvc-java-2/README.md b/spring-mvc-java-2/README.md
index b5d5df3cd4..04c0fc958a 100644
--- a/spring-mvc-java-2/README.md
+++ b/spring-mvc-java-2/README.md
@@ -1,3 +1,4 @@
 ### Relevant Articles:
 
 - [Cache Headers in Spring MVC](https://www.baeldung.com/spring-mvc-cache-headers)
+- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeConfig.java
similarity index 100%
rename from spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeConfig.java
diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java b/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeController.java
similarity index 100%
rename from spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeController.java
diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md
index f1263860f9..0cac937a81 100644
--- a/spring-mvc-java/README.md
+++ b/spring-mvc-java/README.md
@@ -14,6 +14,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
 - [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files)
 - [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config)
 - [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
-- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
 - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
 - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)

From 34c18aefc4a480e361138a761f27f1838d3a5df6 Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Tue, 5 May 2020 22:21:38 +0200
Subject: [PATCH 218/404] JAVA-1529: Spring MVC @PathVariable with a dot (.)
 gets truncated

---
 spring-mvc-java-2/README.md                          |  1 +
 .../CustomWebMvcConfigurationSupport.java            |  2 +-
 .../com/baeldung/pathvariable}/SiteController.java   | 12 +++++++-----
 spring-mvc-java/README.md                            |  1 -
 4 files changed, 9 insertions(+), 7 deletions(-)
 rename {spring-mvc-java/src/main/java/com/baeldung/spring/web/config => spring-mvc-java-2/src/main/java/com/baeldung/pathvariable}/CustomWebMvcConfigurationSupport.java (93%)
 rename {spring-mvc-java/src/main/java/com/baeldung/web/controller => spring-mvc-java-2/src/main/java/com/baeldung/pathvariable}/SiteController.java (69%)

diff --git a/spring-mvc-java-2/README.md b/spring-mvc-java-2/README.md
index 04c0fc958a..50cdafe1d7 100644
--- a/spring-mvc-java-2/README.md
+++ b/spring-mvc-java-2/README.md
@@ -2,3 +2,4 @@
 
 - [Cache Headers in Spring MVC](https://www.baeldung.com/spring-mvc-cache-headers)
 - [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
+- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/CustomWebMvcConfigurationSupport.java
similarity index 93%
rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/CustomWebMvcConfigurationSupport.java
index a0dd7358d0..12c208c623 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/CustomWebMvcConfigurationSupport.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.web.config;
+package com.baeldung.pathvariable;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/SiteController.java b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
similarity index 69%
rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/SiteController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
index 3867380665..0ba6d12a0f 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/SiteController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
@@ -1,27 +1,29 @@
-package com.baeldung.web.controller;
+package com.baeldung.pathvariable;
 
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
 
+@Controller
 @RequestMapping("/site")
 public class SiteController {
 
-    @RequestMapping(value = "/{firstValue}/{secondValue}", method = RequestMethod.GET)
+    @GetMapping("/{firstValue}/{secondValue}")
     public String requestWithError(@PathVariable("firstValue") String firstValue,
                           @PathVariable("secondValue") String secondValue) {
 
         return firstValue + " - " + secondValue;
     }
 
-    @RequestMapping(value = "/{firstValue}/{secondValue:.+}", method = RequestMethod.GET)
+    @GetMapping("/{firstValue}/{secondValue:.+}")
     public String requestWithRegex(@PathVariable("firstValue") String firstValue,
                                    @PathVariable("secondValue") String secondValue) {
 
         return firstValue + " - " + secondValue;
     }
 
-    @RequestMapping(value = "/{firstValue}/{secondValue}/", method = RequestMethod.GET)
+    @GetMapping("/{firstValue}/{secondValue}/")
     public String requestWithSlash(@PathVariable("firstValue") String firstValue,
                                    @PathVariable("secondValue") String secondValue) {
 
diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md
index 0cac937a81..0edc73e0e0 100644
--- a/spring-mvc-java/README.md
+++ b/spring-mvc-java/README.md
@@ -13,6 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
 - [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit)
 - [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files)
 - [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config)
-- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
 - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
 - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)

From 50208fb01304c8398e92c816589de92ff3e7a46b Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Tue, 5 May 2020 22:27:16 +0200
Subject: [PATCH 219/404] Verify if the connection is still alive (#9246)

---
 .../com/baeldung/connectionpool/BasicConnectionPool.java  | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
index 289db18c53..22ef0e5411 100644
--- a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
@@ -14,7 +14,8 @@ public class BasicConnectionPool implements ConnectionPool {
     private final List<Connection> connectionPool;
     private final List<Connection> usedConnections = new ArrayList<>();
     private static final int INITIAL_POOL_SIZE = 10;
-    private final int MAX_POOL_SIZE = 20;
+    private static final int MAX_POOL_SIZE = 20;
+    private static final int MAX_TIMEOUT = 5;
 
     public static BasicConnectionPool create(String url, String user, String password) throws SQLException {
         List<Connection> pool = new ArrayList<>(INITIAL_POOL_SIZE);
@@ -42,6 +43,11 @@ public class BasicConnectionPool implements ConnectionPool {
         }
 
         Connection connection = connectionPool.remove(connectionPool.size() - 1);
+
+        if(!connection.isValid(MAX_TIMEOUT)){
+            connection = createConnection(url, user, password);
+        }
+
         usedConnections.add(connection);
         return connection;
     }

From 13f2b10c8b7bff8dd99fa5831434ce97247815a6 Mon Sep 17 00:00:00 2001
From: Maciej Glowka <maciejglowka.pl@gmail.com>
Date: Wed, 6 May 2020 00:35:07 +0200
Subject: [PATCH 220/404] BAEL-3829: added more distinct bean names, changed
 country codes to ISO codes

---
 .../autowire/BeanFactoryDynamicAutowireService.java    |  9 +++++++--
 ...va => CustomMapFromListDynamicAutowireService.java} | 10 +++++-----
 .../{UkRegionService.java => GBRegionService.java}     |  8 ++++----
 .../com/baeldung/dynamic/autowire/RegionService.java   |  2 +-
 .../{USARegionService.java => USRegionService.java}    |  8 ++++----
 .../autowire/DynamicAutowireIntegrationTest.java       | 10 +++++-----
 6 files changed, 26 insertions(+), 21 deletions(-)
 rename spring-core-4/src/main/java/com/baeldung/dynamic/autowire/{InterfaceDynamicAutowireService.java => CustomMapFromListDynamicAutowireService.java} (55%)
 rename spring-core-4/src/main/java/com/baeldung/dynamic/autowire/{UkRegionService.java => GBRegionService.java} (58%)
 rename spring-core-4/src/main/java/com/baeldung/dynamic/autowire/{USARegionService.java => USRegionService.java} (58%)

diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
index 5f8f2e548e..4ad4420489 100644
--- a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
@@ -6,6 +6,7 @@ import org.springframework.stereotype.Service;
 
 @Service
 public class BeanFactoryDynamicAutowireService {
+    private static final String SERVICE_NAME_SUFFIX = "regionService";
     private final BeanFactory beanFactory;
 
     @Autowired
@@ -13,10 +14,14 @@ public class BeanFactoryDynamicAutowireService {
         this.beanFactory = beanFactory;
     }
 
-    public boolean isServerActive(String countryCode, int serverId) {
-        RegionService service = beanFactory.getBean(countryCode, RegionService.class);
+    public boolean isServerActive(String isoCountryCode, int serverId) {
+        RegionService service = beanFactory.getBean(getRegionServiceBeanName(isoCountryCode), RegionService.class);
 
         return service.isServerActive(serverId);
     }
 
+    private String getRegionServiceBeanName(String isoCountryCode) {
+        return isoCountryCode + SERVICE_NAME_SUFFIX;
+    }
+
 }
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/CustomMapFromListDynamicAutowireService.java
similarity index 55%
rename from spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java
rename to spring-core-4/src/main/java/com/baeldung/dynamic/autowire/CustomMapFromListDynamicAutowireService.java
index ad655f5c42..e04c345d51 100644
--- a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/CustomMapFromListDynamicAutowireService.java
@@ -9,17 +9,17 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
-public class InterfaceDynamicAutowireService {
+public class CustomMapFromListDynamicAutowireService {
     private final Map<String, RegionService> servicesByCountryCode;
 
     @Autowired
-    public InterfaceDynamicAutowireService(List<RegionService> regionServices) {
+    public CustomMapFromListDynamicAutowireService(List<RegionService> regionServices) {
         servicesByCountryCode = regionServices.stream()
-                .collect(Collectors.toMap(RegionService::getCountryCode, Function.identity()));
+                .collect(Collectors.toMap(RegionService::getISOCountryCode, Function.identity()));
     }
 
-    public boolean isServerActive(String countryCode, int serverId) {
-        RegionService service = servicesByCountryCode.get(countryCode);
+    public boolean isServerActive(String isoCountryCode, int serverId) {
+        RegionService service = servicesByCountryCode.get(isoCountryCode);
 
         return service.isServerActive(serverId);
     }
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/GBRegionService.java
similarity index 58%
rename from spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java
rename to spring-core-4/src/main/java/com/baeldung/dynamic/autowire/GBRegionService.java
index 1fbe8ed96e..8c6a1372d4 100644
--- a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/GBRegionService.java
@@ -2,15 +2,15 @@ package com.baeldung.dynamic.autowire;
 
 import org.springframework.stereotype.Service;
 
-@Service("uk")
-public class UkRegionService implements RegionService {
+@Service("GBregionService")
+public class GBRegionService implements RegionService {
     @Override
     public boolean isServerActive(int serverId) {
         return false;
     }
 
     @Override
-    public String getCountryCode() {
-        return "uk";
+    public String getISOCountryCode() {
+        return "GB";
     }
 }
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
index f9f92d045a..a2caf38ab3 100644
--- a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
@@ -3,5 +3,5 @@ package com.baeldung.dynamic.autowire;
 public interface RegionService {
     boolean isServerActive(int serverId);
 
-    String getCountryCode();
+    String getISOCountryCode();
 }
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USRegionService.java
similarity index 58%
rename from spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java
rename to spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USRegionService.java
index cfad0146e5..a2d5f47553 100644
--- a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USRegionService.java
@@ -2,15 +2,15 @@ package com.baeldung.dynamic.autowire;
 
 import org.springframework.stereotype.Service;
 
-@Service("usa")
-public class USARegionService implements RegionService {
+@Service("USregionService")
+public class USRegionService implements RegionService {
     @Override
     public boolean isServerActive(int serverId) {
         return true;
     }
 
     @Override
-    public String getCountryCode() {
-        return "usa";
+    public String getISOCountryCode() {
+        return "US";
     }
 }
diff --git a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
index 5afab69c53..3eb6268e97 100644
--- a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
+++ b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
@@ -17,14 +17,14 @@ public class DynamicAutowireIntegrationTest {
     private BeanFactoryDynamicAutowireService beanFactoryDynamicAutowireService;
 
     @Autowired
-    private InterfaceDynamicAutowireService interfaceDynamicAutowireService;
+    private CustomMapFromListDynamicAutowireService customMapFromListDynamicAutowireService;
 
     @Test
     public void testConstructWorkerByJava() {
-        assertThat(beanFactoryDynamicAutowireService.isServerActive("uk", 101), is(false));
-        assertThat(interfaceDynamicAutowireService.isServerActive("uk", 101), is(false));
+        assertThat(beanFactoryDynamicAutowireService.isServerActive("GB", 101), is(false));
+        assertThat(customMapFromListDynamicAutowireService.isServerActive("GB", 101), is(false));
 
-        assertThat(beanFactoryDynamicAutowireService.isServerActive("usa", 101), is(true));
-        assertThat(interfaceDynamicAutowireService.isServerActive("usa", 101), is(true));
+        assertThat(beanFactoryDynamicAutowireService.isServerActive("US", 101), is(true));
+        assertThat(customMapFromListDynamicAutowireService.isServerActive("US", 101), is(true));
     }
 }

From daa42ab3a0f71d99ba45de268da9a75bb8db67b4 Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Wed, 6 May 2020 01:05:52 +0200
Subject: [PATCH 221/404] JAVA-1529: Add MVC config

---
 spring-mvc-java-2/pom.xml                     | 18 ++++++++++-----
 .../baeldung/pathvariable/SiteController.java |  3 ++-
 .../src/main/webapp/WEB-INF/mvc-servlet.xml   | 17 ++++++++++++++
 .../src/main/webapp/WEB-INF/web.xml           | 22 +++++++++++++++++++
 4 files changed, 54 insertions(+), 6 deletions(-)
 create mode 100644 spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
 create mode 100644 spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml

diff --git a/spring-mvc-java-2/pom.xml b/spring-mvc-java-2/pom.xml
index d5b7d087ab..7deab74fcb 100644
--- a/spring-mvc-java-2/pom.xml
+++ b/spring-mvc-java-2/pom.xml
@@ -7,14 +7,14 @@
     <version>0.1-SNAPSHOT</version>
     <name>spring-mvc-java-2</name>
     <packaging>war</packaging>
-    
+
     <parent>
         <groupId>com.baeldung</groupId>
         <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath>../parent-boot-2</relativePath>
     </parent>
-    
+
     <dependencies>
         <dependency>
             <groupId>javax.servlet</groupId>
@@ -26,14 +26,22 @@
             <artifactId>spring-webmvc</artifactId>
             <version>${spring.mvc.version}</version>
         </dependency>
-
     </dependencies>
-    
+
+    <build>
+        <finalName>spring-mvc-java-2</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
     <properties>
         <javax.version>4.0.1</javax.version>
         <spring.mvc.version>5.2.2.RELEASE</spring.mvc.version>
     </properties>
 
 
-    
 </project>
\ No newline at end of file
diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
index 0ba6d12a0f..493161b0eb 100644
--- a/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
@@ -4,8 +4,9 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-@Controller
+@RestController
 @RequestMapping("/site")
 public class SiteController {
 
diff --git a/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
new file mode 100644
index 0000000000..b8e280dfdf
--- /dev/null
+++ b/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans
+        xmlns="http://www.springframework.org/schema/beans"
+        xmlns:context="http://www.springframework.org/schema/context"
+        xmlns:mvc="http://www.springframework.org/schema/mvc"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="
+        http://www.springframework.org/schema/mvc
+        http://www.springframework.org/schema/mvc/spring-mvc.xsd
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
+        http://www.springframework.org/schema/context
+        http://www.springframework.org/schema/context/spring-context.xsd">
+<!--    <mvc:annotation-driven/>-->
+
+    <context:component-scan base-package="com.baeldung"/>
+</beans>
\ No newline at end of file
diff --git a/spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml b/spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..86a24e7646
--- /dev/null
+++ b/spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee"
+         xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
+    <display-name>Spring MVC Application 2</display-name>
+    <!-- Add Spring MVC DispatcherServlet as front controller -->
+    <servlet>
+        <servlet-name>mvc</servlet-name>
+        <servlet-class>
+            org.springframework.web.servlet.DispatcherServlet
+        </servlet-class>
+        <init-param>
+            <param-name>contextConfigLocation</param-name>
+            <param-value>/WEB-INF/mvc-servlet.xml</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>mvc</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+</web-app>
\ No newline at end of file

From 2d08a88ec0a796805531a5455d23c9501b84cb38 Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Wed, 6 May 2020 01:31:06 +0200
Subject: [PATCH 222/404] Move A Quick Guide to Spring MVC Matrix Variables

---
 spring-mvc-java-2/README.md                   |  3 ++-
 spring-mvc-java-2/pom.xml                     |  5 +++++
 .../{WebConfig.java => CacheWebConfig.java}   |  2 +-
 .../matrix/config/MatrixWebConfig.java        | 18 +++++++++++++++++
 .../matrix}/controller/CompanyController.java | 17 +++++-----------
 .../controller/EmployeeController.java        | 20 +++++--------------
 .../com/baeldung/matrix}/model/Company.java   |  2 +-
 .../com/baeldung/matrix}/model/Employee.java  |  2 +-
 .../src/main/webapp/WEB-INF/mvc-servlet.xml   | 10 ++++++++++
 .../main/webapp/WEB-INF/view/companyHome.jsp  |  0
 .../main/webapp/WEB-INF/view/companyView.jsp  |  0
 .../main/webapp/WEB-INF/view/employeeHome.jsp |  0
 .../main/webapp/WEB-INF/view/employeeView.jsp |  0
 ...CacheControlControllerIntegrationTest.java |  2 +-
 .../matrix}/EmployeeMvcIntegrationTest.java   | 16 +++++++--------
 .../matrix}/EmployeeNoMvcIntegrationTest.java | 10 +++++-----
 spring-mvc-java/README.md                     |  1 -
 17 files changed, 61 insertions(+), 47 deletions(-)
 rename spring-mvc-java-2/src/main/java/com/baeldung/cache/{WebConfig.java => CacheWebConfig.java} (96%)
 create mode 100644 spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java
 rename {spring-mvc-java/src/main/java/com/baeldung/web => spring-mvc-java-2/src/main/java/com/baeldung/matrix}/controller/CompanyController.java (81%)
 rename {spring-mvc-java/src/main/java/com/baeldung/web => spring-mvc-java-2/src/main/java/com/baeldung/matrix}/controller/EmployeeController.java (86%)
 rename {spring-mvc-java/src/main/java/com/baeldung => spring-mvc-java-2/src/main/java/com/baeldung/matrix}/model/Company.java (94%)
 rename {spring-mvc-java/src/main/java/com/baeldung => spring-mvc-java-2/src/main/java/com/baeldung/matrix}/model/Employee.java (97%)
 rename {spring-mvc-java => spring-mvc-java-2}/src/main/webapp/WEB-INF/view/companyHome.jsp (100%)
 rename {spring-mvc-java => spring-mvc-java-2}/src/main/webapp/WEB-INF/view/companyView.jsp (100%)
 rename {spring-mvc-java => spring-mvc-java-2}/src/main/webapp/WEB-INF/view/employeeHome.jsp (100%)
 rename {spring-mvc-java => spring-mvc-java-2}/src/main/webapp/WEB-INF/view/employeeView.jsp (100%)
 rename {spring-mvc-java/src/test/java/com/baeldung/web/controller => spring-mvc-java-2/src/test/java/com/baeldung/matrix}/EmployeeMvcIntegrationTest.java (81%)
 rename {spring-mvc-java/src/test/java/com/baeldung/web/controller => spring-mvc-java-2/src/test/java/com/baeldung/matrix}/EmployeeNoMvcIntegrationTest.java (86%)

diff --git a/spring-mvc-java-2/README.md b/spring-mvc-java-2/README.md
index 50cdafe1d7..09c8d8b294 100644
--- a/spring-mvc-java-2/README.md
+++ b/spring-mvc-java-2/README.md
@@ -2,4 +2,5 @@
 
 - [Cache Headers in Spring MVC](https://www.baeldung.com/spring-mvc-cache-headers)
 - [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
-- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
\ No newline at end of file
+- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
+- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables)
\ No newline at end of file
diff --git a/spring-mvc-java-2/pom.xml b/spring-mvc-java-2/pom.xml
index 7deab74fcb..af622321cb 100644
--- a/spring-mvc-java-2/pom.xml
+++ b/spring-mvc-java-2/pom.xml
@@ -26,6 +26,11 @@
             <artifactId>spring-webmvc</artifactId>
             <version>${spring.mvc.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheWebConfig.java
similarity index 96%
rename from spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheWebConfig.java
index 2f07912e80..95367077bd 100644
--- a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheWebConfig.java
@@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit;
 @EnableWebMvc
 @Configuration
 @ComponentScan(basePackages = {"com.baeldung.cache"})
-public class WebConfig implements WebMvcConfigurer {
+public class CacheWebConfig implements WebMvcConfigurer {
 
     @Override
     public void addViewControllers(final ViewControllerRegistry registry) {
diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java
new file mode 100644
index 0000000000..489740fd33
--- /dev/null
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java
@@ -0,0 +1,18 @@
+package com.baeldung.matrix.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.util.UrlPathHelper;
+
+@Configuration
+public class MatrixWebConfig implements WebMvcConfigurer {
+
+    @Override
+    public void configurePathMatch(PathMatchConfigurer configurer) {
+        final UrlPathHelper urlPathHelper = new UrlPathHelper();
+        urlPathHelper.setRemoveSemicolonContent(false);
+
+        configurer.setUrlPathHelper(urlPathHelper);
+    }
+}
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/CompanyController.java
similarity index 81%
rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/CompanyController.java
index af1e729c13..7a21ded026 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/CompanyController.java
@@ -1,23 +1,16 @@
-package com.baeldung.web.controller;
-
-import java.util.HashMap;
-import java.util.Map;
+package com.baeldung.matrix.controller;
 
+import com.baeldung.matrix.model.Company;
 import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.MatrixVariable;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.baeldung.model.Company;
+import java.util.HashMap;
+import java.util.Map;
 
 @Controller
 public class CompanyController {
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/EmployeeController.java
similarity index 86%
rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/EmployeeController.java
index 251287dff8..3f9de2179a 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/EmployeeController.java
@@ -1,32 +1,22 @@
-package com.baeldung.web.controller;
+package com.baeldung.matrix.controller;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
 
+import com.baeldung.matrix.model.Employee;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.MatrixVariable;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.baeldung.model.Employee;
+import java.util.*;
 
 @SessionAttributes("employees")
 @Controller
 public class EmployeeController {
 
-    Map<Long, Employee> employeeMap = new HashMap<>();
+    public Map<Long, Employee> employeeMap = new HashMap<>();
 
     @ModelAttribute("employees")
     public void initEmployees() {
diff --git a/spring-mvc-java/src/main/java/com/baeldung/model/Company.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Company.java
similarity index 94%
rename from spring-mvc-java/src/main/java/com/baeldung/model/Company.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Company.java
index 558507268a..cdf6cb0fd6 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/model/Company.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Company.java
@@ -1,4 +1,4 @@
-package com.baeldung.model;
+package com.baeldung.matrix.model;
 
 public class Company {
 
diff --git a/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Employee.java
similarity index 97%
rename from spring-mvc-java/src/main/java/com/baeldung/model/Employee.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Employee.java
index fb0a452219..c3384122b4 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.model;
+package com.baeldung.matrix.model;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
diff --git a/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
index b8e280dfdf..00dac5f8cb 100644
--- a/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
+++ b/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
@@ -11,7 +11,17 @@
         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
+
 <!--    <mvc:annotation-driven/>-->
 
+    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <property name="prefix">
+            <value>/WEB-INF/view/</value>
+        </property>
+        <property name="suffix">
+            <value>.jsp</value>
+        </property>
+    </bean>
+
     <context:component-scan base-package="com.baeldung"/>
 </beans>
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/companyHome.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyHome.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/companyHome.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyHome.jsp
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/companyView.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyView.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/companyView.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyView.jsp
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeHome.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeHome.jsp
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeView.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeView.jsp
diff --git a/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java
index 7acfe5e480..1e34dd182b 100644
--- a/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java
+++ b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java
@@ -19,7 +19,7 @@ import static org.springframework.http.HttpHeaders.IF_UNMODIFIED_SINCE;
 
 @ExtendWith(SpringExtension.class)
 @WebAppConfiguration
-@ContextConfiguration(classes = {WebConfig.class, WebConfig.class})
+@ContextConfiguration(classes = {CacheWebConfig.class, CacheWebConfig.class})
 public class CacheControlControllerIntegrationTest {
 
     @Autowired
diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeMvcIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeMvcIntegrationTest.java
similarity index 81%
rename from spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeMvcIntegrationTest.java
rename to spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeMvcIntegrationTest.java
index 86420a5fbd..c061c1efc7 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeMvcIntegrationTest.java
+++ b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeMvcIntegrationTest.java
@@ -1,11 +1,7 @@
-package com.baeldung.web.controller;
-
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+package com.baeldung.matrix;
 
+import com.baeldung.matrix.config.MatrixWebConfig;
+import com.baeldung.matrix.controller.EmployeeController;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -18,11 +14,13 @@ import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 
-import com.baeldung.spring.web.config.WebConfig;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @WebAppConfiguration
-@ContextConfiguration(classes = WebConfig.class)
+@ContextConfiguration(classes = { MatrixWebConfig.class, EmployeeController.class })
 public class EmployeeMvcIntegrationTest {
 
     @Autowired
diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeNoMvcIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeNoMvcIntegrationTest.java
similarity index 86%
rename from spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeNoMvcIntegrationTest.java
rename to spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeNoMvcIntegrationTest.java
index e84c20c973..2ca70cc0b9 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeNoMvcIntegrationTest.java
+++ b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeNoMvcIntegrationTest.java
@@ -1,5 +1,8 @@
-package com.baeldung.web.controller;
+package com.baeldung.matrix;
 
+import com.baeldung.matrix.config.MatrixWebConfig;
+import com.baeldung.matrix.controller.EmployeeController;
+import com.baeldung.matrix.model.Employee;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -9,12 +12,9 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.test.context.web.WebAppConfiguration;
 
-import com.baeldung.model.Employee;
-import com.baeldung.spring.web.config.WebConfig;
-
 @RunWith(SpringJUnit4ClassRunner.class)
 @WebAppConfiguration
-@ContextConfiguration(classes = WebConfig.class)
+@ContextConfiguration(classes = { MatrixWebConfig.class, EmployeeController.class })
 public class EmployeeNoMvcIntegrationTest {
 
     @Autowired
diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md
index 0edc73e0e0..877d92901a 100644
--- a/spring-mvc-java/README.md
+++ b/spring-mvc-java/README.md
@@ -8,7 +8,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
 
 ### Relevant Articles: 
 - [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring)
-- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables)
 - [File Upload with Spring MVC](https://www.baeldung.com/spring-file-upload)
 - [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit)
 - [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files)

From fb5b157ce455b182a729ede1362d86bf4e1a235e Mon Sep 17 00:00:00 2001
From: sasam0320 <63002713+sasam0320@users.noreply.github.com>
Date: Wed, 6 May 2020 05:28:28 +0200
Subject: [PATCH 223/404] Add missing code snippets (#9228)

---
 .../spring-boot-properties/pom.xml            |  1 +
 .../processor/JdbcProperties.java             | 21 +++++++++++
 .../processor/PropertyBeanInjection.java      | 11 ++++--
 .../configurationproperties/Database.java     | 36 +++++++++++++++++++
 .../DatabaseConfig.java                       | 23 ++++++++++++
 .../DatabaseConfigPropertiesApp.java          | 13 +++++++
 .../spring/PropertyPlaceholderConfig.java     | 23 ++++++++++++
 .../PropertySourcesPlaceholderConfig.java     | 24 +++++++++++++
 .../src/main/resources/application.properties |  3 --
 .../main/resources/configForProperties.xml    |  6 +++-
 .../configForPropertyPlaceholderBeans.xml     | 23 ++++++++++++
 .../configuration-processor.properties        |  3 ++
 .../src/main/resources/database.properties    |  4 +++
 .../src/main/resources/database.yml           |  5 +++
 .../PropertyBeanInjectionUnitTest.java        |  5 +++
 .../ConfigPropertiesIntegrationTest.java      | 16 +++++++--
 ...PlaceholdersJavaConfigIntegrationTest.java | 23 ++++++++++++
 ...ePlaceholdersXmlConfigIntegrationTest.java | 25 +++++++++++++
 ...plePropertiesXmlConfigIntegrationTest.java |  3 ++
 .../baeldung/test/IntegrationTestSuite.java   |  6 ++--
 .../configuration-processor.properties        |  1 +
 .../test/resources/database-test.properties   |  3 ++
 22 files changed, 268 insertions(+), 10 deletions(-)
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties

diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml
index ec05ec1bdc..ef9c084f4c 100644
--- a/spring-boot-modules/spring-boot-properties/pom.xml
+++ b/spring-boot-modules/spring-boot-properties/pom.xml
@@ -128,6 +128,7 @@
         <httpcore.version>4.4.11</httpcore.version>
         <resource.delimiter>@</resource.delimiter>
         <configuration-processor.version>2.2.4.RELEASE</configuration-processor.version>
+        <start-class>com.baeldung.buildproperties.Application</start-class>
     </properties>
 
 </project>
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java
new file mode 100644
index 0000000000..bbd193acba
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java
@@ -0,0 +1,21 @@
+package com.baeldung.configuration.processor;
+
+import org.springframework.boot.context.properties.*;
+import org.springframework.context.annotation.*;
+import org.springframework.beans.factory.annotation.*;
+
+@Configuration
+@ConfigurationProperties(prefix = "com.baeldung")
+public class JdbcProperties {
+
+    @Value("${jdbc.url:jdbc:postgresql:/localhost:5432}")
+    private String jdbcUrl;
+
+    public String getJdbcUrl() {
+        return jdbcUrl;
+    }
+
+    public void setJdbcUrl(String jdbcUrl) {
+        this.jdbcUrl = jdbcUrl;
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
index 3bcbf41f54..89a8f9458c 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
@@ -6,16 +6,23 @@ import org.springframework.stereotype.*;
 @Component
 public class PropertyBeanInjection {
 
-    private final CustomProperties customProperties;
+    private CustomProperties customProperties;
 
-    PropertyBeanInjection(@Autowired CustomProperties customProperties) {
+    private JdbcProperties jdbcProperties;
+
+    PropertyBeanInjection(@Autowired CustomProperties customProperties, @Autowired JdbcProperties jdbcProperties) {
         this.customProperties = customProperties;
+        this.jdbcProperties = jdbcProperties;
     }
 
     String getUrl() {
         return customProperties.getUrl();
     }
 
+    String getJdbcUrl() {
+        return jdbcProperties.getJdbcUrl();
+    }
+
     int getTimeoutInMilliseconds() {
         return customProperties.getTimeoutInMilliSeconds();
     }
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java
new file mode 100644
index 0000000000..990ede35cd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java
@@ -0,0 +1,36 @@
+package com.baeldung.configurationproperties;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+
+@ConfigurationProperties(prefix = "database")
+public class Database {
+
+    String url;
+    String username;
+    String password;
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java
new file mode 100644
index 0000000000..8f17c98f03
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.configurationproperties;
+
+import org.springframework.core.env.Environment;
+import org.springframework.beans.factory.annotation.*;
+import org.springframework.context.annotation.*;
+
+@Configuration
+public class DatabaseConfig {
+
+    @Autowired private Environment env;
+
+    @Bean(name="dataSource")
+    public Database dataSource() {
+
+        Database dataSource = new Database();
+        dataSource.setUrl(env.getProperty("jdbc.url"));
+        dataSource.setUsername(env.getProperty("database.username"));
+        dataSource.setPassword(env.getProperty("database.password"));
+
+        return dataSource;
+    }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java
new file mode 100644
index 0000000000..bb1c937f60
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java
@@ -0,0 +1,13 @@
+package com.baeldung.configurationproperties;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackageClasses = {Database.class,DatabaseConfig.class})
+public class DatabaseConfigPropertiesApp{
+
+    public static void main(String[]args) {SpringApplication.run(DatabaseConfigPropertiesApp.class,args);}
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java
new file mode 100644
index 0000000000..0d1eb4ccf7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.spring;
+
+import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.*;
+
+@Configuration
+public class PropertyPlaceholderConfig {
+
+    public PropertyPlaceholderConfig(){
+        super();
+    }
+
+    @Bean
+    public static PropertyPlaceholderConfigurer properties() {
+        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
+        Resource[] resources = new ClassPathResource[]{ new ClassPathResource("foo.properties") };
+        ppc.setLocations( resources );
+        ppc.setIgnoreUnresolvablePlaceholders( true );
+        return ppc;
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java
new file mode 100644
index 0000000000..8ff464e4cf
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java
@@ -0,0 +1,24 @@
+package com.baeldung.properties.spring;
+
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.*;
+
+@Configuration
+public class PropertySourcesPlaceholderConfig{
+
+    public PropertySourcesPlaceholderConfig(){
+        super();
+    }
+
+    @Bean
+    public static PropertySourcesPlaceholderConfigurer properties(){
+        PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
+        Resource[] resources = new ClassPathResource[]{ new ClassPathResource("foo.properties") };
+        pspc.setLocations(resources);
+        pspc.setIgnoreUnresolvablePlaceholders(true);
+        return pspc;
+    }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties
index d4d1df7abc..af38556f81 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties
@@ -3,6 +3,3 @@ spring.properties.refreshDelay=1000
 spring.config.location=file:extra.properties
 spring.main.allow-bean-definition-overriding=true
 
-database.url=jdbc:postgresql:/localhost:5432/instance
-database.username=foo
-database.password=bar
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
index d796f791cb..4468bb485f 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
@@ -7,10 +7,14 @@
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
 >
 
-    <context:property-placeholder location="classpath:foo.properties,classpath:bar.properties"/>
+    <context:property-placeholder location="classpath:foo.properties,classpath:bar.properties, classpath:database.properties"/>
 
     <bean id="componentInXmlUsingProperties" class="com.baeldung.properties.core.ComponentInXmlUsingProperties">
         <constructor-arg value="${key.something}"/>
     </bean>
 
+    <bean id="dataSource" class="com.baeldung.configurationproperties.Database">
+        <property name="url" value="${jdbc.url}" />
+    </bean>
+
 </beans>
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml
new file mode 100644
index 0000000000..a296cf5169
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"
+>
+
+<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+    <property name="locations">
+        <list>
+            <value>classpath:foo.properties</value>
+        </list>
+    </property>
+    <property name="ignoreUnresolvablePlaceholders" value="true"/>
+</bean>
+
+<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
+    <property name="locations">
+        <list>
+            <value>classpath:foo.properties</value>
+        </list>
+    </property>
+    <property name="ignoreUnresolvablePlaceholders" value="true"/>
+</bean>
+</beans>
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties
new file mode 100644
index 0000000000..b68a4fbda3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties
@@ -0,0 +1,3 @@
+com.baeldung.url=www.abc.test.com
+com.baeldung.jdbc.url=
+com.baeldung.timeout-in-milli-seconds=2000
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
new file mode 100644
index 0000000000..6524ce6109
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
@@ -0,0 +1,4 @@
+database.url=jdbc:postgresql:/localhost:5432/instance
+database.username=foo
+database.password=bar
+jdbc.url=jdbc:postgresql:/localhost:5432
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml b/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
new file mode 100644
index 0000000000..8404d9411a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
@@ -0,0 +1,5 @@
+database:
+    url: jdbc:postresql:/localhost:5432/instance
+    username: foo
+    password: bar
+secret: foo
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
index bdeb6547c3..eb6add2b94 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
@@ -15,6 +15,11 @@ class PropertyBeanInjectionUnitTest {
     @Autowired
     private PropertyBeanInjection propertyBeanInjection;
 
+    @Test
+    void checkThatJdbcPropertiesHaveTheCorrectValueFromPropertiesFile() {
+        Assertions.assertEquals("jdbc:postgresql:/localhost:5432", propertyBeanInjection.getJdbcUrl());
+    }
+
     @Test
     void checkThatCustomPropertiesHaveTheCorrectValueFromPropertiesFile() {
         Assertions.assertEquals("www.abc.test.com", propertyBeanInjection.getUrl());
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
index 141400b1fe..2b0833c387 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
@@ -4,6 +4,7 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -13,13 +14,17 @@ import com.baeldung.properties.AdditionalProperties;
 import com.baeldung.properties.ConfigPropertiesDemoApplication;
 
 @RunWith(SpringRunner.class)
-@SpringBootTest(classes = ConfigPropertiesDemoApplication.class)
-@TestPropertySource("classpath:configprops-test.properties")
+@SpringBootTest(classes = {ConfigPropertiesDemoApplication.class, DatabaseConfigPropertiesApp.class})
+@TestPropertySource(locations = {"classpath:configprops-test.properties", "classpath:database-test.properties"})
 public class ConfigPropertiesIntegrationTest {
 
     @Autowired
     private ConfigProperties properties;
 
+    @Autowired
+    @Qualifier("dataSource")
+    private Database databaseProperties;
+
     @Autowired
     private AdditionalProperties additionalProperties;
 
@@ -53,4 +58,11 @@ public class ConfigPropertiesIntegrationTest {
         Assert.assertTrue(additionalProperties.getUnit().equals("km"));
         Assert.assertTrue(additionalProperties.getMax() == 100);
     }
+
+    @Test
+    public void whenDatabasePropertyQueriedthenReturnsProperty() {
+        Assert.assertTrue(databaseProperties.getUrl().equals("jdbc:postgresql:/localhost:5432"));
+        Assert.assertTrue(databaseProperties.getUsername().equals("foo"));
+        Assert.assertTrue(databaseProperties.getPassword().equals("bar"));
+    }
 }
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java
new file mode 100644
index 0000000000..8ebda90321
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.multiple;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import com.baeldung.properties.spring.PropertyPlaceholderConfig;
+import com.baeldung.properties.spring.PropertySourcesPlaceholderConfig;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringJUnitConfig({PropertyPlaceholderConfig.class, PropertySourcesPlaceholderConfig.class})
+public class MultiplePlaceholdersJavaConfigIntegrationTest {
+
+    @Value("${key.something}")
+    private String something;
+
+
+    @Test
+    public void whenReadInjectedValues_thenGetCorrectValues() {
+        assertThat(something).isEqualTo("val");
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java
new file mode 100644
index 0000000000..b863e2e080
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.properties.multiple;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+
+@SpringJUnitConfig(locations = "classpath:configForPropertyPlaceholderBeans.xml")
+public class MultiplePlaceholdersXmlConfigIntegrationTest {
+
+    @Value("${foo}")
+    private String something;
+
+    @Value("${key.something}")
+    private String something2;
+
+
+    @Test
+    public void whenReadInjectedValues_thenGetCorrectValues() {
+        assertThat(something).isEqualTo("bar");
+        assertThat(something2).isEqualTo("val");
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
index db71e816dd..6827ee1cf1 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
@@ -13,9 +13,12 @@ public class MultiplePropertiesXmlConfigIntegrationTest {
 
     @Value("${key.something2}") private String something2;
 
+    @Value("${jdbc.url}") private String jdbcUrl;
+
     @Test
     public void whenReadInjectedValues_thenGetCorrectValues() {
         assertThat(something).isEqualTo("val");
         assertThat(something2).isEqualTo("val2");
+        assertThat(jdbcUrl).isEqualTo("jdbc:postgresql:/localhost:5432");
     }
 }
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java
index d41d328867..0e0f8f6230 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java
@@ -10,6 +10,8 @@ import com.baeldung.properties.basic.PropertiesWithXmlIntegrationTest;
 import com.baeldung.properties.external.ExternalPropertiesWithJavaIntegrationTest;
 import com.baeldung.properties.external.ExternalPropertiesWithMultipleXmlsIntegrationTest;
 import com.baeldung.properties.external.ExternalPropertiesWithXmlManualTest;
+import com.baeldung.properties.multiple.MultiplePropertiesXmlConfigIntegrationTest;
+import com.baeldung.properties.multiple.MultiplePlaceholdersXmlConfigIntegrationTest;
 
 @RunWith(Suite.class)
 @SuiteClasses({ //@formatter:off
@@ -17,8 +19,8 @@ import com.baeldung.properties.external.ExternalPropertiesWithXmlManualTest;
     ExternalPropertiesWithJavaIntegrationTest.class,
     ExternalPropertiesWithMultipleXmlsIntegrationTest.class,
     ExternalPropertiesWithXmlManualTest.class,
-    ExtendedPropertiesWithJavaIntegrationTest.class,
-    PropertiesWithMultipleXmlsIntegrationTest.class,
+    ExtendedPropertiesWithJavaIntegrationTest.class, MultiplePropertiesXmlConfigIntegrationTest.class,
+    PropertiesWithMultipleXmlsIntegrationTest.class, MultiplePlaceholdersXmlConfigIntegrationTest.class
 })// @formatter:on
 public final class IntegrationTestSuite {
     //
diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
index 00369f2eff..b68a4fbda3 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
+++ b/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
@@ -1,2 +1,3 @@
 com.baeldung.url=www.abc.test.com
+com.baeldung.jdbc.url=
 com.baeldung.timeout-in-milli-seconds=2000
diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties
new file mode 100644
index 0000000000..384d0850ab
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties
@@ -0,0 +1,3 @@
+jdbc.url=jdbc:postgresql:/localhost:5432
+database.username=foo
+database.password=bar

From 0774d2f238d938c9fc37dea58421f486e863861a Mon Sep 17 00:00:00 2001
From: mthomas <spatialguru.net@gmail.com>
Date: Tue, 5 May 2020 22:38:52 -0500
Subject: [PATCH 224/404] BAEL-3974 - Add unit test for streaming Base64
 encoding

---
 .../pdf/base64/EncodeDecodeUnitTest.java      | 31 ++++++++++++++++---
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java
index 0fb61ea121..faade80884 100644
--- a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java
+++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java
@@ -1,17 +1,19 @@
 package com.baeldung.pdf.base64;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
 public class EncodeDecodeUnitTest {
 
     private static final String IN_FILE = "src/test/resources/input.pdf";
@@ -39,6 +41,27 @@ public class EncodeDecodeUnitTest {
 
     }
 
+    @Test
+    public void givenJavaBase64_whenEncodedStream_thenDecodedStreamOK() throws IOException {
+
+        try (OutputStream os = java.util.Base64.getEncoder().wrap(new FileOutputStream(OUT_FILE));
+          FileInputStream fis = new FileInputStream(IN_FILE)) {
+            byte[] bytes = new byte[1024];
+            int read;
+            while ((read = fis.read(bytes)) > -1) {
+                os.write(bytes, 0, read);
+            }
+        }
+
+        byte[] encoded = java.util.Base64.getEncoder().encode(inFileBytes);
+        byte[] encodedOnDisk = Files.readAllBytes(Paths.get(OUT_FILE));
+        assertArrayEquals(encoded, encodedOnDisk);
+
+        byte[] decoded = java.util.Base64.getDecoder().decode(encoded);
+        byte[] decodedOnDisk = java.util.Base64.getDecoder().decode(encodedOnDisk);
+        assertArrayEquals(decoded, decodedOnDisk);
+    }
+
     @Test
     public void givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK() throws IOException {
 

From b4315b82d889944899672ddde5675c31599fdc33 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Wed, 6 May 2020 15:12:08 +0800
Subject: [PATCH 225/404] Update README.md

---
 spring-thymeleaf-2/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-thymeleaf-2/README.md b/spring-thymeleaf-2/README.md
index d2d10f81da..a8c067a443 100644
--- a/spring-thymeleaf-2/README.md
+++ b/spring-thymeleaf-2/README.md
@@ -13,5 +13,5 @@ This module contains articles about Spring with Thymeleaf
 - [Working with Boolean in Thymeleaf](https://www.baeldung.com/thymeleaf-boolean)
 - [Working With Custom HTML Attributes in Thymeleaf](https://www.baeldung.com/thymeleaf-custom-html-attributes)
 - [How to Create an Executable JAR with Maven](https://www.baeldung.com/executable-jar-with-maven)
-- [https://www.baeldung.com/spring-mvc-thymeleaf-data](https://www.baeldung.com/spring-mvc-thymeleaf-data)
+- [Spring MVC Data and Thymeleaf](https://www.baeldung.com/spring-mvc-thymeleaf-data)
 - [[<-- prev]](/spring-thymeleaf)

From c9ebd8e33e6da1859c06e02e53db7dd615bef7e1 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Wed, 6 May 2020 15:17:10 +0800
Subject: [PATCH 226/404] Update README.md

---
 atomikos/README.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/atomikos/README.md b/atomikos/README.md
index 2c44e388fe..f9129233ec 100644
--- a/atomikos/README.md
+++ b/atomikos/README.md
@@ -1,5 +1,4 @@
 ## Atomikos
-
 This module contains articles about Atomikos
 
 ### Relevant Articles: 

From 355cce7cc706959d3069a905128c966960082b6f Mon Sep 17 00:00:00 2001
From: mthomas <spatialguru.net@gmail.com>
Date: Wed, 6 May 2020 02:56:12 -0500
Subject: [PATCH 227/404] BAEL-3974 - Put imports back in place

---
 .../com/baeldung/pdf/base64/EncodeDecodeUnitTest.java     | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java
index faade80884..0df6f58136 100644
--- a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java
+++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java
@@ -1,5 +1,9 @@
 package com.baeldung.pdf.base64;
 
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -10,10 +14,6 @@ import java.nio.file.Paths;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
 public class EncodeDecodeUnitTest {
 
     private static final String IN_FILE = "src/test/resources/input.pdf";

From 6b28cb46d0ca341d0f4b1eb6db88dd33d9862143 Mon Sep 17 00:00:00 2001
From: Krzysztof Majewski <krzysztof.majewski.km1@contractors.roche.com>
Date: Wed, 6 May 2020 13:54:59 +0200
Subject: [PATCH 228/404] BAEL-3916

---
 .../junit/SeleniumJavaScriptClickTest.java    | 56 +++++++++++++++++++
 1 file changed, 56 insertions(+)
 create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java

diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
new file mode 100644
index 0000000000..dafafd72ef
--- /dev/null
+++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
@@ -0,0 +1,56 @@
+package java.com.baeldung.selenium.junit;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static org.junit.Assert.assertEquals;
+
+public class SeleniumJavaScriptClickTest {
+
+    private WebDriver driver;
+    private WebDriverWait wait;
+
+    @Before
+    public void setUp() {
+        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
+        driver = new ChromeDriver();
+        wait = new WebDriverWait(driver, 5000);
+    }
+
+    @After
+    public void cleanUp() {
+        driver.close();
+    }
+
+    @Test
+    public void should_search_for_selenium_articles() {
+        driver.get("https://baeldung.com");
+        String title = driver.getTitle();
+        assertEquals("Baeldung | Java, Spring and Web Development tutorials", title);
+
+        wait.until(ExpectedConditions.elementToBeClickable(By.className("menu-search")));
+        WebElement searchButton = driver.findElement(By.className("menu-search"));
+        clickElement(searchButton);
+
+        WebElement searchInput = driver.findElement(By.id("search"));
+        searchInput.sendKeys("Selenium");
+
+        wait.until(ExpectedConditions.elementToBeClickable(By.className("btn-search")));
+        WebElement seeSearchResultsButton = driver.findElement(By.className("btn-search"));
+        clickElement(seeSearchResultsButton);
+    }
+
+    private void clickElement(WebElement element) {
+        JavascriptExecutor executor = (JavascriptExecutor) driver;
+        executor.executeScript("arguments[0].click();", element);
+    }
+
+}

From 2dd9b8010750d017d47597e8df82d3ce5a825943 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Wed, 6 May 2020 18:14:05 +0530
Subject: [PATCH 229/404] JAVA-956: Migrate apache-shiro to parent-boot-2

---
 apache-shiro/pom.xml                          |  4 ++--
 .../src/main/java/com/baeldung/Main.java      |  7 ++++--
 .../main/java/com/baeldung/MyCustomRealm.java | 22 +++++++++++++------
 .../shiro/permissions/custom/Main.java        |  9 ++++----
 4 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index d519ba42af..3df6283437 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -10,9 +10,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
diff --git a/apache-shiro/src/main/java/com/baeldung/Main.java b/apache-shiro/src/main/java/com/baeldung/Main.java
index 5e341f251b..99515bb705 100644
--- a/apache-shiro/src/main/java/com/baeldung/Main.java
+++ b/apache-shiro/src/main/java/com/baeldung/Main.java
@@ -1,11 +1,14 @@
 package com.baeldung;
 
 import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.*;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.mgt.DefaultSecurityManager;
 import org.apache.shiro.mgt.SecurityManager;
 import org.apache.shiro.realm.Realm;
-import org.apache.shiro.realm.text.IniRealm;
 import org.apache.shiro.session.Session;
 import org.apache.shiro.subject.Subject;
 import org.slf4j.Logger;
diff --git a/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java b/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java
index 8d792c76a5..6d7c01d96e 100644
--- a/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java
+++ b/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java
@@ -1,16 +1,24 @@
 package com.baeldung;
 
-import org.apache.shiro.authc.*;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.authz.AuthorizationInfo;
 import org.apache.shiro.authz.SimpleAuthorizationInfo;
 import org.apache.shiro.realm.jdbc.JdbcRealm;
 import org.apache.shiro.subject.PrincipalCollection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.*;
 
 public class MyCustomRealm extends JdbcRealm {
 
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
index a373122d6c..a902a24388 100644
--- a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
@@ -1,14 +1,15 @@
 package com.baeldung.shiro.permissions.custom;
 
-import com.baeldung.MyCustomRealm;
 import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.*;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.config.Ini;
 import org.apache.shiro.mgt.DefaultSecurityManager;
 import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.realm.Realm;
 import org.apache.shiro.realm.text.IniRealm;
-import org.apache.shiro.session.Session;
 import org.apache.shiro.subject.Subject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

From 9770eda888cbb418aa6be7ff1c891c706bf1339c Mon Sep 17 00:00:00 2001
From: Michael Pratt <mike@Michaels-iMac.local>
Date: Wed, 6 May 2020 10:38:16 -0600
Subject: [PATCH 230/404] BAEL-3972: Move code examples to new package

---
 .../spring-security-core/README.md            |  1 +
 .../app/controller/TaskController.java        | 58 -----------------
 .../java/com/baeldung/checkrolejava/App.java  | 11 ++++
 .../checkrolejava/UnauthorizedException.java  |  8 +++
 .../checkrolejava/UserController.java         | 62 +++++++++++++++++++
 5 files changed, 82 insertions(+), 58 deletions(-)
 create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java
 create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java
 create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java

diff --git a/spring-security-modules/spring-security-core/README.md b/spring-security-modules/spring-security-core/README.md
index e42dfecaa0..f28b3abb2b 100644
--- a/spring-security-modules/spring-security-core/README.md
+++ b/spring-security-modules/spring-security-core/README.md
@@ -8,6 +8,7 @@ This module contains articles about core Spring Security
 - [Introduction to Spring Method Security](https://www.baeldung.com/spring-security-method-security)
 - [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy)
 - [Deny Access on Missing @PreAuthorize to Spring Controller Methods](https://www.baeldung.com/spring-deny-access)
+- [Spring Security: Check If a User Has a Role in Java](https://www.baeldung.com/spring-security-check-user-role)
 
 ### Build the Project
 
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java
index 67072b5d61..7e6b2c3d9c 100644
--- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java
@@ -42,62 +42,4 @@ public class TaskController {
 
         return ResponseEntity.ok().body(tasks);
     }
-
-    /**
-     * Example of restricting specific endpoints to specific roles using @PreAuthorize.
-     */
-    @GetMapping("/manager")
-    @PreAuthorize("hasRole('ROLE_MANAGER')")
-    public ResponseEntity<Iterable<Task>> getAlManagerTasks() {
-        Iterable<Task> tasks = taskService.findAll();
-
-        return ResponseEntity.ok().body(tasks);
-    }
-
-    /**
-     * Example of restricting specific endpoints to specific roles using SecurityContext.
-     */
-    @GetMapping("/actuator")
-    public ResponseEntity<Iterable<Task>> getAlActuatorTasks() {
-        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
-        if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ACTUATOR")))
-        {
-            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
-        }
-
-        Iterable<Task> tasks = taskService.findAll();
-
-        return ResponseEntity.ok().body(tasks);
-    }
-
-    /**
-     * Example of restricting specific endpoints to specific roles using UserDetailsService.
-     */
-    @GetMapping("/admin")
-    public ResponseEntity<Iterable<Task>> getAlAdminTasks() {
-        if(userDetailsService != null) {
-            UserDetails details = userDetailsService.loadUserByUsername("pam");
-            if (details != null && details.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
-                return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
-            }
-        }
-
-        Iterable<Task> tasks = taskService.findAll();
-
-        return ResponseEntity.ok().body(tasks);
-    }
-
-    /**
-     * Example of restricting specific endpoints to specific roles using HttpServletRequest.
-     */
-    @GetMapping("/admin2")
-    public ResponseEntity<Iterable<Task>> getAlAdminTasksUsingServlet(HttpServletRequest request) {
-        if (!request.isUserInRole("ROLE_ADMIN")) {
-            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
-        }
-
-        Iterable<Task> tasks = taskService.findAll();
-
-        return ResponseEntity.ok().body(tasks);
-    }
 }
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java
new file mode 100644
index 0000000000..357583a572
--- /dev/null
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java
@@ -0,0 +1,11 @@
+package com.baeldung.checkrolejava;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class App {
+    public static void main(String[] args) {
+        SpringApplication.run(com.baeldung.app.App.class, args);
+    }
+}
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java
new file mode 100644
index 0000000000..11fe9f9e5f
--- /dev/null
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java
@@ -0,0 +1,8 @@
+package com.baeldung.checkrolejava;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
+public class UnauthorizedException extends RuntimeException {
+}
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java
new file mode 100644
index 0000000000..3092e94c7f
--- /dev/null
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java
@@ -0,0 +1,62 @@
+package com.baeldung.checkrolejava;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Controller
+public class UserController {
+
+    @Autowired
+    private UserDetailsService userDetailsService;
+
+    @PreAuthorize("hasRole('ROLE_ADMIN')")
+    @GetMapping("/user/{id}")
+    public String getUser(@PathVariable("id") String id) {
+        return "user";
+    }
+
+    @PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')")
+    @GetMapping("/users")
+    public String getUsers() {
+        return "users";
+    }
+
+    @GetMapping("v2/user/{id}")
+    public String getUserUsingSecurityContext() {
+        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+        if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
+            return "user";
+        }
+
+        throw new UnauthorizedException();
+    }
+
+    @GetMapping("v2/users")
+    public String getUsersUsingDetailsService() {
+        UserDetails details = userDetailsService.loadUserByUsername("mike");
+        if (details != null && details.getAuthorities().stream()
+                .anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
+            return "users";
+        }
+
+        throw new UnauthorizedException();
+    }
+
+    @GetMapping("v3/users")
+    public String getUsers(HttpServletRequest request) {
+        if (request.isUserInRole("ROLE_ADMIN")) {
+            return "users";
+        }
+
+        throw new UnauthorizedException();
+    }
+}

From dbbcfc21186c55469413b73ca08c82b33fdcbf40 Mon Sep 17 00:00:00 2001
From: CHANDRAKANT Kumar <kumar.chandrakant@soprabanking.com>
Date: Wed, 6 May 2020 22:19:19 +0530
Subject: [PATCH 231/404] Refactored the codebase.

---
 java-es-cqrs/pom.xml                          |  9 ++-
 .../cqrs/projectors/UserProjector.java        | 25 +++-----
 .../java/com/baeldung/patterns/crud/Main.java | 48 ---------------
 .../baeldung/patterns/domain/UserAddress.java |  2 -
 .../baeldung/patterns/domain/UserContact.java |  2 -
 .../java/com/baeldung/patterns/es/Main.java   | 48 ---------------
 .../patterns/es/events/UserRemovedEvent.java  | 12 ----
 .../patterns/es/service/UserService.java      | 48 +++++----------
 .../patterns/es/service/UserUtility.java      |  4 --
 .../escqrs/projectors/UserProjector.java      | 58 +++++--------------
 .../patterns/cqrs/ApplicationUnitTest.java}   | 39 +++++++++----
 .../patterns/crud/ApplicationUnitTest.java    | 48 +++++++++++++++
 .../patterns/es/ApplicationUnitTest.java      | 50 ++++++++++++++++
 .../patterns/escqrs/ApplicationUnitTest.java} | 37 ++++++++----
 14 files changed, 195 insertions(+), 235 deletions(-)
 delete mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java
 delete mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java
 delete mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java
 rename java-es-cqrs/src/{main/java/com/baeldung/patterns/cqrs/Main.java => test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java} (66%)
 create mode 100644 java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
 create mode 100644 java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
 rename java-es-cqrs/src/{main/java/com/baeldung/patterns/escqrs/Main.java => test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java} (69%)

diff --git a/java-es-cqrs/pom.xml b/java-es-cqrs/pom.xml
index 4160c62b0c..b1ebbf1d57 100644
--- a/java-es-cqrs/pom.xml
+++ b/java-es-cqrs/pom.xml
@@ -3,7 +3,7 @@
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>com.sapient.learning</groupId>
-	<artifactId>java-events</artifactId>
+	<artifactId>java-es-cqrs</artifactId>
 	<version>0.0.1-SNAPSHOT</version>
 	<name>java-es-cqrs</name>
 	<properties>
@@ -16,5 +16,12 @@
 			<artifactId>lombok</artifactId>
 			<version>1.18.12</version>
 		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.13</version>
+			<scope>test</scope>
+		</dependency>
+
 	</dependencies>
 </project>
\ No newline at end of file
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
index 25c10094c1..0344c352d9 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
@@ -3,6 +3,7 @@ package com.baeldung.patterns.cqrs.projectors;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import com.baeldung.patterns.cqrs.repository.UserReadRepository;
@@ -21,36 +22,28 @@ public class UserProjector {
     }
 
     public void project(User user) {
-        UserContact userContact = readRepository.getUserContact(user.getUserid());
-        if (userContact == null)
-            userContact = new UserContact();
-        userContact.setContacts(user.getContacts());
+        UserContact userContact = Optional.ofNullable(readRepository.getUserContact(user.getUserid()))
+            .orElse(new UserContact());
         Map<String, Set<Contact>> contactByType = new HashMap<>();
         for (Contact contact : user.getContacts()) {
-            Set<Contact> contacts = contactByType.get(contact.getType());
-            if (contacts == null)
-                contacts = new HashSet<>();
+            Set<Contact> contacts = Optional.ofNullable(contactByType.get(contact.getType()))
+                .orElse(new HashSet<>());
             contacts.add(contact);
             contactByType.put(contact.getType(), contacts);
         }
         userContact.setContactByType(contactByType);
         readRepository.addUserContact(user.getUserid(), userContact);
 
-        UserAddress userAddress = readRepository.getUserAddress(user.getUserid());
-        if (userAddress == null)
-            userAddress = new UserAddress();
-        userAddress.setAddresses(user.getAddresses());
+        UserAddress userAddress = Optional.ofNullable(readRepository.getUserAddress(user.getUserid()))
+            .orElse(new UserAddress());
         Map<String, Set<Address>> addressByRegion = new HashMap<>();
         for (Address address : user.getAddresses()) {
-            Set<Address> addresses = addressByRegion.get(address.getState());
-            if (addresses == null)
-                addresses = new HashSet<>();
+            Set<Address> addresses = Optional.ofNullable(addressByRegion.get(address.getState()))
+                .orElse(new HashSet<>());
             addresses.add(address);
             addressByRegion.put(address.getState(), addresses);
         }
         userAddress.setAddressByRegion(addressByRegion);
         readRepository.addUserAddress(user.getUserid(), userAddress);
-
     }
-
 }
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java
deleted file mode 100644
index 1f20e0be38..0000000000
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.baeldung.patterns.crud;
-
-import java.util.UUID;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import com.baeldung.patterns.crud.repository.UserRepository;
-import com.baeldung.patterns.crud.service.UserService;
-import com.baeldung.patterns.domain.Address;
-import com.baeldung.patterns.domain.Contact;
-
-public class Main {
-
-    public static void main(String[] args) throws Exception {
-
-        UserRepository repository = new UserRepository();
-        UserService service = new UserService(repository);
-        String userId = UUID.randomUUID()
-            .toString();
-
-        service.createUser(userId, "Tom", "Sawyer");
-        service.updateUser(userId, 
-            Stream.of(
-              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
-              new Contact("EMAIL", "tom.sawyer@rediff.com"), 
-              new Contact("PHONE", "700-000-0001"))
-            .collect(Collectors.toSet()),
-            Stream.of(
-              new Address("New York", "NY", "10001"), 
-              new Address("Los Angeles", "CA", "90001"), 
-              new Address("Housten", "TX", "77001"))
-            .collect(Collectors.toSet()));
-        service.updateUser(userId, 
-            Stream.of(
-              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
-              new Contact("PHONE", "700-000-0001"))
-            .collect(Collectors.toSet()),
-            Stream.of(
-              new Address("New York", "NY", "10001"), 
-              new Address("Housten", "TX", "77001"))
-            .collect(Collectors.toSet()));
-
-        System.out.println(service.getContactByType(userId, "EMAIL"));
-        System.out.println(service.getAddressByRegion(userId, "NY"));
-
-    }
-
-}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
index 33f9bdf28f..8105a53265 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
@@ -1,7 +1,6 @@
 package com.baeldung.patterns.domain;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -10,7 +9,6 @@ import lombok.Data;
 @Data
 public class UserAddress {
 
-    private Set<Address> addresses = new HashSet<>();
     private Map<String, Set<Address>> addressByRegion = new HashMap<>();
 
 }
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
index 4f2ba812a4..1768dadc39 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
@@ -1,7 +1,6 @@
 package com.baeldung.patterns.domain;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -10,7 +9,6 @@ import lombok.Data;
 @Data
 public class UserContact {
 
-    private Set<Contact> contacts = new HashSet<>();
     private Map<String, Set<Contact>> contactByType = new HashMap<>();
 
 }
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java
deleted file mode 100644
index 77649088e9..0000000000
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.baeldung.patterns.es;
-
-import java.util.UUID;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import com.baeldung.patterns.domain.Address;
-import com.baeldung.patterns.domain.Contact;
-import com.baeldung.patterns.es.repository.EventStore;
-import com.baeldung.patterns.es.service.UserService;
-
-public class Main {
-
-    public static void main(String[] args) throws Exception {
-
-        EventStore repository = new EventStore();
-        UserService service = new UserService(repository);
-        String userId = UUID.randomUUID()
-            .toString();
-
-        service.createUser(userId, "Tom", "Sawyer");
-        service.updateUser(userId, 
-            Stream.of(
-              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
-              new Contact("EMAIL", "tom.sawyer@rediff.com"), 
-              new Contact("PHONE", "700-000-0001"))
-            .collect(Collectors.toSet()),
-            Stream.of(
-              new Address("New York", "NY", "10001"), 
-              new Address("Los Angeles", "CA", "90001"), 
-              new Address("Housten", "TX", "77001"))
-            .collect(Collectors.toSet()));
-        service.updateUser(userId, 
-            Stream.of(
-              new Contact("EMAIL", "tom.sawyer@gmail.com"), 
-              new Contact("PHONE", "700-000-0001"))
-            .collect(Collectors.toSet()),
-            Stream.of(
-              new Address("New York", "NY", "10001"), 
-              new Address("Housten", "TX", "77001"))
-            .collect(Collectors.toSet()));
-
-        System.out.println(service.getContactByType(userId, "EMAIL"));
-        System.out.println(service.getAddressByRegion(userId, "NY"));
-
-    }
-
-}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java
deleted file mode 100644
index b609cb1daf..0000000000
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.patterns.es.events;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@AllArgsConstructor
-@EqualsAndHashCode(callSuper = false)
-public class UserRemovedEvent extends Event {
-
-}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
index 0233453d68..9650c4294f 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
@@ -1,6 +1,5 @@
 package com.baeldung.patterns.es.service;
 
-import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -23,8 +22,7 @@ public class UserService {
     }
 
     public void createUser(String userId, String firstName, String lastName) {
-        UserCreatedEvent event = new UserCreatedEvent(userId, firstName, lastName);
-        repository.addEvent(userId, event);
+        repository.addEvent(userId, new UserCreatedEvent(userId, firstName, lastName));
     }
 
     public void updateUser(String userId, Set<Contact> contacts, Set<Address> addresses) throws Exception {
@@ -32,49 +30,30 @@ public class UserService {
         if (user == null)
             throw new Exception("User does not exist.");
 
-        List<Contact> contactsToRemove = user.getContacts()
+        user.getContacts()
             .stream()
             .filter(c -> !contacts.contains(c))
-            .collect(Collectors.toList());
-        for (Contact contact : contactsToRemove) {
-            UserContactRemovedEvent contactRemovedEvent = new UserContactRemovedEvent(contact.getType(), contact.getDetail());
-            repository.addEvent(userId, contactRemovedEvent);
-        }
-
-        List<Contact> contactsToAdd = contacts.stream()
+            .forEach(c -> repository.addEvent(userId, new UserContactRemovedEvent(c.getType(), c.getDetail())));
+        contacts.stream()
             .filter(c -> !user.getContacts()
                 .contains(c))
-            .collect(Collectors.toList());
-        for (Contact contact : contactsToAdd) {
-            UserContactAddedEvent contactAddedEvent = new UserContactAddedEvent(contact.getType(), contact.getDetail());
-            repository.addEvent(userId, contactAddedEvent);
-        }
-
-        List<Address> addressesToRemove = user.getAddresses()
+            .forEach(c -> repository.addEvent(userId, new UserContactAddedEvent(c.getType(), c.getDetail())));
+        user.getAddresses()
             .stream()
             .filter(a -> !addresses.contains(a))
-            .collect(Collectors.toList());
-        for (Address address : addressesToRemove) {
-            UserAddressRemovedEvent addressRemovedEvent = new UserAddressRemovedEvent(address.getCity(), address.getState(), address.getPostcode());
-            repository.addEvent(userId, addressRemovedEvent);
-        }
-
-        List<Address> addressesToAdd = addresses.stream()
+            .forEach(a -> repository.addEvent(userId, new UserAddressRemovedEvent(a.getCity(), a.getState(), a.getPostcode())));
+        addresses.stream()
             .filter(a -> !user.getAddresses()
                 .contains(a))
-            .collect(Collectors.toList());
-        for (Address address : addressesToAdd) {
-            UserAddressAddedEvent addressAddedEvent = new UserAddressAddedEvent(address.getCity(), address.getState(), address.getPostcode());
-            repository.addEvent(userId, addressAddedEvent);
-        }
+            .forEach(a -> repository.addEvent(userId, new UserAddressAddedEvent(a.getCity(), a.getState(), a.getPostcode())));
     }
 
     public Set<Contact> getContactByType(String userId, String contactType) throws Exception {
         User user = UserUtility.recreateUserState(repository, userId);
         if (user == null)
             throw new Exception("User does not exist.");
-        Set<Contact> contacts = user.getContacts();
-        return contacts.stream()
+        return user.getContacts()
+            .stream()
             .filter(c -> c.getType()
                 .equals(contactType))
             .collect(Collectors.toSet());
@@ -84,11 +63,10 @@ public class UserService {
         User user = UserUtility.recreateUserState(repository, userId);
         if (user == null)
             throw new Exception("User does not exist.");
-        Set<Address> addresses = user.getAddresses();
-        return addresses.stream()
+        return user.getAddresses()
+            .stream()
             .filter(a -> a.getState()
                 .equals(state))
             .collect(Collectors.toSet());
     }
-
 }
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
index b7ed9208b2..e44e404588 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
@@ -12,7 +12,6 @@ import com.baeldung.patterns.es.events.UserAddressRemovedEvent;
 import com.baeldung.patterns.es.events.UserContactAddedEvent;
 import com.baeldung.patterns.es.events.UserContactRemovedEvent;
 import com.baeldung.patterns.es.events.UserCreatedEvent;
-import com.baeldung.patterns.es.events.UserRemovedEvent;
 import com.baeldung.patterns.es.repository.EventStore;
 
 public class UserUtility {
@@ -27,9 +26,6 @@ public class UserUtility {
                 user = new User(UUID.randomUUID()
                     .toString(), e.getFirstName(), e.getLastName());
             }
-            if (event instanceof UserRemovedEvent) {
-                user = null;
-            }
             if (event instanceof UserAddressAddedEvent) {
                 UserAddressAddedEvent e = (UserAddressAddedEvent) event;
                 Address address = new Address(e.getCity(), e.getState(), e.getPostCode());
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
index 036b6e8396..d388abe7cb 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
+++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
@@ -2,6 +2,7 @@ package com.baeldung.patterns.escqrs.projectors;
 
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 import com.baeldung.patterns.cqrs.repository.UserReadRepository;
@@ -14,8 +15,6 @@ import com.baeldung.patterns.es.events.UserAddressAddedEvent;
 import com.baeldung.patterns.es.events.UserAddressRemovedEvent;
 import com.baeldung.patterns.es.events.UserContactAddedEvent;
 import com.baeldung.patterns.es.events.UserContactRemovedEvent;
-import com.baeldung.patterns.es.events.UserCreatedEvent;
-import com.baeldung.patterns.es.events.UserRemovedEvent;
 
 public class UserProjector {
 
@@ -28,10 +27,6 @@ public class UserProjector {
     public void project(String userId, List<Event> events) {
 
         for (Event event : events) {
-            if (event instanceof UserCreatedEvent)
-                apply(userId, (UserCreatedEvent) event);
-            if (event instanceof UserRemovedEvent)
-                apply(userId, (UserRemovedEvent) event);
             if (event instanceof UserAddressAddedEvent)
                 apply(userId, (UserAddressAddedEvent) event);
             if (event instanceof UserAddressRemovedEvent)
@@ -44,25 +39,13 @@ public class UserProjector {
 
     }
 
-    public void apply(String userId, UserCreatedEvent event) {
-
-    }
-
-    public void apply(String userId, UserRemovedEvent event) {
-
-    }
-
     public void apply(String userId, UserAddressAddedEvent event) {
         Address address = new Address(event.getCity(), event.getState(), event.getPostCode());
-        UserAddress userAddress = readRepository.getUserAddress(userId);
-        if (userAddress == null)
-            userAddress = new UserAddress();
-        userAddress.getAddresses()
-            .add(address);
-        Set<Address> addresses = userAddress.getAddressByRegion()
-            .get(address.getState());
-        if (addresses == null)
-            addresses = new HashSet<>();
+        UserAddress userAddress = Optional.ofNullable(readRepository.getUserAddress(userId))
+            .orElse(new UserAddress());
+        Set<Address> addresses = Optional.ofNullable(userAddress.getAddressByRegion()
+            .get(address.getState()))
+            .orElse(new HashSet<>());
         addresses.add(address);
         userAddress.getAddressByRegion()
             .put(address.getState(), addresses);
@@ -73,30 +56,21 @@ public class UserProjector {
         Address address = new Address(event.getCity(), event.getState(), event.getPostCode());
         UserAddress userAddress = readRepository.getUserAddress(userId);
         if (userAddress != null) {
-            userAddress.getAddresses()
-                .remove(address);
             Set<Address> addresses = userAddress.getAddressByRegion()
                 .get(address.getState());
-            if (addresses != null) {
+            if (addresses != null)
                 addresses.remove(address);
-                userAddress.getAddressByRegion()
-                    .put(address.getState(), addresses);
-            }
             readRepository.addUserAddress(userId, userAddress);
         }
     }
 
     public void apply(String userId, UserContactAddedEvent event) {
         Contact contact = new Contact(event.getContactType(), event.getContactDetails());
-        UserContact userContact = readRepository.getUserContact(userId);
-        if (userContact == null)
-            userContact = new UserContact();
-        userContact.getContacts()
-            .add(contact);
-        Set<Contact> contacts = userContact.getContactByType()
-            .get(contact.getType());
-        if (contacts == null)
-            contacts = new HashSet<>();
+        UserContact userContact = Optional.ofNullable(readRepository.getUserContact(userId))
+            .orElse(new UserContact());
+        Set<Contact> contacts = Optional.ofNullable(userContact.getContactByType()
+            .get(contact.getType()))
+            .orElse(new HashSet<>());
         contacts.add(contact);
         userContact.getContactByType()
             .put(contact.getType(), contacts);
@@ -107,17 +81,11 @@ public class UserProjector {
         Contact contact = new Contact(event.getContactType(), event.getContactDetails());
         UserContact userContact = readRepository.getUserContact(userId);
         if (userContact != null) {
-            userContact.getContacts()
-                .remove(contact);
             Set<Contact> contacts = userContact.getContactByType()
                 .get(contact.getType());
-            if (contacts != null) {
+            if (contacts != null)
                 contacts.remove(contact);
-                userContact.getContactByType()
-                    .put(contact.getType(), contacts);
-            }
             readRepository.addUserContact(userId, userContact);
         }
     }
-
 }
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
similarity index 66%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java
rename to java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
index 4e9c872cf1..4a324e72f6 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java
+++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
@@ -1,9 +1,14 @@
 package com.baeldung.patterns.cqrs;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.junit.Before;
+import org.junit.Test;
+
 import com.baeldung.patterns.cqrs.aggregates.UserAggregate;
 import com.baeldung.patterns.cqrs.commands.CreateUserCommand;
 import com.baeldung.patterns.cqrs.commands.UpdateUserCommand;
@@ -17,15 +22,25 @@ import com.baeldung.patterns.domain.Address;
 import com.baeldung.patterns.domain.Contact;
 import com.baeldung.patterns.domain.User;
 
-public class Main {
+public class ApplicationUnitTest {
 
-    public static void main(String[] args) throws Exception {
-        UserWriteRepository writeRepository = new UserWriteRepository();
-        UserReadRepository readRepository = new UserReadRepository();
-        UserProjector projector = new UserProjector(readRepository);
-        UserAggregate userAggregate = new UserAggregate(writeRepository);
-        UserProjection userProjection = new UserProjection(readRepository);
+    private UserWriteRepository writeRepository;
+    private UserReadRepository readRepository;
+    private UserProjector projector;
+    private UserAggregate userAggregate;
+    private UserProjection userProjection;
 
+    @Before
+    public void setUp() {
+        writeRepository = new UserWriteRepository();
+        readRepository = new UserReadRepository();
+        projector = new UserProjector(readRepository);
+        userAggregate = new UserAggregate(writeRepository);
+        userProjection = new UserProjection(readRepository);
+    }
+
+    @Test
+    public void testApplication() throws Exception {
         String userId = UUID.randomUUID()
             .toString();
         User user = null;
@@ -47,11 +62,13 @@ public class Main {
         user = userAggregate.handleUpdateUserCommand(updateUserCommand);
         projector.project(user);
 
-        AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(user.getUserid(), "NY");
-        System.out.println(userProjection.handle(addressByRegionQuery));
+        ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(userId, "EMAIL");
+        assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"))
+            .collect(Collectors.toSet()), userProjection.handle(contactByTypeQuery));
+        AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY");
+        assertEquals(Stream.of(new Address("New York", "NY", "10001"))
+            .collect(Collectors.toSet()), userProjection.handle(addressByRegionQuery));
 
-        ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(user.getUserid(), "EMAIL");
-        System.out.println(userProjection.handle(contactByTypeQuery));
     }
 
 }
diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
new file mode 100644
index 0000000000..28c113bf46
--- /dev/null
+++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.patterns.crud;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.patterns.crud.repository.UserRepository;
+import com.baeldung.patterns.crud.service.UserService;
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+
+public class ApplicationUnitTest {
+
+    private UserRepository repository;
+
+    @Before
+    public void setUp() {
+        repository = new UserRepository();
+    }
+
+    @Test
+    public void testApplication() throws Exception {
+        UserService service = new UserService(repository);
+        String userId = UUID.randomUUID()
+            .toString();
+
+        service.createUser(userId, "Tom", "Sawyer");
+        service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com"), new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001"), new Address("Housten", "TX", "77001"))
+                .collect(Collectors.toSet()));
+        service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001"))
+                .collect(Collectors.toSet()));
+
+        assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"))
+            .collect(Collectors.toSet()), service.getContactByType(userId, "EMAIL"));
+        assertEquals(Stream.of(new Address("New York", "NY", "10001"))
+            .collect(Collectors.toSet()), service.getAddressByRegion(userId, "NY"));
+    }
+
+}
diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
new file mode 100644
index 0000000000..52bdde449f
--- /dev/null
+++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.patterns.es;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.patterns.domain.Address;
+import com.baeldung.patterns.domain.Contact;
+import com.baeldung.patterns.es.repository.EventStore;
+import com.baeldung.patterns.es.service.UserService;
+
+public class ApplicationUnitTest {
+
+    private EventStore repository;
+    private UserService service;
+
+    @Before
+    public void setUp() {
+        repository = new EventStore();
+        service = new UserService(repository);
+    }
+
+    @Test
+    public void testApplication() throws Exception {
+        String userId = UUID.randomUUID()
+            .toString();
+
+        service.createUser(userId, "Tom", "Sawyer");
+        service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com"), new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001"), new Address("Housten", "TX", "77001"))
+                .collect(Collectors.toSet()));
+        service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001"))
+            .collect(Collectors.toSet()),
+            Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001"))
+                .collect(Collectors.toSet()));
+
+        assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"))
+            .collect(Collectors.toSet()), service.getContactByType(userId, "EMAIL"));
+        assertEquals(Stream.of(new Address("New York", "NY", "10001"))
+            .collect(Collectors.toSet()), service.getAddressByRegion(userId, "NY"));
+
+    }
+
+}
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
similarity index 69%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java
rename to java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
index 44395a75a7..22cb5235d1 100644
--- a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java
+++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
@@ -1,10 +1,15 @@
 package com.baeldung.patterns.escqrs;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.junit.Before;
+import org.junit.Test;
+
 import com.baeldung.patterns.cqrs.commands.CreateUserCommand;
 import com.baeldung.patterns.cqrs.commands.UpdateUserCommand;
 import com.baeldung.patterns.cqrs.projections.UserProjection;
@@ -18,16 +23,25 @@ import com.baeldung.patterns.es.repository.EventStore;
 import com.baeldung.patterns.escqrs.aggregates.UserAggregate;
 import com.baeldung.patterns.escqrs.projectors.UserProjector;
 
-public class Main {
+public class ApplicationUnitTest {
 
-    public static void main(String[] args) throws Exception {
+    private EventStore writeRepository;
+    private UserReadRepository readRepository;
+    private UserProjector projector;
+    private UserAggregate userAggregate;
+    private UserProjection userProjection;
 
-        EventStore writeRepository = new EventStore();
-        UserReadRepository readRepository = new UserReadRepository();
-        UserProjector projector = new UserProjector(readRepository);
-        UserAggregate userAggregate = new UserAggregate(writeRepository);
-        UserProjection userProjection = new UserProjection(readRepository);
+    @Before
+    public void setUp() {
+        writeRepository = new EventStore();
+        readRepository = new UserReadRepository();
+        projector = new UserProjector(readRepository);
+        userAggregate = new UserAggregate(writeRepository);
+        userProjection = new UserProjection(readRepository);
+    }
 
+    @Test
+    public void testApplication() throws Exception {
         String userId = UUID.randomUUID()
             .toString();
         List<Event> events = null;
@@ -50,11 +64,12 @@ public class Main {
         events = userAggregate.handleUpdateUserCommand(updateUserCommand);
         projector.project(userId, events);
 
-        AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY");
-        System.out.println(userProjection.handle(addressByRegionQuery));
-
         ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(userId, "EMAIL");
-        System.out.println(userProjection.handle(contactByTypeQuery));
+        assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"))
+            .collect(Collectors.toSet()), userProjection.handle(contactByTypeQuery));
+        AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY");
+        assertEquals(Stream.of(new Address("New York", "NY", "10001"))
+            .collect(Collectors.toSet()), userProjection.handle(addressByRegionQuery));
 
     }
 

From 86da74f733b9f74eac83cff3012ea9241c660f89 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Wed, 6 May 2020 22:35:28 +0530
Subject: [PATCH 232/404] JAVA-955: Migrate stripe to parent-boot-2

---
 stripe/pom.xml                                |  4 ++--
 .../com/baeldung/stripe/ChargeRequest.java    | 23 +++++++++++++++++++
 .../src/main/resources/application.properties |  2 ++
 stripe/src/main/resources/static/index.html   |  2 +-
 4 files changed, 28 insertions(+), 3 deletions(-)
 create mode 100644 stripe/src/main/resources/application.properties

diff --git a/stripe/pom.xml b/stripe/pom.xml
index 07d2968f5f..29a07b4163 100644
--- a/stripe/pom.xml
+++ b/stripe/pom.xml
@@ -11,9 +11,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
diff --git a/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java b/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java
index a5c056b659..190911afb3 100644
--- a/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java
+++ b/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java
@@ -13,4 +13,27 @@ public class ChargeRequest {
     private Currency currency;
     private String stripeEmail;
     private String stripeToken;
+    public String getDescription() {
+        return description;
+    }
+    public int getAmount() {
+        return amount;
+    }
+    public Currency getCurrency() {
+        return currency;
+    }
+    public String getStripeEmail() {
+        return stripeEmail;
+    }
+    public String getStripeToken() {
+        return stripeToken;
+    }
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    public void setCurrency(Currency currency) {
+        this.currency = currency;
+    }
+    
+    
 }
diff --git a/stripe/src/main/resources/application.properties b/stripe/src/main/resources/application.properties
new file mode 100644
index 0000000000..f36df33897
--- /dev/null
+++ b/stripe/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+STRIPE_SECRET_KEY=
+STRIPE_PUBLIC_KEY=
\ No newline at end of file
diff --git a/stripe/src/main/resources/static/index.html b/stripe/src/main/resources/static/index.html
index 090a01e91d..d7ba2bef91 100644
--- a/stripe/src/main/resources/static/index.html
+++ b/stripe/src/main/resources/static/index.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html>
     <head>
-        <meta http-equiv="refresh" content="0; url=/checkout.html" />
+        <meta http-equiv="refresh" content="0; url=/checkout" />
     </head>
     <body></body>
 </html>

From 1497cbd69b143064b6ea9e2d9909c367b9a614c1 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Wed, 6 May 2020 22:43:04 +0530
Subject: [PATCH 233/404] JAVA-955: removed lombok version

---
 stripe/pom.xml | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/stripe/pom.xml b/stripe/pom.xml
index 29a07b4163..48505c9e4e 100644
--- a/stripe/pom.xml
+++ b/stripe/pom.xml
@@ -28,9 +28,6 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
-            <!-- version is explicit here because the one provided with the current spring-boot-starter-parent has a bug in NetBeans; can be removed if spring-boot-starter-parent is 
-                upgraded -->
         </dependency>
         <dependency>
             <groupId>com.stripe</groupId>

From 847d6ab0424833d0896e796c8a2fe91825f0c95b Mon Sep 17 00:00:00 2001
From: Yavuz Tas <12643010+yavuztas@users.noreply.github.com>
Date: Thu, 7 May 2020 04:22:23 +0200
Subject: [PATCH 234/404] Changes for BAEL-2621 (#9217)

* update dependency versions to latest

* merge repository packages

* remove obselete xml configuration

* fix formatting

* clean up

* update package name

* revert spring data jpa xml config and demonstrate how to import in PersistenceConfig by a commented @ImportResource annotation

* rename jpa repositories xml to make it more clear

* remove obselete @EnableJpaRepositories configs since we don't use spring data's jpa repositories for these congigurations
---
 .../spring-persistence-simple/pom.xml         |  4 +--
 .../baeldung/config/PersistenceConfig.java    |  4 +--
 .../baeldung/config/PersistenceJPAConfig.java |  2 --
 .../persistence/config/PersistenceConfig.java | 17 ++++++-------
 .../spring/data/persistence/model/User.java   | 25 ++++++++++++-------
 .../{dao => repository}/IFooDao.java          |  4 ++-
 .../UserRepository.java                       | 22 ++++++++--------
 .../UserRepositoryCustom.java                 |  8 +++---
 .../UserRepositoryCustomImpl.java             | 17 +++++--------
 .../persistence/service/impl/FooService.java  |  2 +-
 ...ml => springDataJpaRepositoriesConfig.xml} |  7 +++---
 .../UserRepositoryCommon.java                 |  2 +-
 .../UserRepositoryIntegrationTest.java        | 13 ++++------
 13 files changed, 62 insertions(+), 65 deletions(-)
 rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{dao => repository}/IFooDao.java (87%)
 rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{jpaquery => repository}/UserRepository.java (96%)
 rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{jpaquery => repository}/UserRepositoryCustom.java (85%)
 rename persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/{jpaquery => repository}/UserRepositoryCustomImpl.java (85%)
 rename persistence-modules/spring-persistence-simple/src/main/resources/{springDataPersistenceConfig.xml => springDataJpaRepositoriesConfig.xml} (58%)
 rename persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/{jpaquery => repository}/UserRepositoryCommon.java (99%)
 rename persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/{jpaquery => repository}/UserRepositoryIntegrationTest.java (94%)

diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml
index 878c4592f9..7318ec55bd 100644
--- a/persistence-modules/spring-persistence-simple/pom.xml
+++ b/persistence-modules/spring-persistence-simple/pom.xml
@@ -132,13 +132,13 @@
 
     <properties>
         <!-- Spring -->
-        <org.springframework.version>5.2.5.RELEASE</org.springframework.version>
+        <org.springframework.version>5.2.6.RELEASE</org.springframework.version>
 
         <!-- persistence -->
         <hibernate.version>5.4.13.Final</hibernate.version>
         <mysql-connector-java.version>8.0.19</mysql-connector-java.version>
         <h2.version>1.4.200</h2.version>
-        <spring-data-jpa.version>2.2.6.RELEASE</spring-data-jpa.version>
+        <spring-data-jpa.version>2.2.7.RELEASE</spring-data-jpa.version>
         <tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
         <jta.version>1.1</jta.version>
         <querydsl.version>4.2.1</querydsl.version>
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java
index 80f3ff14c5..cdddbaa787 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java
@@ -11,7 +11,6 @@ import org.springframework.context.annotation.PropertySource;
 import org.springframework.core.env.Environment;
 import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
 import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 import org.springframework.orm.hibernate5.HibernateTransactionManager;
 import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
 import org.springframework.orm.jpa.JpaTransactionManager;
@@ -26,7 +25,6 @@ import java.util.Properties;
 
 @Configuration
 @EnableTransactionManagement
-@EnableJpaRepositories(basePackages = { "com.baeldung.hibernate.dao" }, transactionManagerRef = "jpaTransactionManager")
 @EnableJpaAuditing
 @PropertySource({ "classpath:persistence-mysql.properties" })
 @ComponentScan(basePackages = { "com.baeldung.persistence.dao", "com.baeldung.jpa.dao" })
@@ -97,7 +95,7 @@ public class PersistenceConfig {
         return new FooService();
     }
 
-    private final Properties hibernateProperties() {
+    private Properties hibernateProperties() {
         final Properties hibernateProperties = new Properties();
         hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
         hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
index 06cae493c9..e8a2aefd6b 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
@@ -8,7 +8,6 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.PropertySource;
 import org.springframework.core.env.Environment;
 import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 import org.springframework.jdbc.datasource.DriverManagerDataSource;
 import org.springframework.orm.jpa.JpaTransactionManager;
 import org.springframework.orm.jpa.JpaVendorAdapter;
@@ -24,7 +23,6 @@ import java.util.Properties;
 @EnableTransactionManagement
 @PropertySource({ "classpath:persistence-h2.properties" })
 @ComponentScan({ "com.baeldung.persistence","com.baeldung.jpa.dao" })
-@EnableJpaRepositories(basePackages = "com.baeldung.jpa.dao")
 public class PersistenceJPAConfig {
 
     @Autowired
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java
index 66b540a692..604923d615 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java
@@ -1,9 +1,6 @@
 package com.baeldung.spring.data.persistence.config;
 
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
+import com.google.common.base.Preconditions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
@@ -19,14 +16,15 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
-import com.google.common.base.Preconditions;
+import javax.sql.DataSource;
+import java.util.Properties;
 
 @Configuration
 @EnableTransactionManagement
 @PropertySource({ "classpath:persistence-${envTarget:h2}.properties" })
 @ComponentScan({ "com.baeldung.spring.data.persistence" })
-// @ImportResource("classpath*:springDataPersistenceConfig.xml")
-@EnableJpaRepositories(basePackages = { "com.baeldung.spring.data.persistence.dao", "com.baeldung.spring.data.persistence.jpaquery" })
+//@ImportResource("classpath*:*springDataJpaRepositoriesConfig.xml")
+@EnableJpaRepositories("com.baeldung.spring.data.persistence.repository")
 public class PersistenceConfig {
 
     @Autowired
@@ -40,10 +38,9 @@ public class PersistenceConfig {
     public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
         final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
         em.setDataSource(dataSource());
-        em.setPackagesToScan(new String[] { "com.baeldung.spring.data.persistence.model" });
+        em.setPackagesToScan("com.baeldung.spring.data.persistence.model");
 
         final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
-        // vendorAdapter.set
         em.setJpaVendorAdapter(vendorAdapter);
         em.setJpaProperties(additionalProperties());
 
@@ -78,7 +75,7 @@ public class PersistenceConfig {
         final Properties hibernateProperties = new Properties();
         hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
         hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
-        // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true");
+
         return hibernateProperties;
     }
 
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java
index 09f1092644..1475eccbf0 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java
@@ -1,7 +1,6 @@
 package com.baeldung.spring.data.persistence.model;
 
 import javax.persistence.*;
-
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Objects;
@@ -13,14 +12,22 @@ public class User {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int id;
+
     private String name;
+
     private LocalDate creationDate;
+
     private LocalDate lastLoginDate;
+
     private boolean active;
+
     private int age;
+
     @Column(unique = true, nullable = false)
     private String email;
+
     private Integer status;
+
     @OneToMany
     List<Possession> possessionList;
 
@@ -28,7 +35,7 @@ public class User {
         super();
     }
 
-    public User(String name,  LocalDate creationDate,String email, Integer status) {
+    public User(String name, LocalDate creationDate, String email, Integer status) {
         this.name = name;
         this.creationDate = creationDate;
         this.email = email;
@@ -75,7 +82,7 @@ public class User {
     public void setAge(final int age) {
         this.age = age;
     }
-    
+
     public LocalDate getCreationDate() {
         return creationDate;
     }
@@ -94,18 +101,18 @@ public class User {
         builder.append("User [name=").append(name).append(", id=").append(id).append("]");
         return builder.toString();
     }
-    
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         User user = (User) o;
         return id == user.id &&
-          age == user.age &&
-          Objects.equals(name, user.name) &&
-          Objects.equals(creationDate, user.creationDate) &&
-          Objects.equals(email, user.email) &&
-          Objects.equals(status, user.status);
+                age == user.age &&
+                Objects.equals(name, user.name) &&
+                Objects.equals(creationDate, user.creationDate) &&
+                Objects.equals(email, user.email) &&
+                Objects.equals(status, user.status);
     }
 
     @Override
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/IFooDao.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDao.java
similarity index 87%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/IFooDao.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDao.java
index d2b746dc8b..0b750e37e1 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/IFooDao.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDao.java
@@ -1,11 +1,13 @@
-package com.baeldung.spring.data.persistence.dao;
+package com.baeldung.spring.data.persistence.repository;
 
 import com.baeldung.spring.data.persistence.model.Foo;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
+
 public interface IFooDao extends JpaRepository<Foo, Long> {
 
     @Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
     Foo retrieveByName(@Param("name") String name);
+
 }
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepository.java
similarity index 96%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepository.java
index f22970c401..a8e3a536c3 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepository.java
@@ -1,9 +1,4 @@
-package com.baeldung.spring.data.persistence.jpaquery;
-
-import java.time.LocalDate;
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Stream;
+package com.baeldung.spring.data.persistence.repository;
 
 import com.baeldung.spring.data.persistence.model.User;
 import org.springframework.data.domain.Page;
@@ -14,13 +9,18 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
 public interface UserRepository extends JpaRepository<User, Integer>, UserRepositoryCustom {
 
     Stream<User> findAllByName(String name);
 
     @Query("SELECT u FROM User u WHERE u.status = 1")
     Collection<User> findAllActiveUsers();
-    
+
     @Query("select u from User u where u.email like '%@gmail.com'")
     List<User> findUsersWithGmailAddress();
 
@@ -74,14 +74,14 @@ public interface UserRepository extends JpaRepository<User, Integer>, UserReposi
     @Query(value = "INSERT INTO Users (name, age, email, status, active) VALUES (:name, :age, :email, :status, :active)", nativeQuery = true)
     @Modifying
     void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("email") String email, @Param("status") Integer status, @Param("active") boolean active);
-    
+
     @Modifying
     @Query(value = "UPDATE Users u SET status = ? WHERE u.name = ?", nativeQuery = true)
     int updateUserSetStatusForNameNativePostgres(Integer status, String name);
-    
+
     @Query(value = "SELECT u FROM User u WHERE u.name IN :names")
-	  List<User> findUserByNameList(@Param("names") Collection<String> names);
-    
+    List<User> findUserByNameList(@Param("names") Collection<String> names);
+
     void deleteAllByCreationDateAfter(LocalDate date);
 
     @Modifying(clearAutomatically = true, flushAutomatically = true)
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustom.java
similarity index 85%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustom.java
index 8bfcb93158..77e661bbbe 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustom.java
@@ -1,14 +1,16 @@
-package com.baeldung.spring.data.persistence.jpaquery;
+package com.baeldung.spring.data.persistence.repository;
+
+import com.baeldung.spring.data.persistence.model.User;
 
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Predicate;
 
-import com.baeldung.spring.data.persistence.model.User;
-
 public interface UserRepositoryCustom {
+
     List<User> findUserByEmails(Set<String> emails);
     
     List<User> findAllUsersByPredicates(Collection<Predicate<User>> predicates);
+
 }
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustomImpl.java
similarity index 85%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustomImpl.java
index f264ca0b44..366b2c54d0 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustomImpl.java
@@ -1,5 +1,10 @@
-package com.baeldung.spring.data.persistence.jpaquery;
+package com.baeldung.spring.data.persistence.repository;
 
+import com.baeldung.spring.data.persistence.model.User;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.*;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -7,16 +12,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Path;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import com.baeldung.spring.data.persistence.model.User;
-
 public class UserRepositoryCustomImpl implements UserRepositoryCustom {
 
     @PersistenceContext
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java
index cd566ba9f6..c1406b8602 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java
@@ -2,7 +2,7 @@ package com.baeldung.spring.data.persistence.service.impl;
 
 
 import com.baeldung.spring.data.persistence.model.Foo;
-import com.baeldung.spring.data.persistence.dao.IFooDao;
+import com.baeldung.spring.data.persistence.repository.IFooDao;
 import com.baeldung.spring.data.persistence.service.IFooService;
 import com.baeldung.spring.data.persistence.service.common.AbstractService;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/persistence-modules/spring-persistence-simple/src/main/resources/springDataPersistenceConfig.xml b/persistence-modules/spring-persistence-simple/src/main/resources/springDataJpaRepositoriesConfig.xml
similarity index 58%
rename from persistence-modules/spring-persistence-simple/src/main/resources/springDataPersistenceConfig.xml
rename to persistence-modules/spring-persistence-simple/src/main/resources/springDataJpaRepositoriesConfig.xml
index 5ea2d9c05b..91778a17af 100644
--- a/persistence-modules/spring-persistence-simple/src/main/resources/springDataPersistenceConfig.xml
+++ b/persistence-modules/spring-persistence-simple/src/main/resources/springDataJpaRepositoriesConfig.xml
@@ -1,12 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
-    xsi:schemaLocation="
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+       xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/data/jpa 
     http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
 >
 
-    <jpa:repositories base-package="com.baeldung.persistence.dao"/>
+    <jpa:repositories base-package="com.baeldung.spring.data.persistence.repository"/>
 
 </beans>
\ No newline at end of file
diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCommon.java
similarity index 99%
rename from persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java
rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCommon.java
index 5874b3c643..13b5b4357d 100644
--- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java
+++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCommon.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.data.persistence.jpaquery;
+package com.baeldung.spring.data.persistence.repository;
 
 import com.baeldung.spring.data.persistence.config.PersistenceConfig;
 import com.baeldung.spring.data.persistence.model.User;
diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryIntegrationTest.java
similarity index 94%
rename from persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java
rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryIntegrationTest.java
index 3bffb51917..c76e345fdd 100644
--- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryIntegrationTest.java
@@ -1,8 +1,4 @@
-package com.baeldung.spring.data.persistence.jpaquery;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.time.LocalDate;
+package com.baeldung.spring.data.persistence.repository;
 
 import com.baeldung.spring.data.persistence.config.PersistenceConfig;
 import com.baeldung.spring.data.persistence.model.User;
@@ -14,9 +10,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.test.context.support.AnnotationConfigContextLoader;
 import org.springframework.transaction.annotation.Transactional;
 
-/**
- * Created by adam.
- */
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
 @DirtiesContext

From 0e33f2d06cd9f71bdfa810e1ecd6bf2c754b4cab Mon Sep 17 00:00:00 2001
From: Maciej Glowka <maciejglowka.pl@gmail.com>
Date: Thu, 7 May 2020 23:25:43 +0200
Subject: [PATCH 235/404] BAEL-3829: fixed test method names

---
 .../dynamic/autowire/DynamicAutowireIntegrationTest.java     | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
index 3eb6268e97..56582ecb66 100644
--- a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
+++ b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
@@ -20,10 +20,13 @@ public class DynamicAutowireIntegrationTest {
     private CustomMapFromListDynamicAutowireService customMapFromListDynamicAutowireService;
 
     @Test
-    public void testConstructWorkerByJava() {
+    public void givenDynamicallyAutowiredBean_whenCheckingServerInGB_thenServerIsNotActive() {
         assertThat(beanFactoryDynamicAutowireService.isServerActive("GB", 101), is(false));
         assertThat(customMapFromListDynamicAutowireService.isServerActive("GB", 101), is(false));
+    }
 
+    @Test
+    public void givenDynamicallyAutowiredBean_whenCheckingServerInUS_thenServerIsActive() {
         assertThat(beanFactoryDynamicAutowireService.isServerActive("US", 101), is(true));
         assertThat(customMapFromListDynamicAutowireService.isServerActive("US", 101), is(true));
     }

From d27bcf564fef607739481695e3a12f0d4ff5af78 Mon Sep 17 00:00:00 2001
From: Krzysztof Majewski <krzysztof.majewski.km1@contractors.roche.com>
Date: Fri, 8 May 2020 14:02:17 +0200
Subject: [PATCH 236/404] update test name

---
 .../selenium/junit/SeleniumJavaScriptClickTest.java        | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
index dafafd72ef..68c60a7d14 100644
--- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
+++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
@@ -12,6 +12,7 @@ import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class SeleniumJavaScriptClickTest {
 
@@ -31,7 +32,7 @@ public class SeleniumJavaScriptClickTest {
     }
 
     @Test
-    public void should_search_for_selenium_articles() {
+    public void whenSearchForSeleniumArticles_theReturnNotEmptyResults() {
         driver.get("https://baeldung.com");
         String title = driver.getTitle();
         assertEquals("Baeldung | Java, Spring and Web Development tutorials", title);
@@ -40,12 +41,16 @@ public class SeleniumJavaScriptClickTest {
         WebElement searchButton = driver.findElement(By.className("menu-search"));
         clickElement(searchButton);
 
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("search")));
         WebElement searchInput = driver.findElement(By.id("search"));
         searchInput.sendKeys("Selenium");
 
         wait.until(ExpectedConditions.elementToBeClickable(By.className("btn-search")));
         WebElement seeSearchResultsButton = driver.findElement(By.className("btn-search"));
         clickElement(seeSearchResultsButton);
+
+        int seleniumPostsCount = driver.findElements(By.className("post")).size();
+        assertTrue(seleniumPostsCount > 0);
     }
 
     private void clickElement(WebElement element) {

From 973cd2490677b11481ff9d741b4a2733a3f6a68f Mon Sep 17 00:00:00 2001
From: Krzysztof Majewski <krzysztof.majewski.km1@contractors.roche.com>
Date: Fri, 8 May 2020 14:07:07 +0200
Subject: [PATCH 237/404] update test name

---
 .../baeldung/selenium/junit/SeleniumJavaScriptClickTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
index 68c60a7d14..e738454ea7 100644
--- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
+++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
@@ -32,7 +32,7 @@ public class SeleniumJavaScriptClickTest {
     }
 
     @Test
-    public void whenSearchForSeleniumArticles_theReturnNotEmptyResults() {
+    public void whenSearchForSeleniumArticles_thenReturnNotEmptyResults() {
         driver.get("https://baeldung.com");
         String title = driver.getTitle();
         assertEquals("Baeldung | Java, Spring and Web Development tutorials", title);

From a93fc0541e9f463f394659fb9a1a05ec1f13e689 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Fri, 8 May 2020 19:06:20 +0530
Subject: [PATCH 238/404] JAVA-954: Migrate spring-social-login to
 parent-boot-2

---
 spring-social-login/pom.xml                   | 20 +++++++++---
 .../java/com/baeldung/config/Application.java |  2 +-
 .../com/baeldung/config/SecurityConfig.java   | 32 ++++++++++++++-----
 3 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/spring-social-login/pom.xml b/spring-social-login/pom.xml
index 9fa839f1c2..628f439cc0 100644
--- a/spring-social-login/pom.xml
+++ b/spring-social-login/pom.xml
@@ -8,9 +8,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
@@ -42,15 +42,16 @@
 
         <dependency>
             <groupId>org.thymeleaf.extras</groupId>
-            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
+            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
         </dependency>
 
 
         <dependency>
             <groupId>org.springframework.social</groupId>
             <artifactId>spring-social-facebook</artifactId>
+            <version>${spring.social.facebook.version}</version>
         </dependency>
-
+        
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
@@ -60,6 +61,12 @@
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
         </dependency>
+        
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy-dep</artifactId>
+            <version>${bytebuddy.version}</version>
+        </dependency>
 
         <!-- test -->
 
@@ -93,5 +100,10 @@
             </plugin>
         </plugins>
     </build>
+    
+    <properties>
+        <bytebuddy.version>1.10.9</bytebuddy.version>
+        <spring.social.facebook.version>2.0.3.RELEASE</spring.social.facebook.version>
+    </properties>
 
 </project>
\ No newline at end of file
diff --git a/spring-social-login/src/main/java/com/baeldung/config/Application.java b/spring-social-login/src/main/java/com/baeldung/config/Application.java
index 5d083d2d47..c65df6dbfe 100644
--- a/spring-social-login/src/main/java/com/baeldung/config/Application.java
+++ b/spring-social-login/src/main/java/com/baeldung/config/Application.java
@@ -3,7 +3,7 @@ package com.baeldung.config;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @SpringBootApplication
diff --git a/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java
index 3d3081fef9..152c7b229a 100644
--- a/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java
+++ b/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java
@@ -1,8 +1,7 @@
 package com.baeldung.config;
 
-import com.baeldung.security.FacebookSignInAdapter;
-import com.baeldung.security.FacebookConnectionSignup;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
@@ -14,22 +13,27 @@ import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.social.connect.ConnectionFactoryLocator;
 import org.springframework.social.connect.UsersConnectionRepository;
 import org.springframework.social.connect.mem.InMemoryUsersConnectionRepository;
+import org.springframework.social.connect.support.ConnectionFactoryRegistry;
 import org.springframework.social.connect.web.ProviderSignInController;
+import org.springframework.social.facebook.connect.FacebookConnectionFactory;
+
+import com.baeldung.security.FacebookConnectionSignup;
+import com.baeldung.security.FacebookSignInAdapter;
 
 @Configuration
 @EnableWebSecurity
 @ComponentScan(basePackages = { "com.baeldung.security" })
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
+    
+    @Value("${spring.social.facebook.appSecret}")
+    String appSecret;
+    
+    @Value("${spring.social.facebook.appId}")
+    String appId;
 
     @Autowired
     private UserDetailsService userDetailsService;
 
-    @Autowired
-    private ConnectionFactoryLocator connectionFactoryLocator;
-
-    @Autowired
-    private UsersConnectionRepository usersConnectionRepository;
-
     @Autowired
     private FacebookConnectionSignup facebookConnectionSignup;
 
@@ -55,7 +59,19 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Bean
     // @Primary
     public ProviderSignInController providerSignInController() {
+        ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator();
+        UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator);
         ((InMemoryUsersConnectionRepository) usersConnectionRepository).setConnectionSignUp(facebookConnectionSignup);
         return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter());
     }
+    
+    private ConnectionFactoryLocator connectionFactoryLocator() {
+        ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
+        registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret));
+        return registry;
+    }
+
+    private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
+        return new InMemoryUsersConnectionRepository(connectionFactoryLocator);
+    }
 }
\ No newline at end of file

From ef16cf1587a59c8c2df94d098ab73e1af3911521 Mon Sep 17 00:00:00 2001
From: Marius Catalin Munteanu <munmariuscatalin@gmail.com>
Date: Sat, 25 Apr 2020 12:23:24 +0300
Subject: [PATCH 239/404] BAEL-3016 Thymeleaf Formating Currencies

---
 .../currencies/CurrenciesController.java      | 22 ++++++
 .../templates/currencies/currencies.html      | 21 ++++++
 .../CurrenciesControllerIntegrationTest.java  | 68 +++++++++++++++++++
 3 files changed, 111 insertions(+)
 create mode 100644 spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/currencies/CurrenciesController.java
 create mode 100644 spring-thymeleaf-3/src/main/resources/templates/currencies/currencies.html
 create mode 100644 spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java

diff --git a/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/currencies/CurrenciesController.java b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/currencies/CurrenciesController.java
new file mode 100644
index 0000000000..206cf32683
--- /dev/null
+++ b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/currencies/CurrenciesController.java
@@ -0,0 +1,22 @@
+package com.baeldung.thymeleaf.currencies;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+public class CurrenciesController {
+
+    @GetMapping(value = "/currency")
+    public String exchange(
+      @RequestParam(value = "amount", required = false) String amount,
+      @RequestParam(value = "amountList", required = false) List amountList,
+      Locale locale) {
+
+        return "currencies/currencies";
+    }
+}
diff --git a/spring-thymeleaf-3/src/main/resources/templates/currencies/currencies.html b/spring-thymeleaf-3/src/main/resources/templates/currencies/currencies.html
new file mode 100644
index 0000000000..c2f44265dd
--- /dev/null
+++ b/spring-thymeleaf-3/src/main/resources/templates/currencies/currencies.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:th="http://www.thymeleaf.org">
+	<head>
+		<meta charset="UTF-8">
+		<title>Currency table</title>
+	</head>
+	<body>
+		<p>Currency format by Locale</p>
+		<p th:text="${#numbers.formatCurrency(param.amount)}"></p>
+
+		<p>Currency Arrays format by Locale</p>
+		<p th:text="${#numbers.listFormatCurrency(param.amountList)}"></p>
+
+		<p>Remove decimal values</p>
+		<p th:text="${#strings.replace(#numbers.formatCurrency(param.amount), '.00', '')}"></p>
+
+		<p>Replace decimal points</p>
+		<p th:text="${#numbers.formatDecimal(param.amount, 1, 2, 'COMMA')}"></p>
+	</body>
+</html>
\ No newline at end of file
diff --git a/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java
new file mode 100644
index 0000000000..02bf8a9ee0
--- /dev/null
+++ b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.thymeleaf.currencies;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc(printOnlyOnFailure = false)
+public class CurrenciesControllerIntegrationTest {
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Test
+    public void whenCallCurrencyWithSpanishLocale_ThenReturnProperCurrency() throws Exception {
+        mockMvc.perform(MockMvcRequestBuilders.get("/currency")
+          .header("Accept-Language", "es-ES")
+          .param("amount", "10032.5"))
+          .andExpect(status().isOk())
+          .andExpect(content().string(containsString("10.032,50 €")));
+    }
+
+    @Test
+    public void whenCallCurrencyWithUSALocale_ThenReturnProperCurrency() throws Exception {
+        mockMvc.perform(MockMvcRequestBuilders.get("/currency")
+          .header("Accept-Language", "en-US")
+          .param("amount", "10032.5"))
+          .andExpect(status().isOk())
+          .andExpect(content().string(containsString("$10,032.50")));
+    }
+
+    @Test
+    public void whenCallCurrencyWithRomanianLocaleWithArrays_ThenReturnLocaleCurrencies() throws Exception {
+        mockMvc.perform(MockMvcRequestBuilders.get("/currency")
+          .header("Accept-Language", "ro-RO")
+          .param("amountList", "10", "20", "30"))
+          .andExpect(status().isOk())
+          .andExpect(content().string(containsString("10,00 RON, 20,00 RON, 30,00 RON")));
+    }
+
+    @Test
+    public void whenCallCurrencyWithUSALocaleWithoutDecimal_ThenReturnCurrencyWithoutTrailingZeros() throws Exception {
+        mockMvc.perform(MockMvcRequestBuilders.get("/currency")
+          .header("Accept-Language", "en-US")
+          .param("amount", "10032"))
+          .andExpect(status().isOk())
+          .andExpect(content().string(containsString("$10,032")));
+    }
+
+    @Test
+    public void whenCallCurrencyWithUSALocale_ThenReturnReplacedDecimalPoint() throws Exception {
+        mockMvc.perform(MockMvcRequestBuilders.get("/currency")
+          .header("Accept-Language", "en-US")
+          .param("amount", "1.5"))
+          .andExpect(status().isOk())
+          .andExpect(content().string(containsString("1,5")));
+    }
+}

From 7e8d36d0840862273aca040356f5c04846b6b20d Mon Sep 17 00:00:00 2001
From: Cristian Rosu <cristi.rosu4@gmail.com>
Date: Fri, 8 May 2020 20:17:17 +0300
Subject: [PATCH 240/404] BAEL-3826: test Thymeleaf PDF generation using
 ByteArrayOutputStream

---
 .../baeldung/pdf/PDFThymeleafUnitTest.java    | 50 +++++++++++++++++++
 1 file changed, 50 insertions(+)
 create mode 100644 pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java

diff --git a/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java b/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java
new file mode 100644
index 0000000000..7d927072aa
--- /dev/null
+++ b/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.pdf;
+
+import com.lowagie.text.DocumentException;
+import org.junit.Test;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.templatemode.TemplateMode;
+import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
+import org.xhtmlrenderer.pdf.ITextRenderer;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import static org.junit.Assert.assertTrue;
+
+public class PDFThymeleafUnitTest {
+
+    @Test
+    public void givenThymeleafTemplate_whenParsedAndRenderedToPDF_thenItShouldNotBeEmpty() throws DocumentException, IOException {
+        String html = parseThymeleafTemplate();
+        ByteArrayOutputStream outputStream = generatePdfOutputStreamFromHtml(html);
+        assertTrue(outputStream.size() > 0);
+    }
+
+    private ByteArrayOutputStream generatePdfOutputStreamFromHtml(String html) throws IOException, DocumentException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        ITextRenderer renderer = new ITextRenderer();
+        renderer.setDocumentFromString(html);
+        renderer.layout();
+        renderer.createPDF(outputStream);
+
+        outputStream.close();
+        return outputStream;
+    }
+
+    private String parseThymeleafTemplate() {
+        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
+        templateResolver.setSuffix(".html");
+        templateResolver.setTemplateMode(TemplateMode.HTML);
+
+        TemplateEngine templateEngine = new TemplateEngine();
+        templateEngine.setTemplateResolver(templateResolver);
+
+        Context context = new Context();
+        context.setVariable("to", "Baeldung.com");
+
+        return templateEngine.process("thymeleaf_template", context);
+    }
+}

From f83c73a830814faee3411215dbaf5f82b8fcf278 Mon Sep 17 00:00:00 2001
From: Cristian Rosu <cristi.rosu4@gmail.com>
Date: Fri, 8 May 2020 20:18:22 +0300
Subject: [PATCH 241/404] BAEL-3826: appropriate spacing

---
 pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java b/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java
index 7d927072aa..e253dce06c 100644
--- a/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java
+++ b/pdf/src/test/java/com/baeldung/pdf/PDFThymeleafUnitTest.java
@@ -18,7 +18,9 @@ public class PDFThymeleafUnitTest {
     @Test
     public void givenThymeleafTemplate_whenParsedAndRenderedToPDF_thenItShouldNotBeEmpty() throws DocumentException, IOException {
         String html = parseThymeleafTemplate();
+
         ByteArrayOutputStream outputStream = generatePdfOutputStreamFromHtml(html);
+
         assertTrue(outputStream.size() > 0);
     }
 

From f1dde2936b3405c112cb011afdc8b34d69d7ebe1 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Fri, 8 May 2020 23:12:36 +0200
Subject: [PATCH 242/404] JAVA-618 Move code for 3 articles from
 core-java-exceptions to core-java-exceptions-2

---
 .../core-java-exceptions-2/README.md              |  3 +++
 core-java-modules/core-java-exceptions-2/pom.xml  |  6 ++++++
 .../globalexceptionhandler/Arithmetic.java        |  2 +-
 .../ArrayIndexOutOfBounds.java                    |  2 +-
 .../globalexceptionhandler/ClassCast.java         |  2 +-
 .../globalexceptionhandler/FileNotFound.java      |  2 +-
 .../GlobalExceptionHandler.java                   |  2 +-
 .../globalexceptionhandler/IllegalArgument.java   |  2 +-
 .../globalexceptionhandler/IllegalState.java      |  2 +-
 .../InterruptedExceptionExample.java              |  2 +-
 .../globalexceptionhandler/MalformedURL.java      |  2 +-
 .../globalexceptionhandler/NullPointer.java       |  2 +-
 .../globalexceptionhandler/NumberFormat.java      |  2 +-
 .../ParseExceptionExample.java                    |  2 +-
 .../StringIndexOutOfBounds.java                   |  2 +-
 .../rootcausefinder/RootCauseFinder.java          |  2 +-
 .../trywithresource/AutoCloseableMain.java        |  0
 .../AutoCloseableResourcesFirst.java              |  0
 .../AutoCloseableResourcesSecond.java             |  0
 .../com/baeldung/trywithresource/MyResource.java  |  0
 .../GlobalExceptionHandlerUnitTest.java           |  2 +-
 .../rootcausefinder/RootCauseFinderUnitTest.java  | 15 +++++++--------
 core-java-modules/core-java-exceptions/README.md  |  4 ----
 23 files changed, 31 insertions(+), 27 deletions(-)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/Arithmetic.java (87%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/ArrayIndexOutOfBounds.java (92%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/ClassCast.java (92%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/FileNotFound.java (91%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/GlobalExceptionHandler.java (92%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/IllegalArgument.java (87%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/IllegalState.java (92%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/InterruptedExceptionExample.java (91%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/MalformedURL.java (89%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/NullPointer.java (93%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/NumberFormat.java (90%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/ParseExceptionExample.java (90%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/globalexceptionhandler/StringIndexOutOfBounds.java (91%)
 rename core-java-modules/{core-java-exceptions/src/main/java/com/baeldung/exceptions => core-java-exceptions-2/src/main/java/com/baeldung}/rootcausefinder/RootCauseFinder.java (98%)
 rename core-java-modules/{core-java-exceptions => core-java-exceptions-2}/src/main/java/com/baeldung/trywithresource/AutoCloseableMain.java (100%)
 rename core-java-modules/{core-java-exceptions => core-java-exceptions-2}/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesFirst.java (100%)
 rename core-java-modules/{core-java-exceptions => core-java-exceptions-2}/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesSecond.java (100%)
 rename core-java-modules/{core-java-exceptions => core-java-exceptions-2}/src/main/java/com/baeldung/trywithresource/MyResource.java (100%)
 rename core-java-modules/{core-java-exceptions/src/test/java/com/baeldung/exceptions => core-java-exceptions-2/src/test/java/com/baeldung}/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java (97%)
 rename core-java-modules/{core-java-exceptions/src/test/java/com/baeldung/exceptions => core-java-exceptions-2/src/test/java/com/baeldung}/rootcausefinder/RootCauseFinderUnitTest.java (80%)

diff --git a/core-java-modules/core-java-exceptions-2/README.md b/core-java-modules/core-java-exceptions-2/README.md
index 1b8457acc4..46ffd490be 100644
--- a/core-java-modules/core-java-exceptions-2/README.md
+++ b/core-java-modules/core-java-exceptions-2/README.md
@@ -9,3 +9,6 @@ This module contains articles about core java exceptions
 - [java.net.UnknownHostException: Invalid Hostname for Server](https://www.baeldung.com/java-unknownhostexception)
 - [How to Handle Java SocketException](https://www.baeldung.com/java-socketexception)
 - [Java Suppressed Exceptions](https://www.baeldung.com/java-suppressed-exceptions)
+- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources)
+- [Java Global Exception Handler](https://www.baeldung.com/java-global-exception-handler)
+- [How to Find an Exception’s Root Cause in Java](https://www.baeldung.com/java-exception-root-cause)
diff --git a/core-java-modules/core-java-exceptions-2/pom.xml b/core-java-modules/core-java-exceptions-2/pom.xml
index cf8de3d5b6..915ec1da69 100644
--- a/core-java-modules/core-java-exceptions-2/pom.xml
+++ b/core-java-modules/core-java-exceptions-2/pom.xml
@@ -23,6 +23,11 @@
             <version>${assertj-core.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons.lang3.version}</version>
+        </dependency>
     </dependencies>
 
     <description> </description>
@@ -30,6 +35,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <commons.lang3.version>3.10</commons.lang3.version>
         <!-- testing -->
         <assertj-core.version>3.10.0</assertj-core.version>
     </properties>
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/Arithmetic.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/Arithmetic.java
similarity index 87%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/Arithmetic.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/Arithmetic.java
index db29198b39..57d022eb13 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/Arithmetic.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/Arithmetic.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ArrayIndexOutOfBounds.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ArrayIndexOutOfBounds.java
similarity index 92%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ArrayIndexOutOfBounds.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ArrayIndexOutOfBounds.java
index 54c95f224c..b7c8bb1875 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ArrayIndexOutOfBounds.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ArrayIndexOutOfBounds.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ClassCast.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ClassCast.java
similarity index 92%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ClassCast.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ClassCast.java
index 8f8a6cf9e6..1ef8399d3d 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ClassCast.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ClassCast.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/FileNotFound.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/FileNotFound.java
similarity index 91%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/FileNotFound.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/FileNotFound.java
index a9f2e5ee84..a94e294016 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/FileNotFound.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/FileNotFound.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandler.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/GlobalExceptionHandler.java
similarity index 92%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandler.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/GlobalExceptionHandler.java
index f2e89f44e3..4d3f7c1a98 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandler.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/GlobalExceptionHandler.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalArgument.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/IllegalArgument.java
similarity index 87%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalArgument.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/IllegalArgument.java
index d54757dfac..cb7f981e17 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalArgument.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/IllegalArgument.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalState.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/IllegalState.java
similarity index 92%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalState.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/IllegalState.java
index 0a812d2b82..105ca155b7 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/IllegalState.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/IllegalState.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import java.util.ArrayList;
 import java.util.Iterator;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/InterruptedExceptionExample.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/InterruptedExceptionExample.java
similarity index 91%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/InterruptedExceptionExample.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/InterruptedExceptionExample.java
index d0c8bb2cd0..3b37168013 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/InterruptedExceptionExample.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/InterruptedExceptionExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/MalformedURL.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/MalformedURL.java
similarity index 89%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/MalformedURL.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/MalformedURL.java
index 9a02f005fd..cc1f39ea69 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/MalformedURL.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/MalformedURL.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import java.net.MalformedURLException;
 import java.net.URL;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NullPointer.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/NullPointer.java
similarity index 93%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NullPointer.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/NullPointer.java
index 445cbecdc8..6d6a1706a6 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NullPointer.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/NullPointer.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NumberFormat.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/NumberFormat.java
similarity index 90%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NumberFormat.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/NumberFormat.java
index 576fe51f78..7497d023ee 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/NumberFormat.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/NumberFormat.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ParseExceptionExample.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ParseExceptionExample.java
similarity index 90%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ParseExceptionExample.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ParseExceptionExample.java
index e3b3e04b10..7def606786 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/ParseExceptionExample.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/ParseExceptionExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import java.text.DateFormat;
 import java.text.ParseException;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/StringIndexOutOfBounds.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/StringIndexOutOfBounds.java
similarity index 91%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/StringIndexOutOfBounds.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/StringIndexOutOfBounds.java
index 0ee132e568..8652926777 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/globalexceptionhandler/StringIndexOutOfBounds.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/globalexceptionhandler/StringIndexOutOfBounds.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinder.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rootcausefinder/RootCauseFinder.java
similarity index 98%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinder.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rootcausefinder/RootCauseFinder.java
index 06610f3874..cb04902dfa 100644
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinder.java
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rootcausefinder/RootCauseFinder.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.rootcausefinder;
+package com.baeldung.rootcausefinder;
 
 import java.time.LocalDate;
 import java.time.Period;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/AutoCloseableMain.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/AutoCloseableMain.java
similarity index 100%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/AutoCloseableMain.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/AutoCloseableMain.java
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesFirst.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesFirst.java
similarity index 100%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesFirst.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesFirst.java
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesSecond.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesSecond.java
similarity index 100%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesSecond.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/AutoCloseableResourcesSecond.java
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/MyResource.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/MyResource.java
similarity index 100%
rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/trywithresource/MyResource.java
rename to core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/trywithresource/MyResource.java
diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
rename to core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
index 74ceb3b442..83347f9d9d 100644
--- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
+++ b/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/globalexceptionhandler/GlobalExceptionHandlerUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptions.globalexceptionhandler;
+package com.baeldung.globalexceptionhandler;
 
 import org.junit.After;
 import org.junit.Before;
diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java b/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/rootcausefinder/RootCauseFinderUnitTest.java
similarity index 80%
rename from core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
rename to core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/rootcausefinder/RootCauseFinderUnitTest.java
index f42388857a..ccf14c4cba 100644
--- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/rootcausefinder/RootCauseFinderUnitTest.java
+++ b/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/rootcausefinder/RootCauseFinderUnitTest.java
@@ -1,7 +1,7 @@
-package com.baeldung.exceptions.rootcausefinder;
+package com.baeldung.rootcausefinder;
 
-import com.baeldung.exceptions.rootcausefinder.RootCauseFinder.CalculationException;
-import com.baeldung.exceptions.rootcausefinder.RootCauseFinder.DateOutOfRangeException;
+import com.baeldung.rootcausefinder.RootCauseFinder.CalculationException;
+import com.baeldung.rootcausefinder.RootCauseFinder.DateOutOfRangeException;
 import com.google.common.base.Throwables;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.junit.jupiter.api.Assertions;
@@ -11,8 +11,7 @@ import java.time.LocalDate;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 
-import static com.baeldung.exceptions.rootcausefinder.RootCauseFinder.AgeCalculator;
-import static com.baeldung.exceptions.rootcausefinder.RootCauseFinder.findCauseUsingPlainJava;
+import static com.baeldung.rootcausefinder.RootCauseFinder.AgeCalculator;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
@@ -38,7 +37,7 @@ public class RootCauseFinderUnitTest {
         try {
             AgeCalculator.calculateAge("010102");
         } catch (CalculationException ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
+            assertTrue(RootCauseFinder.findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
         }
     }
 
@@ -47,7 +46,7 @@ public class RootCauseFinderUnitTest {
         try {
             AgeCalculator.calculateAge("2020-04-04");
         } catch (CalculationException ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
+            assertTrue(RootCauseFinder.findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
         }
     }
 
@@ -56,7 +55,7 @@ public class RootCauseFinderUnitTest {
         try {
             AgeCalculator.calculateAge(null);
         } catch (Exception ex) {
-            assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
+            assertTrue(RootCauseFinder.findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
         }
     }
 
diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md
index b7222540e9..5f47aa69fb 100644
--- a/core-java-modules/core-java-exceptions/README.md
+++ b/core-java-modules/core-java-exceptions/README.md
@@ -12,9 +12,5 @@ This module contains articles about core java exceptions
 - [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws)
 - [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error)
 - [Checked and Unchecked Exceptions in Java](https://www.baeldung.com/java-checked-unchecked-exceptions)
-- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources)
-- [Java Global Exception Handler](https://www.baeldung.com/java-global-exception-handler)
 - [Common Java Exceptions](https://www.baeldung.com/java-common-exceptions)
-- [How to Find an Exception’s Root Cause in Java](https://www.baeldung.com/java-exception-root-cause)
-- [Is It a Bad Practice to Catch Throwable?](https://www.baeldung.com/java-catch-throwable-bad-practice)
 - [[Next -->]](/core-java-modules/core-java-exceptions-2)
\ No newline at end of file

From e1a6292ea60a390fdb983f961a8ac11ecd805bad Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sat, 9 May 2020 14:43:40 +0530
Subject: [PATCH 243/404] updated readme file

---
 spring-core-2/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-core-2/README.md b/spring-core-2/README.md
index 6068e8c3c2..d9110f629d 100644
--- a/spring-core-2/README.md
+++ b/spring-core-2/README.md
@@ -14,5 +14,5 @@ This module contains articles about core Spring functionality
 - [Spring Events](https://www.baeldung.com/spring-events)
 - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
 - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
-- [Running Setup Data in Startup] (https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
+- [Running Setup Data in Startup](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
 - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3)

From 57a38967638dd32afa8871ba1508c107043cd530 Mon Sep 17 00:00:00 2001
From: Maiklins <kruemel@quantentunnel.de>
Date: Sat, 9 May 2020 14:00:25 +0200
Subject: [PATCH 244/404] Bael-3857 introduction to lock free data structures
 (#9238)

* BAEL-3857 Introduction to Lock-Free Data Structures

* BAEL-3857 Declare variables as final / volatile

* BAEL-3857 Declare node value as final

Co-authored-by: mikr <michael.krimgen@ximedes.com>
---
 .../baeldung/lockfree/NonBlockingQueue.java   | 81 +++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100644 core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java

diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java
new file mode 100644
index 0000000000..9140dc287d
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java
@@ -0,0 +1,81 @@
+package com.baeldung.lockfree;
+
+import java.util.NoSuchElementException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class NonBlockingQueue<T> {
+
+    private final AtomicReference<Node<T>> head, tail;
+    private final AtomicInteger size;
+
+    public NonBlockingQueue() {
+        head = new AtomicReference<>(null);
+        tail = new AtomicReference<>(null);
+        size = new AtomicInteger();
+        size.set(0);
+    }
+
+    public void add(T element) {
+        if (element == null) {
+            throw new NullPointerException();
+        }
+
+        Node<T> node = new Node<>(element);
+        Node<T> currentTail;
+        do {
+            currentTail = tail.get();
+            node.setPrevious(currentTail);
+        } while(!tail.compareAndSet(currentTail, node));
+
+        if(node.previous != null) {
+            node.previous.next = node;
+        }
+
+        head.compareAndSet(null, node); //if we are inserting the first element
+        size.incrementAndGet();
+    }
+
+    public T get() {
+        if(head.get() == null) {
+            throw new NoSuchElementException();
+        }
+
+        Node<T> currentHead;
+        Node<T> nextNode;
+        do {
+            currentHead = head.get();
+            nextNode = currentHead.getNext();
+        } while(!head.compareAndSet(currentHead, nextNode));
+
+        size.decrementAndGet();
+        return currentHead.getValue();
+    }
+
+    public int size() {
+        return this.size.get();
+    }
+
+    private class Node<T> {
+        private final T value;
+        private volatile Node<T> next;
+        private volatile Node<T> previous;
+
+        public Node(T value) {
+            this.value = value;
+            this.next = null;
+        }
+
+        public T getValue() {
+            return value;
+        }
+
+        public Node<T> getNext() {
+            return next;
+        }
+
+        public void setPrevious(Node<T> previous) {
+            this.previous = previous;
+        }
+    }
+}

From 8d41b96d0775c0cdb78fc0feaf40dbe78676e1b2 Mon Sep 17 00:00:00 2001
From: Anshul Bansal <smartdiscover17@gmail.com>
Date: Sat, 9 May 2020 15:30:54 +0300
Subject: [PATCH 245/404] corrected alphabetical order of modules

---
 spring-security-modules/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index 59dd75cbda..7ce33dd3e3 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -30,8 +30,8 @@
         <module>spring-security-mvc-login</module>
         <module>spring-security-mvc-persisted-remember-me</module>
         <module>spring-security-mvc-socket</module>
-        <module>spring-security-okta</module>
         <module>spring-security-oidc</module>
+        <module>spring-security-okta</module>
         <module>spring-security-react</module>   
         <module>spring-security-rest</module>
         <module>spring-security-rest-basic-auth</module>

From c2637f15094888501070d52d4e535fa00e54c033 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Sat, 9 May 2020 14:56:21 +0200
Subject: [PATCH 246/404] BAEL-1524 Split spring-boot-persistence module

---
 .../spring-boot-persistence-2/README.md       |   4 +
 .../spring-boot-persistence-2/pom.xml         |  17 +++
 .../application/Application.java              |  24 ++--
 .../controllers/CustomerController.java       |  65 +++++-----
 .../application/entities/Customer.java        | 110 ++++++++--------
 .../repositories/CustomerRepository.java      |  16 +--
 .../SpringBootConsoleApplication.java         |   0
 .../application/entities/Customer.java        |   0
 .../repositories/CustomerRepository.java      |   0
 .../runners/CommandLineCrudRunner.java        |   0
 .../resources/persistence-derby.properties    |   8 ++
 .../persistence-generic-entity.properties     |   8 ++
 .../resources/persistence-hsqldb.properties   |   8 ++
 .../resources/persistence-sqlite.properties   |   7 +
 .../tests/CustomerControllerUnitTest.java     | 122 +++++++++---------
 ...otTomcatConnectionPoolIntegrationTest.java |   0
 .../spring-boot-persistence/README.MD         |   6 +-
 17 files changed, 222 insertions(+), 173 deletions(-)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/springboothsqldb/application/Application.java (96%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java (92%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java (95%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java (97%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java (100%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java (100%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java (100%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java (100%)
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-derby.properties
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-generic-entity.properties
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-hsqldb.properties
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-sqlite.properties
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java (97%)
 rename persistence-modules/{spring-boot-persistence => spring-boot-persistence-2}/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java (100%)

diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md
index 5d171fb2ca..8bf9381093 100644
--- a/persistence-modules/spring-boot-persistence-2/README.md
+++ b/persistence-modules/spring-boot-persistence-2/README.md
@@ -1,3 +1,7 @@
 ### Relevant Articles:
 
 - [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi)
+- [Configuring a Tomcat Connection Pool in Spring Boot](https://www.baeldung.com/spring-boot-tomcat-connection-pool)
+- [Integrating Spring Boot with HSQLDB](https://www.baeldung.com/spring-boot-hsqldb)
+- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases)
+- More articles: [[<-- prev]](../spring-boot-persistence)
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index 9f456fa8af..58432a5c9c 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -104,6 +104,23 @@
             <artifactId>tomcat-jdbc</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.xerial</groupId>
+            <artifactId>sqlite-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/Application.java
similarity index 96%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/Application.java
index c5a5c291c6..bde8346482 100644
--- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/Application.java
@@ -1,12 +1,12 @@
-package com.baeldung.springboothsqldb.application;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class Application {
-    
-    public static void main(String[] args) {
-        SpringApplication.run(Application.class, args);
-    }
-}
+package com.baeldung.springboothsqldb.application;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+    
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java
similarity index 92%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java
index 8229a1d1c0..045612a86f 100644
--- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java
@@ -1,33 +1,32 @@
-package com.baeldung.springboothsqldb.application.controllers;
-
-import com.baeldung.springboothsqldb.application.entities.Customer;
-import com.baeldung.springboothsqldb.application.repositories.CustomerRepository;
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class CustomerController {
-    
-    private final CustomerRepository customerRepository;
-    
-    @Autowired
-    public CustomerController(CustomerRepository customerRepository) {
-        this.customerRepository = customerRepository;
-    }
-    
-    @PostMapping("/customers")
-    public Customer addCustomer(@RequestBody Customer customer) {
-        customerRepository.save(customer);
-        return customer;
-    }
-    
-    @GetMapping("/customers")
-    public List<Customer> getCustomers() {
-        return (List<Customer>) customerRepository.findAll();
-    }
-}
+package com.baeldung.springboothsqldb.application.controllers;
+
+import com.baeldung.springboothsqldb.application.entities.Customer;
+import com.baeldung.springboothsqldb.application.repositories.CustomerRepository;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class CustomerController {
+    
+    private final CustomerRepository customerRepository;
+    
+    @Autowired
+    public CustomerController(CustomerRepository customerRepository) {
+        this.customerRepository = customerRepository;
+    }
+    
+    @PostMapping("/customers")
+    public Customer addCustomer(@RequestBody Customer customer) {
+        customerRepository.save(customer);
+        return customer;
+    }
+    
+    @GetMapping("/customers")
+    public List<Customer> getCustomers() {
+        return (List<Customer>) customerRepository.findAll();
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java
similarity index 95%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java
index 636a80e272..ee2735abb8 100644
--- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java
@@ -1,55 +1,55 @@
-package com.baeldung.springboothsqldb.application.entities;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "customers")
-public class Customer {
-    
-    @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)
-    private long id;
-    
-    private String name;
-    private String email;
-    
-    public Customer() {}
-    
-    public Customer(String name, String email) {
-        this.name = name;
-        this.email = email;
-    }
-    
-    public void setId(long id) {
-        this.id = id;
-    }
-    
-    public long getId() {
-        return id;
-    }
-    
-    public void setName(String name) {
-        this.name = name;
-    }
-    
-    public String getName() {
-        return name;
-    }
-    
-    public void setEmail(String email) {
-        this.email = email;
-    }
-    
-    public String getEmail() {
-        return email;
-    }
-
-    @Override
-    public String toString() {
-        return "Customer{" + "id=" + id + ", name=" + name + ", email=" + email + '}';
-    }
-}
+package com.baeldung.springboothsqldb.application.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "customers")
+public class Customer {
+    
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private long id;
+    
+    private String name;
+    private String email;
+    
+    public Customer() {}
+    
+    public Customer(String name, String email) {
+        this.name = name;
+        this.email = email;
+    }
+    
+    public void setId(long id) {
+        this.id = id;
+    }
+    
+    public long getId() {
+        return id;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setEmail(String email) {
+        this.email = email;
+    }
+    
+    public String getEmail() {
+        return email;
+    }
+
+    @Override
+    public String toString() {
+        return "Customer{" + "id=" + id + ", name=" + name + ", email=" + email + '}';
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java
similarity index 97%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java
index a81aa62c43..cc8a045e83 100644
--- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java
@@ -1,8 +1,8 @@
-package com.baeldung.springboothsqldb.application.repositories;
-
-import com.baeldung.springboothsqldb.application.entities.Customer;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface CustomerRepository extends CrudRepository<Customer, Long> {}
+package com.baeldung.springboothsqldb.application.repositories;
+
+import com.baeldung.springboothsqldb.application.entities.Customer;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CustomerRepository extends CrudRepository<Customer, Long> {}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
similarity index 100%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
similarity index 100%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
similarity index 100%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
similarity index 100%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
rename to persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-derby.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-derby.properties
new file mode 100644
index 0000000000..5b5ff05236
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-derby.properties
@@ -0,0 +1,8 @@
+jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver
+jdbc.url=jdbc:derby:memory:myD;create=true
+jdbc.user=sa
+jdbc.pass=
+
+hibernate.dialect=org.hibernate.dialect.DerbyDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-generic-entity.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-generic-entity.properties
new file mode 100644
index 0000000000..b19304cb1f
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-generic-entity.properties
@@ -0,0 +1,8 @@
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
+jdbc.user=sa
+jdbc.pass=sa
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-hsqldb.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-hsqldb.properties
new file mode 100644
index 0000000000..d045a8b7e5
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-hsqldb.properties
@@ -0,0 +1,8 @@
+jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver
+jdbc.url=jdbc:hsqldb:mem:myDb
+jdbc.user=sa
+jdbc.pass=
+
+hibernate.dialect=org.hibernate.dialect.HSQLDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-sqlite.properties
new file mode 100644
index 0000000000..ee16081603
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/persistence-sqlite.properties
@@ -0,0 +1,7 @@
+jdbc.driverClassName=org.sqlite.JDBC
+jdbc.url=jdbc:sqlite:memory:myDb?cache=shared
+jdbc.user=sa
+jdbc.pass=sa
+hibernate.dialect=com.baeldung.dialect.SQLiteDialect
+hibernate.hbm2ddl.auto=create-drop
+hibernate.show_sql=true
diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
similarity index 97%
rename from persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
rename to persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
index 33891e3d43..be16f8f563 100644
--- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
@@ -1,61 +1,61 @@
-package com.baeldung.springboothsqldb.application.tests;
-
-import com.baeldung.springboothsqldb.application.entities.Customer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import java.nio.charset.Charset;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.http.MediaType;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-@AutoConfigureMockMvc
-public class CustomerControllerUnitTest {
-
-    private static MediaType MEDIA_TYPE_JSON;
-
-    @Autowired
-    private MockMvc mockMvc;
-
-    @Before
-    public void setUpJsonMediaType() {
-        MEDIA_TYPE_JSON = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
-
-    }
-
-    @Test
-    public void whenPostHttpRequesttoCustomers_thenStatusOK() throws Exception {
-        Customer customer = new Customer("John", "john@domain.com");
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
-        ObjectWriter objectWriter = mapper.writer().withDefaultPrettyPrinter();
-        String requestJson = objectWriter.writeValueAsString(customer);
-        
-        this.mockMvc
-                .perform(MockMvcRequestBuilders.post("/customers")
-                        .contentType(MEDIA_TYPE_JSON)
-                        .content(requestJson)
-                )
-                
-                .andExpect(MockMvcResultMatchers.status().isOk());
-    }
-    
-    @Test
-    public void whenGetHttpRequesttoCustomers_thenStatusOK() throws Exception {
-        this.mockMvc
-                .perform(MockMvcRequestBuilders.get("/customers"))
-                
-                .andExpect(MockMvcResultMatchers.content().contentType(MEDIA_TYPE_JSON))
-                .andExpect(MockMvcResultMatchers.status().isOk());
-    }
-}
+package com.baeldung.springboothsqldb.application.tests;
+
+import com.baeldung.springboothsqldb.application.entities.Customer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import java.nio.charset.Charset;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+public class CustomerControllerUnitTest {
+
+    private static MediaType MEDIA_TYPE_JSON;
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Before
+    public void setUpJsonMediaType() {
+        MEDIA_TYPE_JSON = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
+
+    }
+
+    @Test
+    public void whenPostHttpRequesttoCustomers_thenStatusOK() throws Exception {
+        Customer customer = new Customer("John", "john@domain.com");
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+        ObjectWriter objectWriter = mapper.writer().withDefaultPrettyPrinter();
+        String requestJson = objectWriter.writeValueAsString(customer);
+        
+        this.mockMvc
+                .perform(MockMvcRequestBuilders.post("/customers")
+                        .contentType(MEDIA_TYPE_JSON)
+                        .content(requestJson)
+                )
+                
+                .andExpect(MockMvcResultMatchers.status().isOk());
+    }
+    
+    @Test
+    public void whenGetHttpRequesttoCustomers_thenStatusOK() throws Exception {
+        this.mockMvc
+                .perform(MockMvcRequestBuilders.get("/customers"))
+                
+                .andExpect(MockMvcResultMatchers.content().contentType(MEDIA_TYPE_JSON))
+                .andExpect(MockMvcResultMatchers.status().isOk());
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
rename to persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD
index 96eb326cbe..d6ef239448 100644
--- a/persistence-modules/spring-boot-persistence/README.MD
+++ b/persistence-modules/spring-boot-persistence/README.MD
@@ -3,10 +3,8 @@
 - [Spring Boot with Multiple SQL Import Files](http://www.baeldung.com/spring-boot-sql-import-files)
 - [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source)
 - [Quick Guide on Loading Initial Data with Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql)
-- [Configuring a Tomcat Connection Pool in Spring Boot](https://www.baeldung.com/spring-boot-tomcat-connection-pool)
-- [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot)
-- [Integrating Spring Boot with HSQLDB](https://www.baeldung.com/spring-boot-hsqldb)
 - [Configuring a DataSource Programmatically in Spring Boot](https://www.baeldung.com/spring-boot-configure-data-source-programmatic)
 - [Resolving “Failed to Configure a DataSource” Error](https://www.baeldung.com/spring-boot-failed-to-configure-data-source)
+- [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot)
 - [Spring Boot with Hibernate](https://www.baeldung.com/spring-boot-hibernate)
-- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases)
\ No newline at end of file
+- More articles: [[more -->]](../spring-boot-persistence-2)
\ No newline at end of file

From ab3336e9b0f6f0f8b37b2c7f6302de3a04e718ef Mon Sep 17 00:00:00 2001
From: CHANDRAKANT Kumar <kumar.chandrakant@soprabanking.com>
Date: Sat, 9 May 2020 18:59:56 +0530
Subject: [PATCH 247/404] Updated pom descriptor and formatting.

---
 java-es-cqrs/.gitignore | 29 ----------------------
 java-es-cqrs/pom.xml    | 53 ++++++++++++++++++++++-------------------
 pom.xml                 |  2 ++
 3 files changed, 30 insertions(+), 54 deletions(-)
 delete mode 100644 java-es-cqrs/.gitignore

diff --git a/java-es-cqrs/.gitignore b/java-es-cqrs/.gitignore
deleted file mode 100644
index 153c9335eb..0000000000
--- a/java-es-cqrs/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-HELP.md
-/target/
-!.mvn/wrapper/maven-wrapper.jar
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-/build/
-
-### VS Code ###
-.vscode/
diff --git a/java-es-cqrs/pom.xml b/java-es-cqrs/pom.xml
index b1ebbf1d57..8760a38262 100644
--- a/java-es-cqrs/pom.xml
+++ b/java-es-cqrs/pom.xml
@@ -1,27 +1,30 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>com.sapient.learning</groupId>
-	<artifactId>java-es-cqrs</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>java-es-cqrs</name>
-	<properties>
-		<maven.compiler.source>1.8</maven.compiler.source>
-		<maven.compiler.target>1.8</maven.compiler.target>
-	</properties>
-	<dependencies>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-			<version>1.18.12</version>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.13</version>
-			<scope>test</scope>
-		</dependency>
-
-	</dependencies>
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">	
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>java-es-cqrs</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>java-es-cqrs</name>
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-modules</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.12</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 2f4579c999..9a4b40b950 100644
--- a/pom.xml
+++ b/pom.xml
@@ -568,6 +568,7 @@
                 <module>rxjava-operators</module>
 
 				<module>atomikos</module>
+				<module>java-es-cqrs</module>
             </modules>
 
         </profile>
@@ -1083,6 +1084,7 @@
                 <module>rxjava-operators</module>
 
 				<module>atomikos</module>
+				<module>java-es-cqrs</module>
             </modules>
 
         </profile>

From af387990c86b52957874329517a3e8daebf90dc9 Mon Sep 17 00:00:00 2001
From: Cicio Flaviu <cicioflaviu@gmail.com>
Date: Sun, 10 May 2020 08:43:51 +0300
Subject: [PATCH 248/404] BAEL-3849 Implemented example code for comparing
 Transactional. (#9261)

---
 .../TransactionalCompareApplication.java      | 12 ++++
 .../spring/transactional/entity/Car.java      | 60 +++++++++++++++++++
 .../repository/CarRepository.java             |  7 +++
 .../transactional/service/CarService.java     | 25 ++++++++
 .../transactional/service/RentalService.java  | 22 +++++++
 5 files changed, 126 insertions(+)
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java
 create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java

diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java
new file mode 100644
index 0000000000..7fee55be8a
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.transactional;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+class TransactionalCompareApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TransactionalCompareApplication.class, args);
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java
new file mode 100644
index 0000000000..1219111ffa
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java
@@ -0,0 +1,60 @@
+package com.baeldung.spring.transactional.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Car {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    private String make;
+
+    private String model;
+
+    public Car() {
+    }
+
+    public Car(Long id, String make, String model) {
+        this.id = id;
+        this.make = make;
+        this.model = model;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMake() {
+        return make;
+    }
+
+    public void setMake(String make) {
+        this.make = make;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    @Override
+    public String toString() {
+        return "Car{" +
+                "id=" + id +
+                ", make='" + make + '\'' +
+                ", model='" + model + '\'' +
+                '}';
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java
new file mode 100644
index 0000000000..f8ecc8f550
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.spring.transactional.repository;
+
+import com.baeldung.spring.transactional.entity.Car;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface CarRepository extends JpaRepository<Car, Long> {
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java
new file mode 100644
index 0000000000..0821ddb02b
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java
@@ -0,0 +1,25 @@
+package com.baeldung.spring.transactional.service;
+
+import com.baeldung.spring.transactional.entity.Car;
+import com.baeldung.spring.transactional.repository.CarRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityExistsException;
+
+@Service
+@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, readOnly = false, timeout = 30)
+public class CarService {
+
+    @Autowired
+    private CarRepository carRepository;
+
+    @Transactional(rollbackFor = IllegalArgumentException.class, noRollbackFor = EntityExistsException.class,
+      rollbackForClassName = "IllegalArgumentException", noRollbackForClassName = "EntityExistsException")
+    public Car save(Car car) {
+        return carRepository.save(car);
+    }
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java
new file mode 100644
index 0000000000..0aa0815a98
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java
@@ -0,0 +1,22 @@
+package com.baeldung.spring.transactional.service;
+
+import com.baeldung.spring.transactional.entity.Car;
+import com.baeldung.spring.transactional.repository.CarRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.EntityExistsException;
+import javax.transaction.Transactional;
+
+@Service
+@Transactional(Transactional.TxType.SUPPORTS)
+public class RentalService {
+
+    @Autowired
+    private CarRepository carRepository;
+
+    @Transactional(rollbackOn = IllegalArgumentException.class, dontRollbackOn = EntityExistsException.class)
+    public Car rent(Car car) {
+        return carRepository.save(car);
+    }
+}

From 8e5456b24bced301812c4129a9bed6eee7a574f9 Mon Sep 17 00:00:00 2001
From: Mona Mohamadinia <mona.mohamadinia@gmail.com>
Date: Sun, 10 May 2020 13:34:01 +0430
Subject: [PATCH 249/404] Added The Sample Codes for Lateinit Initialization
 (#9253)

---
 .../com/baeldung/late/LateInitUnitTest.kt     | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt

diff --git a/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt b/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt
new file mode 100644
index 0000000000..c99e438742
--- /dev/null
+++ b/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt
@@ -0,0 +1,22 @@
+package com.baeldung.late
+
+import org.junit.Test
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class LateInitUnitTest {
+
+    private lateinit var answer: String
+
+    @Test(expected = UninitializedPropertyAccessException::class)
+    fun givenLateInit_WhenNotInitialized_ShouldThrowAnException() {
+        answer.length
+    }
+
+    @Test
+    fun givenLateInit_TheIsInitialized_ReturnsTheInitializationStatus() {
+        assertFalse { this::answer.isInitialized }
+        answer = "42"
+        assertTrue { this::answer.isInitialized }
+    }
+}

From 5c90dbc963995c23ca155cbf87100224804627cb Mon Sep 17 00:00:00 2001
From: Somnath Musib <7885767+musibs@users.noreply.github.com>
Date: Mon, 11 May 2020 00:14:53 +1000
Subject: [PATCH 250/404] BAEL-3852 - A Guide to Foreign Memory Access API in
 Java 14 (#9040)

* Code sample for Java Hexagonal architecture

* BAEL-3838 Capturing a Java Thread Dump

* BAEL-3852 Foreign memory api in Java

* BAEL-3852 - Review changes of A Guide to Foreign Memory Access API in Java 14

* BAEL-3852 - Additional review changes for A Guide to Foreign Memory Access API in Java 14

* Review changes for alignment and class removal

* Removed incorrectly added old files from the PR

* Indentation changes

Co-authored-by: Somnath Musib <somnath.musib@voltbank.com.au>
---
 .../foreign/api/ForeignMemoryUnitTest.java    | 84 +++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 core-java-modules/core-java-14/src/test/java/com/baeldung/java14/foreign/api/ForeignMemoryUnitTest.java

diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/foreign/api/ForeignMemoryUnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/foreign/api/ForeignMemoryUnitTest.java
new file mode 100644
index 0000000000..b2264f30e6
--- /dev/null
+++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/foreign/api/ForeignMemoryUnitTest.java
@@ -0,0 +1,84 @@
+package com.baeldung.java14.foreign.api;
+
+import jdk.incubator.foreign.*;
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+import java.lang.invoke.VarHandle;
+import java.nio.ByteOrder;
+
+public class ForeignMemoryUnitTest {
+
+    @Test
+    public void whenAValueIsSet_thenAccessTheValue() {
+        long value = 10;
+        MemoryAddress memoryAddress =
+          MemorySegment.allocateNative(8).baseAddress();
+        VarHandle varHandle = MemoryHandles.varHandle(long.class,
+          ByteOrder.nativeOrder());
+        varHandle.set(memoryAddress, value);
+        assertThat(varHandle.get(memoryAddress), is(value));
+    }
+
+    @Test
+    public void whenMultipleValuesAreSet_thenAccessAll() {
+        VarHandle varHandle = MemoryHandles.varHandle(int.class,
+          ByteOrder.nativeOrder());
+
+        try(MemorySegment memorySegment =
+          MemorySegment.allocateNative(100)) {
+            MemoryAddress base = memorySegment.baseAddress();
+            for(int i=0; i<25; i++) {
+                varHandle.set(base.addOffset((i*4)), i);
+            }
+            for(int i=0; i<25; i++) {
+                assertThat(varHandle.get(base.addOffset((i*4))), is(i));
+            }
+        }
+    }
+
+    @Test
+    public void whenSetValuesWithMemoryLayout_thenTheyCanBeRetrieved() {
+        SequenceLayout sequenceLayout =
+          MemoryLayout.ofSequence(25,
+            MemoryLayout.ofValueBits(64, ByteOrder.nativeOrder()));
+        VarHandle varHandle =
+          sequenceLayout.varHandle(long.class,
+            MemoryLayout.PathElement.sequenceElement());
+
+        try(MemorySegment memorySegment =
+          MemorySegment.allocateNative(sequenceLayout)) {
+            MemoryAddress base = memorySegment.baseAddress();
+            for(long i=0; i<sequenceLayout.elementCount().getAsLong(); i++) {
+                varHandle.set(base, i, i);
+            }
+            for(long i=0; i<sequenceLayout.elementCount().getAsLong(); i++) {
+                assertThat(varHandle.get(base, i), is(i));
+            }
+        }
+    }
+
+    @Test
+    public void whenSlicingMemorySegment_thenTheyCanBeAccessedIndividually() {
+        MemoryAddress memoryAddress =
+          MemorySegment.allocateNative(12).baseAddress();
+        MemoryAddress memoryAddress1 =
+          memoryAddress.segment().asSlice(0,4).baseAddress();
+        MemoryAddress memoryAddress2 =
+          memoryAddress.segment().asSlice(4,4).baseAddress();
+        MemoryAddress memoryAddress3 =
+          memoryAddress.segment().asSlice(8,4).baseAddress();
+
+        VarHandle intHandle =
+          MemoryHandles.varHandle(int.class, ByteOrder.nativeOrder());
+        intHandle.set(memoryAddress1, Integer.MIN_VALUE);
+        intHandle.set(memoryAddress2, 0);
+        intHandle.set(memoryAddress3, Integer.MAX_VALUE);
+
+        assertThat(intHandle.get(memoryAddress1), is(Integer.MIN_VALUE));
+        assertThat(intHandle.get(memoryAddress2), is(0));
+        assertThat(intHandle.get(memoryAddress3), is(Integer.MAX_VALUE));
+    }
+}

From 70379f1010d57e044a2f604495ded490154c7ec7 Mon Sep 17 00:00:00 2001
From: Loredana Crusoveanu <lore.crusoveanu@gmail.com>
Date: Sun, 10 May 2020 18:07:39 +0300
Subject: [PATCH 251/404] Update README.md

---
 persistence-modules/spring-jpa/README.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md
index 599a667a13..5db88cd5ee 100644
--- a/persistence-modules/spring-jpa/README.md
+++ b/persistence-modules/spring-jpa/README.md
@@ -13,7 +13,6 @@
 - [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring)
 - [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
 - [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many)
-- [Spring Persistence (Hibernate and JPA) with a JNDI datasource](https://www.baeldung.com/spring-persistence-hibernate-and-jpa-with-a-jndi-datasource/)
 
 
 ### Eclipse Config 

From 714034ccf0b2fdd09d32401b46576f309fd4e1b2 Mon Sep 17 00:00:00 2001
From: Krzysiek <krzysztofwoyke@gmail.com>
Date: Sun, 10 May 2020 22:31:27 +0200
Subject: [PATCH 252/404] JAVA-1653: Remove spring-boot.version property

---
 cas/cas-secured-app/pom.xml | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml
index 426d65c32b..bcce82c94c 100644
--- a/cas/cas-secured-app/pom.xml
+++ b/cas/cas-secured-app/pom.xml
@@ -16,10 +16,6 @@
         <relativePath>../../parent-boot-2</relativePath>
     </parent>
 
-    <properties>
-        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
-    </properties>
-
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>

From 9194d94eeb45c347a4a559de40509fdd147c931b Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Mon, 11 May 2020 08:28:13 -0400
Subject: [PATCH 253/404] Bael-3893 - Fixed string concatenation operator

---
 .../AwsAppSyncApplicationTests.java           | 46 +++++++++----------
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
index 6e94651789..22d99959b3 100644
--- a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -16,17 +16,17 @@ class AwsAppSyncApplicationTests {
     void givenGraphQuery_whenListEvents_thenReturnAllEvents() {
 
         Map<String, Object> requestBody = new HashMap<>();
-        requestBody.put("query", "query ListEvents {" +
-                "  listEvents {" +
-                "    items {" +
-                "      id" +
-                "      name" +
-                "      where" +
-                "      when" +
-                "      description" +
-                "    }" +
-                "  }" +
-                "}");
+        requestBody.put("query", "query ListEvents {"
+                + "  listEvents {"
+                + "    items {"
+                + "      id"
+                + "      name"
+                + "      where"
+                + "      when"
+                + "      description"
+                + "    }"
+                + "  }"
+                + "}");
         requestBody.put("variables", "");
         requestBody.put("operationName", "ListEvents");
 
@@ -42,18 +42,18 @@ class AwsAppSyncApplicationTests {
     @Test
     void givenGraphAdd_whenMutation_thenReturnIdNameDesc() {
 
-        String queryString = "mutation add {" +
-                "    createEvent(" +
-                "        name:\"My added GraphQL event\"" +
-                "        where:\"Day 2\"" +
-                "        when:\"Saturday night\"" +
-                "        description:\"Studying GraphQL\"" +
-                "    ){" +
-                "        id" +
-                "        name" +
-                "        description" +
-                "    }" +
-                "}";
+        String queryString = "mutation add {"
+                + "    createEvent("
+                + "        name:\"My added GraphQL event\""
+                + "        where:\"Day 2\""
+                + "        when:\"Saturday night\""
+                + "        description:\"Studying GraphQL\""
+                + "    ){"
+                + "        id"
+                + "        name"
+                + "        description"
+                + "    }"
+                + "}";
 
         Map<String, Object> requestBody = new HashMap<>();
         requestBody.put("query", queryString);

From 699e94fdb64af3fc6ad6afb32f71f90fe0fbe9f1 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Mon, 11 May 2020 18:54:07 +0530
Subject: [PATCH 254/404] JAVA-952: Migrate spring-session to parent-boot-2

---
 spring-session/pom.xml                             |  4 ++--
 spring-session/spring-session-redis/pom.xml        | 11 ++++++++---
 .../baeldung/spring/session/SecurityConfig.java    | 14 +++++++++++---
 .../session/SessionControllerIntegrationTest.java  |  2 +-
 4 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/spring-session/pom.xml b/spring-session/pom.xml
index 42a414afdc..8388efb6c3 100644
--- a/spring-session/pom.xml
+++ b/spring-session/pom.xml
@@ -10,9 +10,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <modules>
diff --git a/spring-session/spring-session-redis/pom.xml b/spring-session/spring-session-redis/pom.xml
index 37402634b0..8d225e06ed 100644
--- a/spring-session/spring-session-redis/pom.xml
+++ b/spring-session/spring-session-redis/pom.xml
@@ -9,9 +9,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-boot-1</relativePath>
+        <relativePath>../../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
@@ -25,7 +25,7 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.session</groupId>
-            <artifactId>spring-session</artifactId>
+            <artifactId>spring-session-data-redis</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -36,6 +36,11 @@
             <artifactId>embedded-redis</artifactId>
             <version>${embedded-redis.version}</version>
         </dependency>
+       <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <type>jar</type>
+        </dependency>
     </dependencies>
 
     <properties>
diff --git a/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java b/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java
index 1da6d9422d..678c98e7eb 100644
--- a/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java
+++ b/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java
@@ -1,23 +1,31 @@
 package com.baeldung.spring.session;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
 
 @Configuration
 @EnableWebSecurity
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
-
+    
     @Autowired
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
-        auth.inMemoryAuthentication().withUser("admin").password("password").roles("ADMIN");
+        auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("password")).roles("ADMIN");
     }
-
+    
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.httpBasic().and().authorizeRequests().antMatchers("/").hasRole("ADMIN").anyRequest().authenticated();
     }
+    
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
 }
diff --git a/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java b/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java
index 7ee0294315..065533c73f 100644
--- a/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java
+++ b/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java
@@ -5,7 +5,7 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.springframework.boot.context.embedded.LocalServerPort;
+import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 import org.springframework.boot.test.web.client.TestRestTemplate;

From 9d2e94f5290187f3a48faa34d4363a25a49a951c Mon Sep 17 00:00:00 2001
From: Justin Albano <albanoj2@users.noreply.github.com>
Date: Mon, 11 May 2020 11:47:04 -0400
Subject: [PATCH 255/404] BAEL-3951: Added JDK 14 record example and associated
 tests. (#9270)

---
 .../com/baeldung/java14/record/Person.java    |  22 +++
 .../baeldung/java14/record/PersonTest.java    | 150 ++++++++++++++++++
 2 files changed, 172 insertions(+)
 create mode 100644 core-java-modules/core-java-14/src/main/java/com/baeldung/java14/record/Person.java
 create mode 100644 core-java-modules/core-java-14/src/test/java/com/baeldung/java14/record/PersonTest.java

diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/record/Person.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/record/Person.java
new file mode 100644
index 0000000000..33243c4ecf
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/record/Person.java
@@ -0,0 +1,22 @@
+package com.baeldung.java14.record;
+
+import java.util.Objects;
+
+public record Person (String name, String address) {
+	
+	public static String UNKWOWN_ADDRESS = "Unknown";
+	public static String UNNAMED = "Unnamed";
+
+	public Person {
+		Objects.requireNonNull(name);
+		Objects.requireNonNull(address);
+	}
+	
+	public Person(String name) {
+		this(name, UNKWOWN_ADDRESS);
+	}
+	
+	public static Person unnamed(String address) {
+		return new Person(UNNAMED, address);
+	}
+}
diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/record/PersonTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/record/PersonTest.java
new file mode 100644
index 0000000000..4a7d4ede5f
--- /dev/null
+++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/record/PersonTest.java
@@ -0,0 +1,150 @@
+package com.baeldung.java14.record;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class PersonTest {
+
+    @Test
+    public void givenSameNameAndAddress_whenEquals_thenPersonsEqual() {
+
+        String name = "John Doe";
+        String address = "100 Linda Ln.";
+
+        Person person1 = new Person(name, address);
+        Person person2 = new Person(name, address);
+
+        assertTrue(person1.equals(person2));
+    }
+    
+    @Test
+    public void givenDifferentObject_whenEquals_thenNotEqual() {
+
+        Person person = new Person("John Doe", "100 Linda Ln.");
+
+        assertFalse(person.equals(new Object()));
+    }
+
+    @Test
+    public void givenDifferentName_whenEquals_thenPersonsNotEqual() {
+    
+        String address = "100 Linda Ln.";
+    
+        Person person1 = new Person("Jane Doe", address);
+        Person person2 = new Person("John Doe", address);
+    
+        assertFalse(person1.equals(person2));
+    }
+    
+    @Test
+    public void givenDifferentAddress_whenEquals_thenPersonsNotEqual() {
+    
+        String name = "John Doe";
+    
+        Person person1 = new Person(name, "100 Linda Ln.");
+        Person person2 = new Person(name, "200 London Ave.");
+    
+        assertFalse(person1.equals(person2));
+    }
+
+    @Test
+    public void givenSameNameAndAddress_whenHashCode_thenPersonsEqual() {
+
+        String name = "John Doe";
+        String address = "100 Linda Ln.";
+
+        Person person1 = new Person(name, address);
+        Person person2 = new Person(name, address);
+
+        assertEquals(person1.hashCode(), person2.hashCode());
+    }
+    
+    @Test
+    public void givenDifferentObject_whenHashCode_thenNotEqual() {
+
+        Person person = new Person("John Doe", "100 Linda Ln.");
+
+        assertNotEquals(person.hashCode(), new Object().hashCode());
+    }
+
+    @Test
+    public void givenDifferentName_whenHashCode_thenPersonsNotEqual() {
+
+        String address = "100 Linda Ln.";
+
+        Person person1 = new Person("Jane Doe", address);
+        Person person2 = new Person("John Doe", address);
+
+        assertNotEquals(person1.hashCode(), person2.hashCode());
+    }
+
+    @Test
+    public void givenDifferentAddress_whenHashCode_thenPersonsNotEqual() {
+
+        String name = "John Doe";
+
+        Person person1 = new Person(name, "100 Linda Ln.");
+        Person person2 = new Person(name, "200 London Ave.");
+
+        assertNotEquals(person1.hashCode(), person2.hashCode());
+    }
+
+    @Test
+    public void givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned() {
+
+        String name = "John Doe";
+        String address = "100 Linda Ln.";
+
+        Person person = new Person(name, address);
+
+        assertEquals(name, person.name());
+        assertEquals(address, person.address());
+    }
+
+    @Test
+    public void givenValidNameAndAddress_whenToString_thenCorrectStringReturned() {
+
+        String name = "John Doe";
+        String address = "100 Linda Ln.";
+
+        Person person = new Person(name, address);
+
+        assertEquals("Person[name=" + name + ", address=" + address + "]", person.toString());
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void givenNullName_whenConstruct_thenErrorThrown() {
+        new Person(null, "100 Linda Ln.");
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void givenNullAddress_whenConstruct_thenErrorThrown() {
+        new Person("John Doe", null);
+    }
+
+    @Test
+    public void givenUnknownAddress_whenConstructing_thenAddressPopulated() {
+
+        String name = "John Doe";
+
+        Person person = new Person(name);
+
+        assertEquals(name, person.name());
+        assertEquals(Person.UNKWOWN_ADDRESS, person.address());
+    }
+
+    @Test
+    public void givenUnnamed_whenConstructingThroughFactory_thenNamePopulated() {
+
+        String address = "100 Linda Ln.";
+
+        Person person = Person.unnamed(address);
+
+        assertEquals(Person.UNNAMED, person.name());
+        assertEquals(address, person.address());
+    }
+}

From bd588e7321e8e50b712cd2dd4252e1fef48738e0 Mon Sep 17 00:00:00 2001
From: Joao Esperancinha <joao.esperancinha@eonics.nl>
Date: Mon, 11 May 2020 18:23:14 +0200
Subject: [PATCH 256/404] [BAEL-2749] Refactoring and cleanup

---
 .../baeldung/dbunit/DataSourceDBUnitTest.java | 90 ++++++++++---------
 .../baeldung/dbunit/OldSchoolDbUnitTest.java  | 89 +++++++++---------
 2 files changed, 98 insertions(+), 81 deletions(-)

diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java
index 93c7e9a456..ab3e9f3dbd 100644
--- a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java
+++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java
@@ -24,6 +24,8 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 
 import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL;
+import static com.baeldung.dbunit.ConnectionSettings.PASSWORD;
+import static com.baeldung.dbunit.ConnectionSettings.USER;
 import static java.util.stream.Collectors.joining;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.dbunit.Assertion.assertEqualsIgnoreCols;
@@ -33,12 +35,14 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
 
     private static final Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class);
 
+    private Connection connection;
+
     @Override
     protected DataSource getDataSource() {
         JdbcDataSource dataSource = new JdbcDataSource();
         dataSource.setURL(JDBC_URL);
-        dataSource.setUser("sa");
-        dataSource.setPassword("");
+        dataSource.setUser(USER);
+        dataSource.setPassword(PASSWORD);
         return dataSource;
     }
 
@@ -62,6 +66,7 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
     @Before
     public void setUp() throws Exception {
         super.setUp();
+        connection = getConnection().getConnection();
     }
 
     @After
@@ -71,9 +76,7 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
 
     @Test
     public void givenDataSet_whenSelect_thenFirstTitleIsGreyTShirt() throws SQLException {
-        final Connection connection = getDataSource().getConnection();
-
-        final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1");
+        ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1");
 
         assertThat(rs.next()).isTrue();
         assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt");
@@ -81,58 +84,59 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
 
     @Test
     public void givenDataSetEmptySchema_whenDataSetCreated_thenTablesAreEqual() throws Exception {
-        final IDataSet expectedDataSet = getDataSet();
-        final ITable expectedTable = expectedDataSet.getTable("CLIENTS");
-        final IDataSet databaseDataSet = getConnection().createDataSet();
-        final ITable actualTable = databaseDataSet.getTable("CLIENTS");
+        IDataSet expectedDataSet = getDataSet();
+        ITable expectedTable = expectedDataSet.getTable("CLIENTS");
+        IDataSet databaseDataSet = getConnection().createDataSet();
+        ITable actualTable = databaseDataSet.getTable("CLIENTS");
         Assertion.assertEquals(expectedTable, actualTable);
     }
 
     @Test
     public void givenDataSet_whenInsert_thenTableHasNewClient() throws Exception {
-        try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-user.xml")) {
-            final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is);
-            final ITable expectedTable = expectedDataSet.getTable("CLIENTS");
-            final Connection conn = getDataSource().getConnection();
+        try (InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-user.xml")) {
+            // given
+            IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is);
+            ITable expectedTable = expectedDataSet.getTable("CLIENTS");
+            Connection conn = getDataSource().getConnection();
 
+            // when
             conn.createStatement()
-                .executeUpdate(
-                "INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')");
-            final ITable actualData = getConnection()
-                .createQueryTable(
-                    "result_name",
-                    "SELECT * FROM CLIENTS WHERE last_name='Jansen'");
+                .executeUpdate("INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')");
+            ITable actualData = getConnection()
+                .createQueryTable("result_name", "SELECT * FROM CLIENTS WHERE last_name='Jansen'");
 
+            // then
             assertEqualsIgnoreCols(expectedTable, actualData, new String[] { "id" });
         }
     }
 
     @Test
     public void givenDataSet_whenDelete_thenItemIsDeleted() throws Exception {
-        final Connection connection = getConnection().getConnection();
-
-        try (final InputStream is = DataSourceDBUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) {
+        try (InputStream is = DataSourceDBUnitTest.class.getClassLoader()
+            .getResourceAsStream("dbunit/items_exp_delete.xml")) {
+            // given
             ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS");
 
+            // when
             connection.createStatement().executeUpdate("delete from ITEMS where id = 2");
 
-            final IDataSet databaseDataSet = getConnection().createDataSet();
+            // then
+            IDataSet databaseDataSet = getConnection().createDataSet();
             ITable actualTable = databaseDataSet.getTable("ITEMS");
-
             Assertion.assertEquals(expectedTable, actualTable);
         }
     }
 
     @Test
     public void givenDataSet_whenUpdate_thenItemHasNewName() throws Exception {
-        final Connection connection = getConnection().getConnection();
-
-        try (final InputStream is = DataSourceDBUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) {
+        try (InputStream is = DataSourceDBUnitTest.class.getClassLoader()
+            .getResourceAsStream("dbunit/items_exp_rename.xml")) {
+            // given
             ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS");
 
             connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1");
 
-            final IDataSet databaseDataSet = getConnection().createDataSet();
+            IDataSet databaseDataSet = getConnection().createDataSet();
             ITable actualTable = databaseDataSet.getTable("ITEMS");
 
             Assertion.assertEquals(expectedTable, actualTable);
@@ -140,22 +144,24 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
     }
 
     @Test
-    public void givenDataSet_whenInsertUnexpectedData_thenFailOnAllUnexpectedValues() throws Exception {
-        try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-multiple-failures.xml")) {
-            final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is);
-            final ITable expectedTable = expectedDataSet.getTable("ITEMS");
-            final Connection conn = getDataSource().getConnection();
-            final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler();
+    public void givenDataSet_whenInsertUnexpectedData_thenFail() throws Exception {
+        try (InputStream is = getClass().getClassLoader()
+            .getResourceAsStream("dbunit/expected-multiple-failures.xml")) {
 
-            conn.createStatement().executeUpdate(
-                "INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')");
-            final ITable actualData = getConnection().createDataSet().getTable("ITEMS");
+            // given
+            IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is);
+            ITable expectedTable = expectedDataSet.getTable("ITEMS");
+            Connection conn = getDataSource().getConnection();
+            DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler();
 
+            // when
+            conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')");
+            ITable actualData = getConnection().createDataSet().getTable("ITEMS");
+
+            // then
             Assertion.assertEquals(expectedTable, actualData, collectingHandler);
             if (!collectingHandler.getDiffList().isEmpty()) {
-                String message = (String) collectingHandler
-                    .getDiffList()
-                    .stream()
+                String message = (String) collectingHandler.getDiffList().stream()
                     .map(d -> formatDifference((Difference) d)).collect(joining("\n"));
                 logger.error(() -> message);
             }
@@ -163,6 +169,8 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
     }
 
     private static String formatDifference(Difference diff) {
-        return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue();
+        return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff
+            .getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff
+            .getActualValue();
     }
 }
diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java
index 6243af9676..e2db31283f 100644
--- a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java
+++ b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java
@@ -31,13 +31,15 @@ public class OldSchoolDbUnitTest {
 
     private static IDatabaseTester tester = null;
 
+    private Connection connection;
+
     @BeforeClass
     public static void setUp() throws Exception {
         tester = initDatabaseTester();
     }
 
     private static IDatabaseTester initDatabaseTester() throws Exception {
-        final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD);
+        JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD);
         tester.setDataSet(initDataSet());
         tester.setSetUpOperation(DatabaseOperation.REFRESH);
         tester.setTearDownOperation(DatabaseOperation.DELETE_ALL);
@@ -45,7 +47,7 @@ public class OldSchoolDbUnitTest {
     }
 
     private static IDataSet initDataSet() throws Exception {
-        try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) {
+        try (InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) {
             return new FlatXmlDataSetBuilder().build(is);
         }
     }
@@ -53,6 +55,7 @@ public class OldSchoolDbUnitTest {
     @Before
     public void setup() throws Exception {
         tester.onSetup();
+        connection = tester.getConnection().getConnection();
     }
 
     @After
@@ -62,94 +65,100 @@ public class OldSchoolDbUnitTest {
 
     @Test
     public void givenDataSet_whenSelect_thenFirstTitleIsGreyTShirt() throws Exception {
-        final Connection connection = tester.getConnection().getConnection();
-
-        final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1");
+        ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1");
 
         assertThat(rs.next()).isTrue();
         assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt");
     }
 
     @Test
-    public void givenDataSet_whenInsert_thenGetResultsAreStillEqualIfIgnoringColumnsWithDifferentProduced() throws Exception {
-        final Connection connection = tester.getConnection().getConnection();
-        final String[] excludedColumns = { "id", "produced" };
-        try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) {
-            final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is);
-            final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(
-                expectedDataSet.getTable("ITEMS"), excludedColumns);
+    public void givenDataSet_whenInsert_thenGetResultsAreStillEqualIfIgnoringColumnsWithDifferentProduced()
+        throws Exception {
+        String[] excludedColumns = { "id", "produced" };
+        try (InputStream is = getClass().getClassLoader()
+            .getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) {
+            // given
+            IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is);
+            ITable expectedTable = DefaultColumnFilter
+                .excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns);
 
-            connection.createStatement().executeUpdate(
-                "INSERT INTO ITEMS (title, price, produced)  VALUES('Necklace', 199.99, now())");
-
-            final IDataSet databaseDataSet = tester.getConnection().createDataSet();
-            final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(
-                databaseDataSet.getTable("ITEMS"), excludedColumns);
+            // when
+            connection.createStatement()
+                .executeUpdate("INSERT INTO ITEMS (title, price, produced)  VALUES('Necklace', 199.99, now())");
 
+            // then
+            IDataSet databaseDataSet = tester.getConnection().createDataSet();
+            ITable actualTable = DefaultColumnFilter
+                .excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns);
             Assertion.assertEquals(expectedTable, actualTable);
         }
     }
 
     @Test
     public void givenDataSet_whenDelete_thenItemIsRemoved() throws Exception {
-        final Connection connection = tester.getConnection().getConnection();
-
-        try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) {
+        try (InputStream is = OldSchoolDbUnitTest.class.getClassLoader()
+            .getResourceAsStream("dbunit/items_exp_delete.xml")) {
+            // given
             ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS");
 
+            // when
             connection.createStatement().executeUpdate("delete from ITEMS where id = 2");
 
-            final IDataSet databaseDataSet = tester.getConnection().createDataSet();
+            // then
+            IDataSet databaseDataSet = tester.getConnection().createDataSet();
             ITable actualTable = databaseDataSet.getTable("ITEMS");
-
             assertEquals(expectedTable, actualTable);
         }
     }
 
     @Test
-    public void givenDataSet_whenDelete_thenItemIsRemovedAndResultsEqualIfProducedIsIgnored() throws Exception {
-        final Connection connection = tester.getConnection().getConnection();
-
-        try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) {
-            final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS");
+    public void givenDataSet_whenProductIgnoredAndDelete_thenItemIsRemoved() throws Exception {
+        try (InputStream is = OldSchoolDbUnitTest.class.getClassLoader()
+            .getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) {
+            // given
+            ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS");
 
+            // when
             connection.createStatement().executeUpdate("delete from ITEMS where id = 2");
 
-            final IDataSet databaseDataSet = tester.getConnection().createDataSet();
+            // then
+            IDataSet databaseDataSet = tester.getConnection().createDataSet();
             ITable actualTable = databaseDataSet.getTable("ITEMS");
             actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" });
-
             assertEquals(expectedTable, actualTable);
         }
     }
 
     @Test
     public void givenDataSet_whenUpdate_thenItemHasNewName() throws Exception {
-        final Connection connection = tester.getConnection().getConnection();
-
-        try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) {
-            final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS");
+        try (InputStream is = OldSchoolDbUnitTest.class.getClassLoader()
+            .getResourceAsStream("dbunit/items_exp_rename.xml")) {
+            // given
+            ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS");
 
+            // when
             connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1");
 
-            final IDataSet databaseDataSet = tester.getConnection().createDataSet();
+            // then
+            IDataSet databaseDataSet = tester.getConnection().createDataSet();
             ITable actualTable = databaseDataSet.getTable("ITEMS");
-
             assertEquals(expectedTable, actualTable);
         }
     }
 
     @Test
     public void givenDataSet_whenUpdateWithNoProduced_thenItemHasNewName() throws Exception {
-        final Connection connection = tester.getConnection().getConnection();
-
-        try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) {
+        try (InputStream is = OldSchoolDbUnitTest.class.getClassLoader()
+            .getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) {
+            // given
             ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS");
             expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[] { "produced" });
 
+            // when
             connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1");
 
-            final IDataSet databaseDataSet = tester.getConnection().createDataSet();
+            // then
+            IDataSet databaseDataSet = tester.getConnection().createDataSet();
             ITable actualTable = databaseDataSet.getTable("ITEMS");
             actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" });
             assertEquals(expectedTable, actualTable);

From 58d39140021958d0404fd2d8824ceee5c0aa78bf Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 14:57:01 +0800
Subject: [PATCH 257/404] Update README.md

---
 spring-boot-modules/spring-boot-logging-log4j2/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-logging-log4j2/README.md b/spring-boot-modules/spring-boot-logging-log4j2/README.md
index 76029caef8..aa6bb9b6e1 100644
--- a/spring-boot-modules/spring-boot-logging-log4j2/README.md
+++ b/spring-boot-modules/spring-boot-logging-log4j2/README.md
@@ -5,4 +5,4 @@ This module contains articles about logging in Spring Boot projects with Log4j 2
 ### Relevant Articles: 
 - [Logging in Spring Boot](https://www.baeldung.com/spring-boot-logging)
 - [Logging to Graylog with Spring Boot](https://www.baeldung.com/graylog-with-spring-boot)
-
+- [Log Groups in Spring Boot 2.1](https://www.baeldung.com/spring-boot-log-groups)

From 22f622521ff1c0565438f5ef0cb61d400c9cb0ba Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Tue, 12 May 2020 12:34:28 +0530
Subject: [PATCH 258/404] JAVA-945: Migrate spring-rest-hal-browser to
 parent-boot-2

---
 spring-rest-hal-browser/pom.xml | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/spring-rest-hal-browser/pom.xml b/spring-rest-hal-browser/pom.xml
index adef8bf2b0..32a0b52875 100644
--- a/spring-rest-hal-browser/pom.xml
+++ b/spring-rest-hal-browser/pom.xml
@@ -9,9 +9,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
@@ -19,25 +19,26 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
-            <version>${spring-boot.version}</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
-            <version>${spring-boot.version}</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-rest-hal-browser -->
         <dependency>
             <groupId>org.springframework.data</groupId>
             <artifactId>spring-data-rest-hal-browser</artifactId>
-            <version>${spring-data.version}</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
         <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
-            <version>${h2.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy-dep</artifactId>
+            <version>${bytebuddy.version}</version>
         </dependency>
     </dependencies>
 
@@ -55,9 +56,7 @@
     </build>
 
     <properties>
-        <spring-boot.version>2.0.3.RELEASE</spring-boot.version>
-        <spring-data.version>3.0.8.RELEASE</spring-data.version>
-        <h2.version>1.4.197</h2.version>
+        <bytebuddy.version>1.10.10</bytebuddy.version>
         <source.version>1.8</source.version>
         <target.version>1.8</target.version>
     </properties>

From 77ebd0332e41dbf8eaba8ba23f13fc35f6ea0af1 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:08:21 +0800
Subject: [PATCH 259/404] Update README.md

---
 persistence-modules/spring-persistence-simple-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/spring-persistence-simple-2/README.md b/persistence-modules/spring-persistence-simple-2/README.md
index a6408df8f2..70eab26d45 100644
--- a/persistence-modules/spring-persistence-simple-2/README.md
+++ b/persistence-modules/spring-persistence-simple-2/README.md
@@ -1,3 +1,4 @@
 ### Relevant Articles:
 
 - [Spring JdbcTemplate Unit Testing](https://www.baeldung.com/spring-jdbctemplate-testing)
+- [Using a List of Values in a JdbcTemplate IN Clause](https://www.baeldung.com/spring-jdbctemplate-in-list)

From 2d71bb462eac2eadb93627213d58038f07c21bfc Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:11:57 +0800
Subject: [PATCH 260/404] Update README.md

---
 core-groovy-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md
index 95a00a1f5b..9f81ac6c16 100644
--- a/core-groovy-2/README.md
+++ b/core-groovy-2/README.md
@@ -13,4 +13,5 @@ This module contains articles about core Groovy concepts
 - [Metaprogramming in Groovy](https://www.baeldung.com/groovy-metaprogramming)
 - [A Quick Guide to Working with Web Services in Groovy](https://www.baeldung.com/groovy-web-services)
 - [Categories in Groovy](https://www.baeldung.com/groovy-categories)
+- [How to Determine the Data Type in Groovy](https://www.baeldung.com/groovy-determine-data-type)
 - [[<-- Prev]](/core-groovy)

From 4cd668aa49d616a68e3e97638cffb6ad75cbd55a Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:15:53 +0800
Subject: [PATCH 261/404] Update README.md

---
 core-java-modules/core-java-concurrency-advanced-3/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-concurrency-advanced-3/README.md b/core-java-modules/core-java-concurrency-advanced-3/README.md
index b11cde5158..dfd264116c 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/README.md
+++ b/core-java-modules/core-java-concurrency-advanced-3/README.md
@@ -11,4 +11,5 @@ This module contains articles about advanced topics about multithreading with co
 - [Guide to Work Stealing in Java](https://www.baeldung.com/java-work-stealing)
 - [Asynchronous Programming in Java](https://www.baeldung.com/java-asynchronous-programming)
 - [Java Thread Deadlock and Livelock](https://www.baeldung.com/java-deadlock-livelock)
+- [Guide to AtomicStampedReference in Java](https://www.baeldung.com/java-atomicstampedreference)
 - [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2)

From f5a8cdc17f1f4f6729581970d65d2d9cd0948698 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:24:15 +0800
Subject: [PATCH 262/404] Update README.md

---
 spring-core-4/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-core-4/README.md b/spring-core-4/README.md
index f882c77179..35d2711ad8 100644
--- a/spring-core-4/README.md
+++ b/spring-core-4/README.md
@@ -4,4 +4,5 @@ This module contains articles about core Spring functionality
 
 ## Relevant Articles:
 
+- [Creating Spring Beans Through Factory Methods](https://www.baeldung.com/spring-beans-factory-methods)
 - More articles: [[<-- prev]](/spring-core-3)

From 3cc4203f145505735f4c54154ad894f20ff0bf89 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:27:32 +0800
Subject: [PATCH 263/404] Create README.md

---
 spring-boot-groovy/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 spring-boot-groovy/README.md

diff --git a/spring-boot-groovy/README.md b/spring-boot-groovy/README.md
new file mode 100644
index 0000000000..d2472a11d0
--- /dev/null
+++ b/spring-boot-groovy/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Building a Simple Web Application with Spring Boot and Groovy](https://www.baeldung.com/spring-boot-groovy-web-app)

From 52d6f8c19a21be4aa0bef3ab3fe2cb602adfd17b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:29:06 +0800
Subject: [PATCH 264/404] Create README.md

---
 kaniko/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 kaniko/README.md

diff --git a/kaniko/README.md b/kaniko/README.md
new file mode 100644
index 0000000000..a69a3cb683
--- /dev/null
+++ b/kaniko/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [An Introduction to Kaniko](https://www.baeldung.com/ops/kaniko)

From c6a47576997e94ca582b91cc4fbc88ce8eae323b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:32:03 +0800
Subject: [PATCH 265/404] Update README.md

---
 spring-security-modules/spring-security-mvc-boot-2/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/spring-security-modules/spring-security-mvc-boot-2/README.md b/spring-security-modules/spring-security-mvc-boot-2/README.md
index 3c95086d21..7c53d03698 100644
--- a/spring-security-modules/spring-security-mvc-boot-2/README.md
+++ b/spring-security-modules/spring-security-mvc-boot-2/README.md
@@ -10,4 +10,5 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com
 - [Multiple Authentication Providers in Spring Security](https://www.baeldung.com/spring-security-multiple-auth-providers)
 - [Two Login Pages with Spring Security](https://www.baeldung.com/spring-security-two-login-pages)
 - [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate)
-- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
\ No newline at end of file
+- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
+- [Spring Security Custom Logout Handler](https://www.baeldung.com/spring-security-custom-logout-handler)

From 47cbf77ccd60b8e8049e0912ee29ad17072e6ed6 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:34:16 +0800
Subject: [PATCH 266/404] Update README.md

---
 libraries-data-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md
index f992186bd9..5e85cd9ab9 100644
--- a/libraries-data-2/README.md
+++ b/libraries-data-2/README.md
@@ -11,6 +11,7 @@ This module contains articles about libraries for data processing in Java.
 - [Guide to JMapper](https://www.baeldung.com/jmapper)
 - [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
 - [Intro to Derive4J](https://www.baeldung.com/derive4j)
+- [Java-R Integration](https://www.baeldung.com/java-r-integration)
 More articles: [[<-- prev]](/../libraries-data)
 
 ##### Building the project

From 5021857d060a904e2ba9983ad36793df0fd5c6ab Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:34:53 +0800
Subject: [PATCH 267/404] Update README.md

---
 libraries-data-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md
index 5e85cd9ab9..71db902877 100644
--- a/libraries-data-2/README.md
+++ b/libraries-data-2/README.md
@@ -12,6 +12,7 @@ This module contains articles about libraries for data processing in Java.
 - [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
 - [Intro to Derive4J](https://www.baeldung.com/derive4j)
 - [Java-R Integration](https://www.baeldung.com/java-r-integration)
+
 More articles: [[<-- prev]](/../libraries-data)
 
 ##### Building the project

From 8c11a0825880462821a28f59a4d23efc209fbfba Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:36:47 +0800
Subject: [PATCH 268/404] Update README.md

---
 persistence-modules/java-jpa-2/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/java-jpa-2/README.md b/persistence-modules/java-jpa-2/README.md
index 9d46c0d814..4b822c4782 100644
--- a/persistence-modules/java-jpa-2/README.md
+++ b/persistence-modules/java-jpa-2/README.md
@@ -12,4 +12,5 @@ This module contains articles about the Java Persistence API (JPA) in Java.
 - [Combining JPA And/Or Criteria Predicates](https://www.baeldung.com/jpa-and-or-criteria-predicates)
 - [JPA Annotation for the PostgreSQL TEXT Type](https://www.baeldung.com/jpa-annotation-postgresql-text-type)
 - [Mapping a Single Entity to Multiple Tables in JPA](https://www.baeldung.com/jpa-mapping-single-entity-to-multiple-tables)
+- [Constructing a JPA Query Between Unrelated Entities](https://www.baeldung.com/jpa-query-unrelated-entities)
 - More articles: [[<-- prev]](/java-jpa)

From d880f58ea29a4ba6cffb12d7a85f380bd8b68bdf Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:37:25 +0800
Subject: [PATCH 269/404] Update README.md

---
 libraries-data-2/README.md | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md
index 71db902877..ce7a1680d1 100644
--- a/libraries-data-2/README.md
+++ b/libraries-data-2/README.md
@@ -12,8 +12,7 @@ This module contains articles about libraries for data processing in Java.
 - [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
 - [Intro to Derive4J](https://www.baeldung.com/derive4j)
 - [Java-R Integration](https://www.baeldung.com/java-r-integration)
-
-More articles: [[<-- prev]](/../libraries-data)
+- More articles: [[<-- prev]](/../libraries-data)
 
 ##### Building the project
 You can build the project from the command line using: *mvn clean install*, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: *target/generated-sources/annotations* to the project build path in your IDE. 

From 6eb847707df933fe482b109aec3d0378fa244bdd Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:39:16 +0800
Subject: [PATCH 270/404] Update README.md

---
 jee-7/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/jee-7/README.md b/jee-7/README.md
index adaee67d74..88359a81ec 100644
--- a/jee-7/README.md
+++ b/jee-7/README.md
@@ -11,3 +11,4 @@ This module contains articles about JEE 7.
 - [Introduction to Testing with Arquillian](https://www.baeldung.com/arquillian)
 - [Java EE 7 Batch Processing](https://www.baeldung.com/java-ee-7-batch-processing)
 - [The Difference Between CDI and EJB Singleton](https://www.baeldung.com/jee-cdi-vs-ejb-singleton)
+- [Invoking a SOAP Web Service in Java](https://www.baeldung.com/java-soap-web-service)

From b13fdd3291f635f37560be2e5a656e3ca1c56edb Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:41:00 +0800
Subject: [PATCH 271/404] Update README.md

---
 spring-caching/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-caching/README.md b/spring-caching/README.md
index 3efbfe3eaa..52ddc4f3eb 100644
--- a/spring-caching/README.md
+++ b/spring-caching/README.md
@@ -3,3 +3,4 @@
 - [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial)
 - [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator)
 - [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache)
+- [Using Multiple Cache Managers in Spring](https://www.baeldung.com/spring-multiple-cache-managers)

From b8523162b16b4600e0213e849f9cf28d90f45639 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:47:23 +0800
Subject: [PATCH 272/404] Update README.md

---
 spring-soap/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-soap/README.md b/spring-soap/README.md
index c23f0bc6f0..ca5f58c67e 100644
--- a/spring-soap/README.md
+++ b/spring-soap/README.md
@@ -5,3 +5,4 @@ This module contains articles about SOAP APIs with Spring
 ### Relevant articles:
 
 - [Creating a SOAP Web Service with Spring](https://www.baeldung.com/spring-boot-soap-web-service)
+- [Invoking a SOAP Web Service in Spring](https://www.baeldung.com/spring-soap-web-service)

From b87db9d91fcc347391102f9a689fe8a66bfcb4d1 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 15:51:53 +0800
Subject: [PATCH 273/404] Update README.md

---
 java-collections-conversions-2/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/java-collections-conversions-2/README.md b/java-collections-conversions-2/README.md
index 761e56253e..11dddadc5c 100644
--- a/java-collections-conversions-2/README.md
+++ b/java-collections-conversions-2/README.md
@@ -4,4 +4,5 @@ This module contains articles about conversions among Collection types and array
 
 ### Relevant Articles: 
 - [Array to String Conversions](https://www.baeldung.com/java-array-to-string)
-- More articles: [[<-- prev]](../java-collections-conversions)
\ No newline at end of file
+- [Mapping Lists with ModelMapper](https://www.baeldung.com/java-modelmapper-lists)
+- More articles: [[<-- prev]](../java-collections-conversions)

From fa06216e3463319eb0e975b1d5e9858bd9a22141 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:09:08 +0800
Subject: [PATCH 274/404] Update README.md

---
 core-kotlin-modules/core-kotlin-collections/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-kotlin-modules/core-kotlin-collections/README.md b/core-kotlin-modules/core-kotlin-collections/README.md
index f0da2b4cfd..66f15e7419 100644
--- a/core-kotlin-modules/core-kotlin-collections/README.md
+++ b/core-kotlin-modules/core-kotlin-collections/README.md
@@ -9,3 +9,4 @@ This module contains articles about core Kotlin collections.
 - [Converting a List to Map in Kotlin](https://www.baeldung.com/kotlin-list-to-map)
 - [Filtering Kotlin Collections](https://www.baeldung.com/kotlin-filter-collection)
 - [Collection Transformations in Kotlin](https://www.baeldung.com/kotlin-collection-transformations)
+- [Difference between fold and reduce in Kotlin](https://www.baeldung.com/kotlin/fold-vs-reduce)

From b9cecfca592d2efde6b75f4861ee1d16ce7435c2 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:34:14 +0800
Subject: [PATCH 275/404] Update README.md

---
 terraform/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/terraform/README.md b/terraform/README.md
index 19abd2ff20..b2a9539727 100644
--- a/terraform/README.md
+++ b/terraform/README.md
@@ -1,3 +1,4 @@
 ### Relevant Articles:
 
 - [Introduction to Terraform](https://www.baeldung.com/ops/terraform-intro)
+- [Best Practices When Using Terraform](https://www.baeldung.com/ops/terraform-best-practices)

From 24a5b887170fc94172bf276d3802baffd323eda3 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:36:44 +0800
Subject: [PATCH 276/404] Update README.md

---
 spring-5-security/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-5-security/README.md b/spring-5-security/README.md
index 07f2d48b7f..5a6d2d73de 100644
--- a/spring-5-security/README.md
+++ b/spring-5-security/README.md
@@ -9,3 +9,4 @@ This module contains articles about Spring Security 5
 - [New Password Storage In Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage)
 - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder)
 - [Guide to the AuthenticationManagerResolver in Spring Security](https://www.baeldung.com/spring-security-authenticationmanagerresolver)
+- [Disable Security for a Profile in Spring Boot](https://www.baeldung.com/spring-security-disable-profile)

From 8fd50aea174ef1e5911b6a5ea41dc82fb8638e31 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:38:58 +0800
Subject: [PATCH 277/404] Update README.md

---
 patterns/solid/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/patterns/solid/README.md b/patterns/solid/README.md
index ddd2f78b7e..cae346e3c9 100644
--- a/patterns/solid/README.md
+++ b/patterns/solid/README.md
@@ -1,5 +1,5 @@
 ### Relevant Articles:
 
 - [A Solid Guide to Solid Principles](https://www.baeldung.com/solid-principles)
-
+- [Single Responsibility Principle in Java](https://www.baeldung.com/java-single-responsibility-principle)
 

From 73a35a047ee87088d451f5a0d8bc2a7a0936600b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:41:18 +0800
Subject: [PATCH 278/404] Create README.md

---
 gradle/gradle-employee-app/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 gradle/gradle-employee-app/README.md

diff --git a/gradle/gradle-employee-app/README.md b/gradle/gradle-employee-app/README.md
new file mode 100644
index 0000000000..1bf7c5e8dd
--- /dev/null
+++ b/gradle/gradle-employee-app/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Building a Java Application With Gradle](https://www.baeldung.com/gradle-building-a-java-app)

From 7eab1879e31ced15352e90ae91e7d099951c75e5 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:42:44 +0800
Subject: [PATCH 279/404] Update README.md

---
 testing-modules/assertion-libraries/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/testing-modules/assertion-libraries/README.md b/testing-modules/assertion-libraries/README.md
index d69457fdeb..ca4cc86f7e 100644
--- a/testing-modules/assertion-libraries/README.md
+++ b/testing-modules/assertion-libraries/README.md
@@ -10,4 +10,4 @@
 - [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion)
 - [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions)
 - [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion)
-
+- [Asserting Log Messages With JUnit](https://www.baeldung.com/junit-asserting-logs)

From ef9bd53b98c2739b6a842137551a5c808949d7bd Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:43:58 +0800
Subject: [PATCH 280/404] Update README.md

---
 jsoup/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/jsoup/README.md b/jsoup/README.md
index 271d04194d..690afe3099 100644
--- a/jsoup/README.md
+++ b/jsoup/README.md
@@ -4,6 +4,7 @@ This module contains articles about jsoup.
 
 ### Relevant Articles: 
 - [Parsing HTML in Java with Jsoup](https://www.baeldung.com/java-with-jsoup)
+- [How to add proxy support to Jsoup?](https://www.baeldung.com/java-jsoup-proxy)
 
 ### Build the Project
 

From 8f0a779211007c2d60124417bdefe62637aa2985 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:46:29 +0800
Subject: [PATCH 281/404] Update README.md

---
 persistence-modules/spring-data-jpa-5/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/persistence-modules/spring-data-jpa-5/README.md b/persistence-modules/spring-data-jpa-5/README.md
index e8f83654df..656e2e5e6b 100644
--- a/persistence-modules/spring-data-jpa-5/README.md
+++ b/persistence-modules/spring-data-jpa-5/README.md
@@ -1,6 +1,6 @@
 ### Relevant Articles: 
 
-- [Spring JPA @Embedded and @EmbeddedId](TBD)
+- [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters)
 
 ### Eclipse Config 
 After importing the project into Eclipse, you may see the following error:  

From 1409c871c6114f99fb86a60042ded756ef8bde92 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:50:35 +0800
Subject: [PATCH 282/404] Update README.md

---
 persistence-modules/spring-data-jpa-5/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/spring-data-jpa-5/README.md b/persistence-modules/spring-data-jpa-5/README.md
index 656e2e5e6b..fa29c82bac 100644
--- a/persistence-modules/spring-data-jpa-5/README.md
+++ b/persistence-modules/spring-data-jpa-5/README.md
@@ -1,6 +1,7 @@
 ### Relevant Articles: 
 
 - [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters)
+- [Generate Database Schema with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-generate-db-schema)
 
 ### Eclipse Config 
 After importing the project into Eclipse, you may see the following error:  

From 6db54f0321535a7166cc2e2c6d305e46e68d55aa Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:53:32 +0800
Subject: [PATCH 283/404] Update README.md

---
 spring-5-security/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-5-security/README.md b/spring-5-security/README.md
index 5a6d2d73de..764d726ff8 100644
--- a/spring-5-security/README.md
+++ b/spring-5-security/README.md
@@ -10,3 +10,4 @@ This module contains articles about Spring Security 5
 - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder)
 - [Guide to the AuthenticationManagerResolver in Spring Security](https://www.baeldung.com/spring-security-authenticationmanagerresolver)
 - [Disable Security for a Profile in Spring Boot](https://www.baeldung.com/spring-security-disable-profile)
+- [Manual Logout With Spring Security](https://www.baeldung.com/spring-security-manual-logout)

From 26a7295fc22fb76e2c9a257592601806f7eafc88 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:54:56 +0800
Subject: [PATCH 284/404] Update README.md

---
 maven-all/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/maven-all/README.md b/maven-all/README.md
index b20d944b14..b448be2cd0 100644
--- a/maven-all/README.md
+++ b/maven-all/README.md
@@ -5,3 +5,4 @@ This module contains articles about Apache Maven. Please refer to its submodules
 ### Relevant Articles
 
 - [Apache Maven Tutorial](https://www.baeldung.com/maven)
+- [Find Unused Maven Dependencies](https://www.baeldung.com/maven-unused-dependencies)

From 6786c93bc0f97efc20b546e48c48256e55538683 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:56:57 +0800
Subject: [PATCH 285/404] Update README.md

---
 persistence-modules/redis/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/persistence-modules/redis/README.md b/persistence-modules/redis/README.md
index 668b8d33f8..71d009241a 100644
--- a/persistence-modules/redis/README.md
+++ b/persistence-modules/redis/README.md
@@ -3,3 +3,4 @@
 - [A Guide to Redis with Redisson](http://www.baeldung.com/redis-redisson)
 - [Introduction to Lettuce – the Java Redis Client](https://www.baeldung.com/java-redis-lettuce)
 - [List All Available Redis Keys](https://www.baeldung.com/redis-list-available-keys)
+- [Spring Data Redis’s Property-Based Configuration](https://www.baeldung.com/spring-data-redis-properties)

From 376046bacf3d3b957cc0a7f20d1aa59c3812f891 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:58:13 +0800
Subject: [PATCH 286/404] Update README.md

---
 spring-cloud/spring-cloud-gateway/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-cloud/spring-cloud-gateway/README.md b/spring-cloud/spring-cloud-gateway/README.md
index 9c8e0d443a..90e81fe9a2 100644
--- a/spring-cloud/spring-cloud-gateway/README.md
+++ b/spring-cloud/spring-cloud-gateway/README.md
@@ -6,3 +6,4 @@ This module contains articles about Spring Cloud Gateway
 - [Exploring the new Spring Cloud Gateway](http://www.baeldung.com/spring-cloud-gateway)
 - [Writing Custom Spring Cloud Gateway Filters](https://www.baeldung.com/spring-cloud-custom-gateway-filters)
 - [Spring Cloud Gateway Routing Predicate Factories](https://www.baeldung.com/spring-cloud-gateway-routing-predicate-factories)
+- [Spring Cloud Gateway WebFilter Factories](https://www.baeldung.com/spring-cloud-gateway-webfilter-factories)

From 2d9867bc3b752c6c2568f1103a49c6d2770452a2 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 16:59:31 +0800
Subject: [PATCH 287/404] Update README.md

---
 spring-core-4/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-core-4/README.md b/spring-core-4/README.md
index 35d2711ad8..592f4cd011 100644
--- a/spring-core-4/README.md
+++ b/spring-core-4/README.md
@@ -5,4 +5,5 @@ This module contains articles about core Spring functionality
 ## Relevant Articles:
 
 - [Creating Spring Beans Through Factory Methods](https://www.baeldung.com/spring-beans-factory-methods)
+- [How to dynamically Autowire a Bean in Spring](https://www.baeldung.com/spring-dynamic-autowire)
 - More articles: [[<-- prev]](/spring-core-3)

From e6dd93f4d14a71fb6b1eeb19e2af65363a8ccae8 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 17:02:06 +0800
Subject: [PATCH 288/404] Create README.md

---
 spring-security-modules/spring-security-okta/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 spring-security-modules/spring-security-okta/README.md

diff --git a/spring-security-modules/spring-security-okta/README.md b/spring-security-modules/spring-security-okta/README.md
new file mode 100644
index 0000000000..6ea4817e19
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Spring Security With Okta](https://www.baeldung.com/spring-security-okta)

From 32925d61c368877f40ff89ad1a3678489c3ac29a Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 17:06:47 +0800
Subject: [PATCH 289/404] Update README.md

---
 core-java-modules/core-java-regex/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-regex/README.md b/core-java-modules/core-java-regex/README.md
index 6fdea9f2ca..8830af2c2d 100644
--- a/core-java-modules/core-java-regex/README.md
+++ b/core-java-modules/core-java-regex/README.md
@@ -10,3 +10,4 @@
 - [Difference Between Java Matcher find() and matches()](https://www.baeldung.com/java-matcher-find-vs-matches)
 - [How to Use Regular Expressions to Replace Tokens in Strings](https://www.baeldung.com/java-regex-token-replacement)
 - [Regular Expressions \s and \s+ in Java](https://www.baeldung.com/java-regex-s-splus)
+- [Validate Phone Numbers With Java Regex](https://www.baeldung.com/java-regex-validate-phone-numbers)

From 3a1fa055d22ae33414587f3b11746d88b517f0e2 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Tue, 12 May 2020 17:10:13 +0800
Subject: [PATCH 290/404] Update README.md

---
 core-java-modules/core-java-14/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-14/README.md b/core-java-modules/core-java-14/README.md
index 13bb468b30..dc80800054 100644
--- a/core-java-modules/core-java-14/README.md
+++ b/core-java-modules/core-java-14/README.md
@@ -8,3 +8,4 @@ This module contains articles about Java 14.
 - [Java Text Blocks](https://www.baeldung.com/java-text-blocks)
 - [Pattern Matching for instanceof in Java 14](https://www.baeldung.com/java-pattern-matching-instanceof)
 - [Helpful NullPointerExceptions in Java 14](https://www.baeldung.com/java-14-nullpointerexception)
+- [Foreign Memory Access API in Java 14](https://www.baeldung.com/java-foreign-memory-access)

From 20843c7f224fe68e772b0518532c881fff483483 Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Fri, 24 Apr 2020 01:56:25 +0200
Subject: [PATCH 291/404] BAEL-3863 Introduction to Finagle

---
 finagle/README.md                             |  7 +++++
 finagle/pom.xml                               | 30 +++++++++++++++++++
 .../java/com/baeldung/finagle/Client.java     | 24 +++++++++++++++
 .../com/baeldung/finagle/GreetingService.java | 18 +++++++++++
 .../java/com/baeldung/finagle/LogFilter.java  | 17 +++++++++++
 .../java/com/baeldung/finagle/Server.java     | 15 ++++++++++
 finagle/src/main/resources/logback.xml        | 13 ++++++++
 .../src/main/resources/twitter4j.properties   |  4 +++
 8 files changed, 128 insertions(+)
 create mode 100644 finagle/README.md
 create mode 100644 finagle/pom.xml
 create mode 100644 finagle/src/main/java/com/baeldung/finagle/Client.java
 create mode 100644 finagle/src/main/java/com/baeldung/finagle/GreetingService.java
 create mode 100644 finagle/src/main/java/com/baeldung/finagle/LogFilter.java
 create mode 100644 finagle/src/main/java/com/baeldung/finagle/Server.java
 create mode 100644 finagle/src/main/resources/logback.xml
 create mode 100644 finagle/src/main/resources/twitter4j.properties

diff --git a/finagle/README.md b/finagle/README.md
new file mode 100644
index 0000000000..d16afdc10d
--- /dev/null
+++ b/finagle/README.md
@@ -0,0 +1,7 @@
+## Finagle
+
+This module contains articles about Finagle and associated libraries.
+
+### Relevant articles
+
+- [Introduction to Finagle](https://www.baeldung.com/introduction-to-finagle)
diff --git a/finagle/pom.xml b/finagle/pom.xml
new file mode 100644
index 0000000000..f1dc932c13
--- /dev/null
+++ b/finagle/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>Finagle</artifactId>
+    <name>Finagle</name>
+    <packaging>jar</packaging>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-modules</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+      <dependency>
+        <groupId>com.twitter</groupId>
+        <artifactId>finagle-core_2.13</artifactId>
+        <version>20.4.0</version>
+      </dependency>
+      <dependency>
+          <groupId>com.twitter</groupId>
+          <artifactId>finagle-http_2.13</artifactId>
+          <version>20.4.0</version>
+      </dependency>
+
+    </dependencies>
+
+
+</project>
diff --git a/finagle/src/main/java/com/baeldung/finagle/Client.java b/finagle/src/main/java/com/baeldung/finagle/Client.java
new file mode 100644
index 0000000000..a881f1c37c
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/Client.java
@@ -0,0 +1,24 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Http;
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Method;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Await;
+import com.twitter.util.Future;
+import scala.runtime.BoxedUnit;
+
+public class Client {
+    public static void main(String[] args) throws Exception {
+        Service<Request, Response> service = new LogFilter().andThen(Http.newService(":8080"));
+        Request request = Request.apply(Method.Get(), "/?name=John");
+        request.host("localhost");
+        Future<Response> response = service.apply(request);
+        Await.result(response
+                .onSuccess(r -> {
+                    System.out.println(r.getContentString());
+                    return BoxedUnit.UNIT;
+                }));
+    }
+}
diff --git a/finagle/src/main/java/com/baeldung/finagle/GreetingService.java b/finagle/src/main/java/com/baeldung/finagle/GreetingService.java
new file mode 100644
index 0000000000..c795724192
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/GreetingService.java
@@ -0,0 +1,18 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.finagle.http.Status;
+import com.twitter.io.Buf;
+import com.twitter.io.Reader;
+import com.twitter.util.Future;
+
+public class GreetingService extends Service<Request, Response> {
+    @Override
+    public Future<Response> apply(Request request) {
+        String greeting = "Hello " + request.getParam("name");
+        Reader<Buf> reader = Reader.fromBuf(new Buf.ByteArray(greeting.getBytes(), 0, greeting.length()));
+        return Future.value(Response.apply(request.version(), Status.Ok(), reader));
+    }
+}
diff --git a/finagle/src/main/java/com/baeldung/finagle/LogFilter.java b/finagle/src/main/java/com/baeldung/finagle/LogFilter.java
new file mode 100644
index 0000000000..d381456cfe
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/LogFilter.java
@@ -0,0 +1,17 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Service;
+import com.twitter.finagle.SimpleFilter;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Future;
+
+public class LogFilter extends SimpleFilter<Request, Response> {
+    @Override
+    public Future<Response> apply(Request request, Service<Request, Response> service) {
+        System.out.println("Request host:" + request.host().getOrElse(() -> ""));
+        System.out.println("Request params:");
+        request.getParams().forEach(entry -> System.out.println("\t" + entry.getKey() + " : " + entry.getValue()));
+        return service.apply(request);
+    }
+}
diff --git a/finagle/src/main/java/com/baeldung/finagle/Server.java b/finagle/src/main/java/com/baeldung/finagle/Server.java
new file mode 100644
index 0000000000..8a9c9be192
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/Server.java
@@ -0,0 +1,15 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Http;
+import com.twitter.finagle.ListeningServer;
+import com.twitter.finagle.Service;
+import com.twitter.util.Await;
+import com.twitter.util.TimeoutException;
+
+public class Server {
+    public static void main(String[] args) throws TimeoutException, InterruptedException {
+        Service service = new LogFilter().andThen(new GreetingService());
+        ListeningServer server = Http.serve(":8080", service);
+        Await.ready(server);
+    }
+}
diff --git a/finagle/src/main/resources/logback.xml b/finagle/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/finagle/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+            </pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/finagle/src/main/resources/twitter4j.properties b/finagle/src/main/resources/twitter4j.properties
new file mode 100644
index 0000000000..ee11dc62a1
--- /dev/null
+++ b/finagle/src/main/resources/twitter4j.properties
@@ -0,0 +1,4 @@
+oauth.consumerKey=//TODO
+oauth.consumerSecret=//TODO
+oauth.accessToken=//TODO
+oauth.accessTokenSecret=//TODO

From 33edef47e18c16e03ce056af609dc984d6f4a566 Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Fri, 24 Apr 2020 02:05:49 +0200
Subject: [PATCH 292/404] BAEL-3863 add Finagle module to root pom.xml

---
 pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pom.xml b/pom.xml
index 34703c6f73..813a42c93d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -418,6 +418,7 @@
                 <module>ethereum</module>
 
                 <module>feign</module>
+                <module>finagle</module>
                 <module>flyway-cdi-extension</module>
 
                 <module>geotools</module>

From ff684f13b6d4d27f063d0e912ca9e6b0151acb0e Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Fri, 24 Apr 2020 20:52:23 +0200
Subject: [PATCH 293/404] BAEL-3863 moved Finagle package to libraries-rpc,
 added test

---
 {finagle => libraries-rpc}/README.md          |  0
 {finagle => libraries-rpc}/pom.xml            |  4 +-
 .../com/baeldung/rpc}/finagle/Client.java     |  2 +-
 .../rpc}/finagle/GreetingService.java         |  2 +-
 .../com/baeldung/rpc}/finagle/LogFilter.java  |  2 +-
 .../com/baeldung/rpc}/finagle/Server.java     |  2 +-
 .../src/main/resources/logback.xml            |  0
 .../src/main/resources/twitter4j.properties   |  0
 .../rpc/finagle/ClientServerTest.java         | 40 +++++++++++++++++++
 pom.xml                                       |  2 +-
 10 files changed, 47 insertions(+), 7 deletions(-)
 rename {finagle => libraries-rpc}/README.md (100%)
 rename {finagle => libraries-rpc}/pom.xml (92%)
 rename {finagle/src/main/java/com/baeldung => libraries-rpc/src/main/java/com/baeldung/rpc}/finagle/Client.java (96%)
 rename {finagle/src/main/java/com/baeldung => libraries-rpc/src/main/java/com/baeldung/rpc}/finagle/GreetingService.java (95%)
 rename {finagle/src/main/java/com/baeldung => libraries-rpc/src/main/java/com/baeldung/rpc}/finagle/LogFilter.java (95%)
 rename {finagle/src/main/java/com/baeldung => libraries-rpc/src/main/java/com/baeldung/rpc}/finagle/Server.java (93%)
 rename {finagle => libraries-rpc}/src/main/resources/logback.xml (100%)
 rename {finagle => libraries-rpc}/src/main/resources/twitter4j.properties (100%)
 create mode 100644 libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java

diff --git a/finagle/README.md b/libraries-rpc/README.md
similarity index 100%
rename from finagle/README.md
rename to libraries-rpc/README.md
diff --git a/finagle/pom.xml b/libraries-rpc/pom.xml
similarity index 92%
rename from finagle/pom.xml
rename to libraries-rpc/pom.xml
index f1dc932c13..145693cac1 100644
--- a/finagle/pom.xml
+++ b/libraries-rpc/pom.xml
@@ -2,8 +2,8 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>Finagle</artifactId>
-    <name>Finagle</name>
+    <artifactId>libraries-rpc</artifactId>
+    <name>libraries-rpc</name>
     <packaging>jar</packaging>
 
     <parent>
diff --git a/finagle/src/main/java/com/baeldung/finagle/Client.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java
similarity index 96%
rename from finagle/src/main/java/com/baeldung/finagle/Client.java
rename to libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java
index a881f1c37c..989c79f302 100644
--- a/finagle/src/main/java/com/baeldung/finagle/Client.java
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java
@@ -1,4 +1,4 @@
-package com.baeldung.finagle;
+package com.baeldung.rpc.finagle;
 
 import com.twitter.finagle.Http;
 import com.twitter.finagle.Service;
diff --git a/finagle/src/main/java/com/baeldung/finagle/GreetingService.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/GreetingService.java
similarity index 95%
rename from finagle/src/main/java/com/baeldung/finagle/GreetingService.java
rename to libraries-rpc/src/main/java/com/baeldung/rpc/finagle/GreetingService.java
index c795724192..7f3d741f94 100644
--- a/finagle/src/main/java/com/baeldung/finagle/GreetingService.java
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/GreetingService.java
@@ -1,4 +1,4 @@
-package com.baeldung.finagle;
+package com.baeldung.rpc.finagle;
 
 import com.twitter.finagle.Service;
 import com.twitter.finagle.http.Request;
diff --git a/finagle/src/main/java/com/baeldung/finagle/LogFilter.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
similarity index 95%
rename from finagle/src/main/java/com/baeldung/finagle/LogFilter.java
rename to libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
index d381456cfe..3ef57ed18f 100644
--- a/finagle/src/main/java/com/baeldung/finagle/LogFilter.java
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.finagle;
+package com.baeldung.rpc.finagle;
 
 import com.twitter.finagle.Service;
 import com.twitter.finagle.SimpleFilter;
diff --git a/finagle/src/main/java/com/baeldung/finagle/Server.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java
similarity index 93%
rename from finagle/src/main/java/com/baeldung/finagle/Server.java
rename to libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java
index 8a9c9be192..5bc8d93eaf 100644
--- a/finagle/src/main/java/com/baeldung/finagle/Server.java
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java
@@ -1,4 +1,4 @@
-package com.baeldung.finagle;
+package com.baeldung.rpc.finagle;
 
 import com.twitter.finagle.Http;
 import com.twitter.finagle.ListeningServer;
diff --git a/finagle/src/main/resources/logback.xml b/libraries-rpc/src/main/resources/logback.xml
similarity index 100%
rename from finagle/src/main/resources/logback.xml
rename to libraries-rpc/src/main/resources/logback.xml
diff --git a/finagle/src/main/resources/twitter4j.properties b/libraries-rpc/src/main/resources/twitter4j.properties
similarity index 100%
rename from finagle/src/main/resources/twitter4j.properties
rename to libraries-rpc/src/main/resources/twitter4j.properties
diff --git a/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java b/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java
new file mode 100644
index 0000000000..b3faa1968c
--- /dev/null
+++ b/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.rpc.finagle;
+
+import com.twitter.finagle.Http;
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Method;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Await;
+import com.twitter.util.Future;
+import org.junit.Test;
+import scala.runtime.BoxedUnit;
+
+import static org.junit.Assert.assertEquals;
+
+public class ClientServerTest {
+    @Test
+    public void clientShouldReceiveResponseFromServer() throws Exception {
+        // given
+        Service serverService = new LogFilter().andThen(new GreetingService());
+        Http.serve(":8080", serverService);
+
+        Service<Request, Response> clientService = new LogFilter().andThen(Http.newService(":8080"));
+
+        // when
+        Request request = Request.apply(Method.Get(), "/?name=John");
+        request.host("localhost");
+        Future<Response> response = clientService.apply(request);
+
+        // then
+        Await.result(response
+                .onSuccess(r -> {
+                    assertEquals("Hello John", r.getContentString());
+                    return BoxedUnit.UNIT;
+                })
+                .onFailure(r -> {
+                    throw new RuntimeException(r);
+                })
+        );
+    }
+}
diff --git a/pom.xml b/pom.xml
index 813a42c93d..c16775bfc9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -418,7 +418,6 @@
                 <module>ethereum</module>
 
                 <module>feign</module>
-                <module>finagle</module>
                 <module>flyway-cdi-extension</module>
 
                 <module>geotools</module>
@@ -509,6 +508,7 @@
                 <module>libraries-http-2</module>
                 <module>libraries-io</module>
                 <module>libraries-primitive</module>
+                <module>libraries-rpc</module>
                 <module>libraries-security</module>
                 <module>libraries-server</module>
                 <module>libraries-testing</module>

From 3e0c3a0d0a621a3dcf909314fffb5a25b3a17a93 Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Fri, 24 Apr 2020 20:54:23 +0200
Subject: [PATCH 294/404] BAEL-3863 removed README.md

---
 libraries-rpc/README.md | 7 -------
 1 file changed, 7 deletions(-)
 delete mode 100644 libraries-rpc/README.md

diff --git a/libraries-rpc/README.md b/libraries-rpc/README.md
deleted file mode 100644
index d16afdc10d..0000000000
--- a/libraries-rpc/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## Finagle
-
-This module contains articles about Finagle and associated libraries.
-
-### Relevant articles
-
-- [Introduction to Finagle](https://www.baeldung.com/introduction-to-finagle)

From ca7d40de8fdca6741021f8273613a8ee53f7c907 Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Fri, 24 Apr 2020 20:59:20 +0200
Subject: [PATCH 295/404] BAEL-3863 removed redundant examples

---
 .../java/com/baeldung/rpc/finagle/Client.java | 24 -------------------
 .../java/com/baeldung/rpc/finagle/Server.java | 15 ------------
 2 files changed, 39 deletions(-)
 delete mode 100644 libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java
 delete mode 100644 libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java

diff --git a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java
deleted file mode 100644
index 989c79f302..0000000000
--- a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Client.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.rpc.finagle;
-
-import com.twitter.finagle.Http;
-import com.twitter.finagle.Service;
-import com.twitter.finagle.http.Method;
-import com.twitter.finagle.http.Request;
-import com.twitter.finagle.http.Response;
-import com.twitter.util.Await;
-import com.twitter.util.Future;
-import scala.runtime.BoxedUnit;
-
-public class Client {
-    public static void main(String[] args) throws Exception {
-        Service<Request, Response> service = new LogFilter().andThen(Http.newService(":8080"));
-        Request request = Request.apply(Method.Get(), "/?name=John");
-        request.host("localhost");
-        Future<Response> response = service.apply(request);
-        Await.result(response
-                .onSuccess(r -> {
-                    System.out.println(r.getContentString());
-                    return BoxedUnit.UNIT;
-                }));
-    }
-}
diff --git a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java
deleted file mode 100644
index 5bc8d93eaf..0000000000
--- a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/Server.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.baeldung.rpc.finagle;
-
-import com.twitter.finagle.Http;
-import com.twitter.finagle.ListeningServer;
-import com.twitter.finagle.Service;
-import com.twitter.util.Await;
-import com.twitter.util.TimeoutException;
-
-public class Server {
-    public static void main(String[] args) throws TimeoutException, InterruptedException {
-        Service service = new LogFilter().andThen(new GreetingService());
-        ListeningServer server = Http.serve(":8080", service);
-        Await.ready(server);
-    }
-}

From cf6cbe92b9e229c28a354d683d6a3cb6a2d8eb3a Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Sat, 25 Apr 2020 18:07:27 +0200
Subject: [PATCH 296/404] BAEL-3863 Renamed tests to follow convention

---
 .../{ClientServerTest.java => FinagleIntegrationTest.java}    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
 rename libraries-rpc/src/test/java/com/baeldung/rpc/finagle/{ClientServerTest.java => FinagleIntegrationTest.java} (88%)

diff --git a/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java b/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/FinagleIntegrationTest.java
similarity index 88%
rename from libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java
rename to libraries-rpc/src/test/java/com/baeldung/rpc/finagle/FinagleIntegrationTest.java
index b3faa1968c..8dcdb19e7e 100644
--- a/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/ClientServerTest.java
+++ b/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/FinagleIntegrationTest.java
@@ -12,9 +12,9 @@ import scala.runtime.BoxedUnit;
 
 import static org.junit.Assert.assertEquals;
 
-public class ClientServerTest {
+public class FinagleIntegrationTest {
     @Test
-    public void clientShouldReceiveResponseFromServer() throws Exception {
+    public void givenServerAndClient_whenRequestSent_thenClientShouldReceiveResponseFromServer() throws Exception {
         // given
         Service serverService = new LogFilter().andThen(new GreetingService());
         Http.serve(":8080", serverService);

From 6deafc178d25d2b6247074bf02249349591dba4c Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Sun, 26 Apr 2020 16:15:17 +0200
Subject: [PATCH 297/404] BAEL-3863 replace stdouts with logger

---
 .../main/java/com/baeldung/rpc/finagle/LogFilter.java | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
index 3ef57ed18f..7fc5440016 100644
--- a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
@@ -5,13 +5,18 @@ import com.twitter.finagle.SimpleFilter;
 import com.twitter.finagle.http.Request;
 import com.twitter.finagle.http.Response;
 import com.twitter.util.Future;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class LogFilter extends SimpleFilter<Request, Response> {
+
+    private static final Logger logger = LoggerFactory.getLogger(LogFilter.class);
+
     @Override
     public Future<Response> apply(Request request, Service<Request, Response> service) {
-        System.out.println("Request host:" + request.host().getOrElse(() -> ""));
-        System.out.println("Request params:");
-        request.getParams().forEach(entry -> System.out.println("\t" + entry.getKey() + " : " + entry.getValue()));
+        logger.info("Request host:" + request.host().getOrElse(() -> ""));
+        logger.info("Request params:");
+        request.getParams().forEach(entry -> logger.info("\t" + entry.getKey() + " : " + entry.getValue()));
         return service.apply(request);
     }
 }

From 7da38b99cb4d8f4d02ef4eac8efc4143433671d6 Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Sun, 26 Apr 2020 16:25:51 +0200
Subject: [PATCH 298/404] BAEL-3863 add versions properties

---
 libraries-rpc/pom.xml | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/libraries-rpc/pom.xml b/libraries-rpc/pom.xml
index 145693cac1..8741a41062 100644
--- a/libraries-rpc/pom.xml
+++ b/libraries-rpc/pom.xml
@@ -16,15 +16,20 @@
       <dependency>
         <groupId>com.twitter</groupId>
         <artifactId>finagle-core_2.13</artifactId>
-        <version>20.4.0</version>
+        <version>${finagle.core.version}</version>
       </dependency>
       <dependency>
           <groupId>com.twitter</groupId>
           <artifactId>finagle-http_2.13</artifactId>
-          <version>20.4.0</version>
+          <version>${finagle.http.version}</version>
       </dependency>
 
     </dependencies>
 
+    <properties>
+        <finagle.core.version>20.4.0</finagle.core.version>
+        <finagle.http.version>20.4.0</finagle.http.version>
+    </properties>
+
 
 </project>

From 6709017cc02040e210265e91a9792fdc405d6aef Mon Sep 17 00:00:00 2001
From: mdabrowski-eu <firma@mdabrowski.eu>
Date: Sat, 9 May 2020 18:01:17 +0200
Subject: [PATCH 299/404] BAEL-3863 removed redundant twitter4j.properties file

---
 libraries-rpc/src/main/resources/twitter4j.properties | 4 ----
 1 file changed, 4 deletions(-)
 delete mode 100644 libraries-rpc/src/main/resources/twitter4j.properties

diff --git a/libraries-rpc/src/main/resources/twitter4j.properties b/libraries-rpc/src/main/resources/twitter4j.properties
deleted file mode 100644
index ee11dc62a1..0000000000
--- a/libraries-rpc/src/main/resources/twitter4j.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-oauth.consumerKey=//TODO
-oauth.consumerSecret=//TODO
-oauth.accessToken=//TODO
-oauth.accessTokenSecret=//TODO

From 5ae337e1e25d047f5dd117c8804c05784cffb1f5 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Tue, 12 May 2020 23:03:58 +0530
Subject: [PATCH 300/404] JAVA-1595: Restore code for Jetty ReactiveStreams
 HTTP Client article

---
 libraries-http-2/pom.xml                      | 37 ++++++++++
 .../jetty/httpclient/BlockingSubscriber.java  | 35 ++++++++++
 .../jetty/httpclient/RequestHandler.java      | 21 ++++++
 .../jetty/httpclient/AbstractUnitTest.java    | 54 +++++++++++++++
 .../httpclient/ProjectReactorUnitTest.java    | 30 +++++++++
 .../httpclient/ReactiveStreamsUnitTest.java   | 28 ++++++++
 .../jetty/httpclient/RxJava2UnitTest.java     | 67 +++++++++++++++++++
 .../httpclient/SpringWebFluxUnitTest.java     | 36 ++++++++++
 8 files changed, 308 insertions(+)
 create mode 100644 libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/BlockingSubscriber.java
 create mode 100644 libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/RequestHandler.java
 create mode 100644 libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/AbstractUnitTest.java
 create mode 100644 libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ProjectReactorUnitTest.java
 create mode 100644 libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ReactiveStreamsUnitTest.java
 create mode 100644 libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/RxJava2UnitTest.java
 create mode 100644 libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/SpringWebFluxUnitTest.java

diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml
index c0a4f6455d..73fe6c66bd 100644
--- a/libraries-http-2/pom.xml
+++ b/libraries-http-2/pom.xml
@@ -35,6 +35,37 @@
             <version>${mockwebserver.version}</version>
             <scope>test</scope>
         </dependency>
+        <!-- Dependencies for Jetty ReactiveStreams HTTP Client -->
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-reactive-httpclient</artifactId>
+            <version>${jetty.httpclient.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${jetty.server.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.reactivex.rxjava2</groupId>
+            <artifactId>rxjava</artifactId>
+            <version>${rxjava2.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webflux</artifactId>
+            <version>${spring.webflux.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.projectreactor</groupId>
+            <artifactId>reactor-core</artifactId>
+            <version>${reactor.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.reactivestreams</groupId>
+            <artifactId>reactive-streams</artifactId>
+            <version>${reactive.stream.version}</version>
+        </dependency>
     </dependencies>
 
     <properties>
@@ -42,6 +73,12 @@
         <gson.version>2.8.5</gson.version>
         <mockwebserver.version>3.14.2</mockwebserver.version>
         <jackson.version>2.9.8</jackson.version>
+        <jetty.httpclient.version>1.0.3</jetty.httpclient.version>
+        <jetty.server.version>9.4.19.v20190610</jetty.server.version>
+        <rxjava2.version>2.2.11</rxjava2.version>
+        <spring.webflux.version>5.1.9.RELEASE</spring.webflux.version>
+        <reactive.stream.version>1.0.3</reactive.stream.version>
+        <reactor.version>3.2.12.RELEASE</reactor.version>
     </properties>
 
 </project>
diff --git a/libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/BlockingSubscriber.java b/libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/BlockingSubscriber.java
new file mode 100644
index 0000000000..6986172cd3
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/BlockingSubscriber.java
@@ -0,0 +1,35 @@
+package com.baeldung.jetty.httpclient;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.reactive.client.ReactiveResponse;
+import org.reactivestreams.Subscriber;
+import org.reactivestreams.Subscription;
+
+public class BlockingSubscriber implements Subscriber<ReactiveResponse> {
+    BlockingQueue<ReactiveResponse> sink = new LinkedBlockingQueue<>(1);
+
+    @Override
+    public void onSubscribe(Subscription subscription) {
+        subscription.request(1);
+    }
+
+    @Override
+    public void onNext(ReactiveResponse response) {
+        sink.offer(response);
+    }
+
+    @Override
+    public void onError(Throwable failure) {
+    }
+
+    @Override
+    public void onComplete() {
+    }
+
+    public ReactiveResponse block() throws InterruptedException {
+        return sink.poll(5, TimeUnit.SECONDS);
+    }
+}
\ No newline at end of file
diff --git a/libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/RequestHandler.java b/libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/RequestHandler.java
new file mode 100644
index 0000000000..c3dbff9b11
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/jetty/httpclient/RequestHandler.java
@@ -0,0 +1,21 @@
+package com.baeldung.jetty.httpclient;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.IO;
+
+public class RequestHandler extends AbstractHandler {
+
+    @Override
+    public void handle(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+        jettyRequest.setHandled(true);
+        response.setContentType(request.getContentType());
+        IO.copy(request.getInputStream(), response.getOutputStream());
+    }
+}
\ No newline at end of file
diff --git a/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/AbstractUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/AbstractUnitTest.java
new file mode 100644
index 0000000000..4a3e67a7c5
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/AbstractUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.jetty.httpclient;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.junit.After;
+import org.junit.Before;
+
+public abstract class AbstractUnitTest {
+
+   protected HttpClient httpClient;
+   protected Server server;
+   protected static final String CONTENT = "Hello World!";
+   protected final int port = 9080;
+
+    @Before
+    public void init() {
+        startServer(new RequestHandler());
+        startClient();
+    }
+    
+    private void startClient() {
+        httpClient = new HttpClient();
+        try {
+            httpClient.start();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+    private void startServer(Handler handler) {
+        server = new Server(port);
+        server.setHandler(handler);
+        try {
+            server.start();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @After
+    public void dispose() throws Exception {
+        if (httpClient != null) {
+            httpClient.stop();
+        }
+        if (server != null) {
+            server.stop();
+        }
+    }
+
+    protected String uri() {
+        return "http://localhost:" + port;
+    }
+}
\ No newline at end of file
diff --git a/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ProjectReactorUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ProjectReactorUnitTest.java
new file mode 100644
index 0000000000..6d79773609
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ProjectReactorUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.jetty.httpclient;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.reactive.client.ReactiveRequest;
+import org.eclipse.jetty.reactive.client.ReactiveResponse;
+import org.junit.Assert;
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+
+import reactor.core.publisher.Mono;
+
+public class ProjectReactorUnitTest extends AbstractUnitTest {
+
+    @Test
+    public void givenReactiveClient_whenRequested_shouldReturn200() throws Exception {
+
+        Request request = httpClient.newRequest(uri());
+        ReactiveRequest reactiveRequest = ReactiveRequest.newBuilder(request)
+            .build();
+        Publisher<ReactiveResponse> publisher = reactiveRequest.response();
+
+        ReactiveResponse response = Mono.from(publisher)
+            .block();
+
+        Assert.assertNotNull(response);
+        Assert.assertEquals(response.getStatus(), HttpStatus.OK_200);
+
+    }
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ReactiveStreamsUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ReactiveStreamsUnitTest.java
new file mode 100644
index 0000000000..3db4553c86
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/ReactiveStreamsUnitTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.jetty.httpclient;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.reactive.client.ReactiveRequest;
+import org.eclipse.jetty.reactive.client.ReactiveResponse;
+import org.junit.Assert;
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+
+public class ReactiveStreamsUnitTest extends AbstractUnitTest {
+
+    @Test
+    public void givenReactiveClient_whenRequested_shouldReturn200() throws Exception {
+
+        Request request = httpClient.newRequest(uri());
+        ReactiveRequest reactiveRequest = ReactiveRequest.newBuilder(request)
+            .build();
+        Publisher<ReactiveResponse> publisher = reactiveRequest.response();
+
+        BlockingSubscriber subscriber = new BlockingSubscriber();
+        publisher.subscribe(subscriber);
+        ReactiveResponse response = subscriber.block();
+        Assert.assertNotNull(response);
+        Assert.assertEquals(response.getStatus(), HttpStatus.OK_200);
+    }
+
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/RxJava2UnitTest.java b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/RxJava2UnitTest.java
new file mode 100644
index 0000000000..dabd768702
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/RxJava2UnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.jetty.httpclient;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.reactive.client.ReactiveRequest;
+import org.eclipse.jetty.reactive.client.ReactiveRequest.Event.Type;
+import org.eclipse.jetty.reactive.client.ReactiveResponse;
+import org.junit.Assert;
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+import org.springframework.http.MediaType;
+
+import io.reactivex.Flowable;
+import io.reactivex.Single;
+
+public class RxJava2UnitTest extends AbstractUnitTest {
+
+    @Test
+    public void givenReactiveClient_whenRequestedWithBody_ShouldReturnBody() throws Exception {
+
+        Request request = httpClient.newRequest(uri());
+        ReactiveRequest reactiveRequest = ReactiveRequest.newBuilder(request)
+            .content(ReactiveRequest.Content.fromString(CONTENT, MediaType.TEXT_PLAIN_VALUE, UTF_8))
+            .build();
+        Publisher<String> publisher = reactiveRequest.response(ReactiveResponse.Content.asString());
+
+        String responseContent = Single.fromPublisher(publisher)
+            .blockingGet();
+
+        Assert.assertEquals(CONTENT, responseContent);
+    }
+
+    @Test
+    public void givenReactiveClient_whenRequested_ShouldPrintEvents() throws Exception {
+        ReactiveRequest request = ReactiveRequest.newBuilder(httpClient, uri())
+            .content(ReactiveRequest.Content.fromString(CONTENT, MediaType.TEXT_PLAIN_VALUE, UTF_8))
+            .build();
+        Publisher<ReactiveRequest.Event> requestEvents = request.requestEvents();
+        Publisher<ReactiveResponse.Event> responseEvents = request.responseEvents();
+
+        List<Type> requestEventTypes = new ArrayList<>();
+        List<ReactiveResponse.Event.Type> responseEventTypes = new ArrayList<>();
+
+        Flowable.fromPublisher(requestEvents)
+            .map(ReactiveRequest.Event::getType)
+            .subscribe(requestEventTypes::add);
+
+        Flowable.fromPublisher(responseEvents)
+            .map(ReactiveResponse.Event::getType)
+            .subscribe(responseEventTypes::add);
+
+        Single<ReactiveResponse> response = Single.fromPublisher(request.response());
+        int actualStatus = response.blockingGet()
+            .getStatus();
+
+        Assert.assertEquals(6, requestEventTypes.size());
+        Assert.assertEquals(5, responseEventTypes.size());
+
+        Assert.assertEquals(actualStatus, HttpStatus.OK_200);
+    }
+
+}
\ No newline at end of file
diff --git a/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/SpringWebFluxUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/SpringWebFluxUnitTest.java
new file mode 100644
index 0000000000..4a1a9bb2b5
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/jetty/httpclient/SpringWebFluxUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.jetty.httpclient;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.reactive.ClientHttpConnector;
+import org.springframework.http.client.reactive.JettyClientHttpConnector;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import reactor.core.publisher.Mono;
+
+public class SpringWebFluxUnitTest extends AbstractUnitTest {
+
+    @Test
+    public void givenReactiveClient_whenRequested_shouldReturnResponse() throws Exception {
+        
+        HttpClient httpClient = new HttpClient();
+        httpClient.start();
+
+        ClientHttpConnector clientConnector = new JettyClientHttpConnector(httpClient);
+        WebClient client = WebClient.builder()
+            .clientConnector(clientConnector)
+            .build();
+        String responseContent = client.post()
+            .uri(uri())
+            .contentType(MediaType.TEXT_PLAIN)
+            .body(BodyInserters.fromPublisher(Mono.just(CONTENT), String.class))
+            .retrieve()
+            .bodyToMono(String.class)
+            .block();
+        Assert.assertNotNull(responseContent);
+        Assert.assertEquals(CONTENT, responseContent);
+    }
+}
\ No newline at end of file

From 167655d659ea258532b4d0ea75cb6763452e2ca7 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Wed, 13 May 2020 01:56:55 +0530
Subject: [PATCH 301/404] add bucket4j deps

---
 .../spring-boot-libraries/pom.xml             | 213 ++++++++++--------
 1 file changed, 122 insertions(+), 91 deletions(-)

diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml
index 090967d8a8..36b9ec17c9 100644
--- a/spring-boot-modules/spring-boot-libraries/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries/pom.xml
@@ -87,7 +87,35 @@
             <artifactId>javase</artifactId>
             <version>${zxing.version}</version>
         </dependency>
-
+		<!-- Bucket4j -->
+		<dependency>
+			<groupId>com.github.vladimir-bukhtoyarov</groupId>
+			<artifactId>bucket4j-core</artifactId>
+			<version>${bucket4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.giffing.bucket4j.spring.boot.starter</groupId>
+			<artifactId>bucket4j-spring-boot-starter</artifactId>
+			<version>${bucket4j-spring-boot-starter.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-cache</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.cache</groupId>
+			<artifactId>cache-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.github.ben-manes.caffeine</groupId>
+			<artifactId>caffeine</artifactId>
+			<version>${caffeine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>com.github.ben-manes.caffeine</groupId>
+			<artifactId>jcache</artifactId>
+			<version>${caffeine.version}</version>
+		</dependency>
     </dependencies>
 
     <repositories>
@@ -97,109 +125,112 @@
         </repository>
     </repositories>
 
-    <build>
-        <finalName>spring-boot-libraries</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
+	<build>
+		<finalName>spring-boot-libraries</finalName>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+			</resource>
+		</resources>
 
-        <plugins>
+		<plugins>
 
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-            </plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+			</plugin>
 
-            <plugin>
-                <groupId>pl.project13.maven</groupId>
-                <artifactId>git-commit-id-plugin</artifactId>
-                <version>${git-commit-id-plugin.version}</version>
-                <executions>
-                    <execution>
-                        <id>get-the-git-infos</id>
-                        <goals>
-                            <goal>revision</goal>
-                        </goals>
-                        <phase>initialize</phase>
-                    </execution>
-                    <execution>
-                        <id>validate-the-git-infos</id>
-                        <goals>
-                            <goal>validateRevision</goal>
-                        </goals>
-                        <phase>package</phase>
-                    </execution>
-                </executions>
-                <configuration>
-                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
-                    <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
-                </configuration>
-            </plugin>
+			<plugin>
+				<groupId>pl.project13.maven</groupId>
+				<artifactId>git-commit-id-plugin</artifactId>
+				<version>${git-commit-id-plugin.version}</version>
+				<executions>
+					<execution>
+						<id>get-the-git-infos</id>
+						<goals>
+							<goal>revision</goal>
+						</goals>
+						<phase>initialize</phase>
+					</execution>
+					<execution>
+						<id>validate-the-git-infos</id>
+						<goals>
+							<goal>validateRevision</goal>
+						</goals>
+						<phase>package</phase>
+					</execution>
+				</executions>
+				<configuration>
+					<generateGitPropertiesFile>true</generateGitPropertiesFile>
+					<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
+				</configuration>
+			</plugin>
 
         </plugins>
 
     </build>
 
-    <profiles>
-        <profile>
-            <id>autoconfiguration</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>integration-test</phase>
-                                <goals>
-                                    <goal>test</goal>
-                                </goals>
-                                <configuration>
-                                    <excludes>
-                                        <exclude>**/*LiveTest.java</exclude>
-                                        <exclude>**/*IntegrationTest.java</exclude>
-                                        <exclude>**/*IntTest.java</exclude>
-                                    </excludes>
-                                    <includes>
-                                        <include>**/AutoconfigurationTest.java</include>
-                                    </includes>
-                                </configuration>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <systemPropertyVariables>
-                                <test.mime>json</test.mime>
-                            </systemPropertyVariables>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
+	<profiles>
+		<profile>
+			<id>autoconfiguration</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-surefire-plugin</artifactId>
+						<executions>
+							<execution>
+								<phase>integration-test</phase>
+								<goals>
+									<goal>test</goal>
+								</goals>
+								<configuration>
+									<excludes>
+										<exclude>**/*LiveTest.java</exclude>
+										<exclude>**/*IntegrationTest.java</exclude>
+										<exclude>**/*IntTest.java</exclude>
+									</excludes>
+									<includes>
+										<include>**/AutoconfigurationTest.java</include>
+									</includes>
+								</configuration>
+							</execution>
+						</executions>
+						<configuration>
+							<systemPropertyVariables>
+								<test.mime>json</test.mime>
+							</systemPropertyVariables>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
 
-    <properties>
-        <!-- The main class to start by executing java -jar -->
+	<properties>
+		<!-- The main class to start by executing java -jar -->
         <start-class>com.baeldung.intro.App</start-class>
         <tomee-servlet-api.version>8.5.11</tomee-servlet-api.version>
         <togglz.version>2.4.1.Final</togglz.version>
         <rome.version>1.9.0</rome.version>
         <chaos.monkey.version>2.0.0</chaos.monkey.version>
-        <graphql-spring-boot-starter.version>5.0.2</graphql-spring-boot-starter.version>
-        <graphiql-spring-boot-starter.version>5.0.2</graphiql-spring-boot-starter.version>
-        <graphql-java-tools.version>5.2.4</graphql-java-tools.version>
-        <guava.version>18.0</guava.version>
-        <git-commit-id-plugin.version>2.2.4</git-commit-id-plugin.version>
-        <modelmapper.version>2.3.2</modelmapper.version>
-        <problem-spring-web.version>0.23.0</problem-spring-web.version>
-        <h2.version>1.4.200</h2.version>
-        <shedlock.version>2.1.0</shedlock.version>
-        <barbecue.version>1.5-beta1</barbecue.version>
-        <barcode4j.version>2.1</barcode4j.version>
-        <qrgen.version>2.6.0</qrgen.version>
-        <zxing.version>3.3.0</zxing.version>
-    </properties>
+		<graphql-spring-boot-starter.version>5.0.2</graphql-spring-boot-starter.version>
+		<graphiql-spring-boot-starter.version>5.0.2</graphiql-spring-boot-starter.version>
+		<graphql-java-tools.version>5.2.4</graphql-java-tools.version>
+		<guava.version>18.0</guava.version>
+		<git-commit-id-plugin.version>2.2.4</git-commit-id-plugin.version>
+		<modelmapper.version>2.3.2</modelmapper.version>
+		<problem-spring-web.version>0.23.0</problem-spring-web.version>
+		<h2.version>1.4.200</h2.version>
+		<shedlock.version>2.1.0</shedlock.version>
+		<barbecue.version>1.5-beta1</barbecue.version>
+		<barcode4j.version>2.1</barcode4j.version>
+		<qrgen.version>2.6.0</qrgen.version>
+		<zxing.version>3.3.0</zxing.version>
+		<bucket4j.version>4.10.0</bucket4j.version>
+		<bucket4j-spring-boot-starter.version>0.2.0</bucket4j-spring-boot-starter.version>
+		<caffeine.version>2.8.2</caffeine.version>
+	</properties>
 
 </project>

From e8c383d10f5b15bf741c7ba1e0dd9b66852317f6 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Wed, 13 May 2020 01:58:05 +0530
Subject: [PATCH 302/404] area api impl

---
 .../controller/AreaCalculationController.java | 29 +++++++++++++++++++
 .../com/baeldung/ratelimiting/dto/AreaV1.java | 20 +++++++++++++
 .../dto/RectangleDimensionsV1.java            | 15 ++++++++++
 .../dto/TriangleDimensionsV1.java             | 15 ++++++++++
 4 files changed, 79 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/controller/AreaCalculationController.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/AreaV1.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/RectangleDimensionsV1.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/TriangleDimensionsV1.java

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/controller/AreaCalculationController.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/controller/AreaCalculationController.java
new file mode 100644
index 0000000000..f3fb63ebdd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/controller/AreaCalculationController.java
@@ -0,0 +1,29 @@
+package com.baeldung.ratelimiting.controller;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.ratelimiting.dto.AreaV1;
+import com.baeldung.ratelimiting.dto.RectangleDimensionsV1;
+import com.baeldung.ratelimiting.dto.TriangleDimensionsV1;
+
+@RestController
+@RequestMapping(value = "/api/v1/area", consumes = MediaType.APPLICATION_JSON_VALUE)
+class AreaCalculationController {
+
+    @PostMapping(value = "/rectangle", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<AreaV1> rectangle(@RequestBody RectangleDimensionsV1 dimensions) {
+
+        return ResponseEntity.ok(new AreaV1("rectangle", dimensions.getLength() * dimensions.getWidth()));
+    }
+
+    @PostMapping(value = "/triangle", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<AreaV1> triangle(@RequestBody TriangleDimensionsV1 dimensions) {
+
+        return ResponseEntity.ok(new AreaV1("triangle", 0.5d * dimensions.getHeight() * dimensions.getBase()));
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/AreaV1.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/AreaV1.java
new file mode 100644
index 0000000000..78097f55b2
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/AreaV1.java
@@ -0,0 +1,20 @@
+package com.baeldung.ratelimiting.dto;
+
+public class AreaV1 {
+
+    private String shape;
+    private Double area;
+    
+    public AreaV1(String shape, Double area) {
+        this.area = area;
+        this.shape = shape;
+    }
+    
+    public Double getArea() {
+        return area;
+    }
+    
+    public String getShape() {
+        return shape;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/RectangleDimensionsV1.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/RectangleDimensionsV1.java
new file mode 100644
index 0000000000..e3c17e1ba7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/RectangleDimensionsV1.java
@@ -0,0 +1,15 @@
+package com.baeldung.ratelimiting.dto;
+
+public class RectangleDimensionsV1 {
+
+  private double length;
+  private double width;
+
+  public double getLength() {
+    return length;
+  }
+
+  public double getWidth() {
+    return width;
+  }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/TriangleDimensionsV1.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/TriangleDimensionsV1.java
new file mode 100644
index 0000000000..44c954bded
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/dto/TriangleDimensionsV1.java
@@ -0,0 +1,15 @@
+package com.baeldung.ratelimiting.dto;
+
+public class TriangleDimensionsV1 {
+
+    private double base;
+    private double height;
+
+    public double getBase() {
+      return base;
+    }
+
+    public double getHeight() {
+      return height;
+    }
+}

From 4e45b8f44ef8c0b5d0e8c6b3a18f6d07be7cf796 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Wed, 13 May 2020 01:58:40 +0530
Subject: [PATCH 303/404] spring mvc using interceptor

---
 .../bucket4japp/Bucket4jRateLimitingApp.java  | 29 +++++++++
 .../bucket4japp/interceptor/PricingPlan.java  | 48 ++++++++++++++
 .../interceptor/RateLimitingInterceptor.java  | 65 +++++++++++++++++++
 .../ratelimiting/application-bucket4j.yml     | 10 +++
 4 files changed, 152 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java
new file mode 100644
index 0000000000..2a42448b35
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java
@@ -0,0 +1,29 @@
+package com.baeldung.ratelimiting.bucket4japp;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import com.baeldung.ratelimiting.bucket4japp.interceptor.RateLimitingInterceptor;
+
+@SpringBootApplication(scanBasePackages = "com.baeldung.ratelimiting", exclude = { 
+        DataSourceAutoConfiguration.class,
+        SecurityAutoConfiguration.class
+})
+public class Bucket4jRateLimitingApp implements WebMvcConfigurer {
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new RateLimitingInterceptor())
+            .addPathPatterns("/api/v1/area/**");
+    }
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(Bucket4jRateLimitingApp.class)
+            .properties("spring.config.location=classpath:ratelimiting/application-bucket4j.yml")
+            .run(args);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java
new file mode 100644
index 0000000000..e2b3ccb6c6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java
@@ -0,0 +1,48 @@
+package com.baeldung.ratelimiting.bucket4japp.interceptor;
+
+import java.time.Duration;
+
+import io.github.bucket4j.Bandwidth;
+import io.github.bucket4j.Refill;
+
+enum PricingPlan {
+
+    FREE {
+
+        @Override
+        Bandwidth getLimit() {
+            return Bandwidth.classic(20, Refill.intervally(20, Duration.ofHours(1)));
+        }
+    },
+
+    BASIC {
+
+        @Override
+        Bandwidth getLimit() {
+            return Bandwidth.classic(40, Refill.intervally(40, Duration.ofHours(1)));
+        }
+    },
+
+    PROFESSIONAL {
+
+        @Override
+        Bandwidth getLimit() {
+            return Bandwidth.classic(100, Refill.intervally(100, Duration.ofHours(1)));
+        }
+    };
+
+    abstract Bandwidth getLimit();
+
+    static PricingPlan resolvePlanFromApiKey(String apiKey) {
+        if (apiKey == null || apiKey.isEmpty()) {
+            return FREE;
+        
+        } else if (apiKey.startsWith("PX001-")) {
+            return PROFESSIONAL;
+            
+        } else if (apiKey.startsWith("BX001-")) {
+            return BASIC;
+        }
+        return FREE;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java
new file mode 100644
index 0000000000..8aa8de531c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java
@@ -0,0 +1,65 @@
+package com.baeldung.ratelimiting.bucket4japp.interceptor;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import io.github.bucket4j.Bandwidth;
+import io.github.bucket4j.Bucket;
+import io.github.bucket4j.Bucket4j;
+import io.github.bucket4j.ConsumptionProbe;
+
+public class RateLimitingInterceptor implements HandlerInterceptor {
+
+    private static final String HEADER_API_KEY = "X-api-key";
+    private static final String HEADER_LIMIT_REMAINING = "X-Rate-Limit-Remaining";
+    private static final String HEADER_RETRY_AFTER = "X-Rate-Limit-Retry-After-Milliseconds";
+
+    private final Map<String, Bucket> cache = new ConcurrentHashMap<>();
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        
+        String apiKey = request.getHeader(HEADER_API_KEY);
+
+        if (apiKey == null || apiKey.isEmpty()) {
+            response.sendError(HttpStatus.BAD_REQUEST.value(), "Missing Header: " + HEADER_API_KEY);
+            return false;
+        }
+        
+        Bucket tokenBucket = cache.computeIfAbsent(apiKey, this::resolveBucket);
+
+        ConsumptionProbe probe = tokenBucket.tryConsumeAndReturnRemaining(1);
+
+        if (probe.isConsumed()) {
+
+            response.addHeader(HEADER_LIMIT_REMAINING, String.valueOf(probe.getRemainingTokens()));
+            return true;
+
+        } else {
+
+            long waitForRefillMilli = probe.getNanosToWaitForRefill() % 1_000_000;
+
+            response.sendError(HttpStatus.TOO_MANY_REQUESTS.value(), "You have exhausted your API Request Quota"); // 429
+            response.addHeader(HEADER_RETRY_AFTER, String.valueOf(waitForRefillMilli));
+
+            return false;
+        }
+    }
+
+    private Bucket resolveBucket(String apiKey) {
+        PricingPlan pricingPlan = PricingPlan.resolvePlanFromApiKey(apiKey);
+        return bucket(pricingPlan.getLimit());
+    }
+    
+    private Bucket bucket(Bandwidth limit) {
+        return Bucket4j.builder()
+            .addLimit(limit)
+            .build();
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
new file mode 100644
index 0000000000..1fb4d2cf12
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
@@ -0,0 +1,10 @@
+server:
+  port: 9000
+
+spring:
+  application:
+    name: bucket4j-api-rate-limiting-app
+  mvc:
+    throw-exception-if-no-handler-found: true
+  resources:
+    add-mappings: false

From 1b5a64c4a49b7fc9017d487aaab79ad01713a39d Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Wed, 13 May 2020 01:59:03 +0530
Subject: [PATCH 304/404] bucket4j spring boot starter

---
 .../Bucket4jRateLimitingApp.java              | 21 ++++++++++
 .../application-bucket4j-starter.yml          | 41 +++++++++++++++++++
 2 files changed, 62 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java
new file mode 100644
index 0000000000..de2ab41bf0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java
@@ -0,0 +1,21 @@
+package com.baeldung.ratelimiting.bootstarterapp;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cache.annotation.EnableCaching;
+
+@SpringBootApplication(scanBasePackages = "com.baeldung.ratelimiting", exclude = {
+    DataSourceAutoConfiguration.class,
+    SecurityAutoConfiguration.class,
+})
+@EnableCaching
+public class Bucket4jRateLimitingApp {
+
+  public static void main(String[] args) {
+    new SpringApplicationBuilder(Bucket4jRateLimitingApp.class)
+        .properties("spring.config.location=classpath:ratelimiting/application-bucket4j-starter.yml")
+        .run(args);
+  }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml
new file mode 100644
index 0000000000..1c1337c611
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml
@@ -0,0 +1,41 @@
+server:
+  port: 9001
+
+spring:
+  application:
+    name: bucket4j-starter-api-rate-limiting-app
+  mvc:
+    throw-exception-if-no-handler-found: true
+  resources:
+    add-mappings: false
+  cache:
+    cache-names:
+    - rate-limiting-buckets
+    caffeine:
+      spec: maximumSize=100000,expireAfterAccess=3600s
+
+bucket4j:
+  enabled: true
+  filters:
+  - cache-name: rate-limiting-buckets
+    url: /api/v1/area.*
+    http-response-body: "{ \"status\": 429, \"error\": \"Too Many Requests\", \"message\": \"You have exhausted your API Request Quota\" }"
+    rate-limits:
+    - expression: "getHeader('X-api-key')"
+      execute-condition: "getHeader('X-api-key').startsWith('PX001-')"
+      bandwidths:
+      - capacity: 100
+        time: 1
+        unit: hours
+    - expression: "getHeader('X-api-key')"
+      execute-condition: "getHeader('X-api-key').startsWith('BX001-')"
+      bandwidths:
+      - capacity: 40
+        time: 1
+        unit: hours
+    - expression: "getHeader('X-api-key')"
+      bandwidths:
+      - capacity: 20
+        time: 1
+        unit: hours
+        
\ No newline at end of file

From 00f5e0012cfa89c0a38c5ff123dd88af76aecfc3 Mon Sep 17 00:00:00 2001
From: Jonathan Cook <jonathan.cook@erars.plus.com>
Date: Wed, 13 May 2020 03:46:33 +0200
Subject: [PATCH 305/404] BAEL-3925 - How to call Python from Java? (#9277)

* BAEL-3491 - Check for null before calling parse in the
Double.parseDouble

* BAEL-3491 - Check for null before calling parse in the
Double.parseDouble

- Return to indentation with spaces.

* BAEL-3854 - Pattern Matching for instanceof in Java 14

* BAEL-3854 - Pattern Matching for instanceof in Java 14 - add unit test

* BAEL-3868 - Fix the integrations tests in mocks

* BAEL-3925 - How to call Python from Java

Co-authored-by: Jonathan Cook <jcook@sciops.esa.int>
---
 java-python-interop/README.md                 |   5 +
 java-python-interop/pom.xml                   |  55 ++++++++
 .../interop/ScriptEngineManagerUtils.java     |  34 +++++
 .../src/main/resources/logback.xml            |  13 ++
 .../interop/JavaPythonInteropUnitTest.java    | 131 ++++++++++++++++++
 .../src/test/resources/hello.py               |   1 +
 pom.xml                                       |   3 +-
 7 files changed, 241 insertions(+), 1 deletion(-)
 create mode 100644 java-python-interop/README.md
 create mode 100644 java-python-interop/pom.xml
 create mode 100644 java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java
 create mode 100644 java-python-interop/src/main/resources/logback.xml
 create mode 100644 java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java
 create mode 100644 java-python-interop/src/test/resources/hello.py

diff --git a/java-python-interop/README.md b/java-python-interop/README.md
new file mode 100644
index 0000000000..dc9573ecde
--- /dev/null
+++ b/java-python-interop/README.md
@@ -0,0 +1,5 @@
+## Java Python Interop
+
+This module contains articles about Java and Python interoperability.  
+
+### Relevant Articles:
diff --git a/java-python-interop/pom.xml b/java-python-interop/pom.xml
new file mode 100644
index 0000000000..6ee5a0be3b
--- /dev/null
+++ b/java-python-interop/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>java-python-interop</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>java-python-interop</name>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-modules</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.python</groupId>
+            <artifactId>jython-slim</artifactId>
+            <version>${jython.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-exec</artifactId>
+            <version>${commons-exec.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>java-python-interop</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+    <properties>
+        <jython.version>2.7.2</jython.version>
+        <commons-exec.version>1.3</commons-exec.version>
+        <assertj.version>3.6.1</assertj.version>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java b/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java
new file mode 100644
index 0000000000..981f174c33
--- /dev/null
+++ b/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java
@@ -0,0 +1,34 @@
+package com.baeldung.python.interop;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
+
+public class ScriptEngineManagerUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ScriptEngineManagerUtils.class);
+
+    private ScriptEngineManagerUtils() {
+    }
+
+    public static void listEngines() {
+        ScriptEngineManager manager = new ScriptEngineManager();
+        List<ScriptEngineFactory> engines = manager.getEngineFactories();
+
+        for (ScriptEngineFactory engine : engines) {
+            LOGGER.info("Engine name: {}", engine.getEngineName());
+            LOGGER.info("Version: {}", engine.getEngineVersion());
+            LOGGER.info("Language: {}", engine.getLanguageName());
+
+            LOGGER.info("Short Names:");
+            for (String names : engine.getNames()) {
+                LOGGER.info(names);
+            }
+        }
+    }
+
+}
diff --git a/java-python-interop/src/main/resources/logback.xml b/java-python-interop/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/java-python-interop/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+            </pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java b/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java
new file mode 100644
index 0000000000..5ec3a2b61f
--- /dev/null
+++ b/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java
@@ -0,0 +1,131 @@
+package com.baeldung.python.interop;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.SimpleScriptContext;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.DefaultExecutor;
+import org.apache.commons.exec.ExecuteException;
+import org.apache.commons.exec.PumpStreamHandler;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.python.core.PyException;
+import org.python.core.PyObject;
+import org.python.util.PythonInterpreter;
+
+public class JavaPythonInteropUnitTest {
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    @Test
+    public void givenPythonScript_whenPythonProcessInvoked_thenSuccess() throws Exception {
+        ProcessBuilder processBuilder = new ProcessBuilder("python", resolvePythonScriptPath("hello.py"));
+        processBuilder.redirectErrorStream(true);
+
+        Process process = processBuilder.start();
+        List<String> results = readProcessOutput(process.getInputStream());
+
+        assertThat("Results should not be empty", results, is(not(empty())));
+        assertThat("Results should contain output of script: ", results, hasItem(containsString("Hello Baeldung Readers!!")));
+
+        int exitCode = process.waitFor();
+        assertEquals("No errors should be detected", 0, exitCode);
+    }
+
+    @Test
+    public void givenPythonScriptEngineIsAvailable_whenScriptInvoked_thenOutputDisplayed() throws Exception {
+        StringWriter output = new StringWriter();
+        ScriptContext context = new SimpleScriptContext();
+        context.setWriter(output);
+
+        ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = manager.getEngineByName("python");
+        engine.eval(new FileReader(resolvePythonScriptPath("hello.py")), context);
+        assertEquals("Should contain script output: ", "Hello Baeldung Readers!!", output.toString()
+            .trim());
+    }
+
+    @Test
+    public void givenPythonInterpreter_whenPrintExecuted_thenOutputDisplayed() {
+        try (PythonInterpreter pyInterp = new PythonInterpreter()) {
+            StringWriter output = new StringWriter();
+            pyInterp.setOut(output);
+
+            pyInterp.exec("print('Hello Baeldung Readers!!')");
+            assertEquals("Should contain script output: ", "Hello Baeldung Readers!!", output.toString()
+                .trim());
+        }
+    }
+
+    @Test
+    public void givenPythonInterpreter_whenNumbersAdded_thenOutputDisplayed() {
+        try (PythonInterpreter pyInterp = new PythonInterpreter()) {
+            pyInterp.exec("x = 10+10");
+            PyObject x = pyInterp.get("x");
+            assertEquals("x: ", 20, x.asInt());
+        }
+    }
+
+    @Test
+    public void givenPythonInterpreter_whenErrorOccurs_thenExceptionIsThrown() {
+        thrown.expect(PyException.class);
+        thrown.expectMessage("ImportError: No module named syds");
+
+        try (PythonInterpreter pyInterp = new PythonInterpreter()) {
+            pyInterp.exec("import syds");
+        }
+    }
+
+    @Test
+    public void givenPythonScript_whenPythonProcessExecuted_thenSuccess() throws ExecuteException, IOException {
+        String line = "python " + resolvePythonScriptPath("hello.py");
+        CommandLine cmdLine = CommandLine.parse(line);
+
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
+
+        DefaultExecutor executor = new DefaultExecutor();
+        executor.setStreamHandler(streamHandler);
+
+        int exitCode = executor.execute(cmdLine);
+        assertEquals("No errors should be detected", 0, exitCode);
+        assertEquals("Should contain script output: ", "Hello Baeldung Readers!!", outputStream.toString()
+            .trim());
+    }
+
+    private List<String> readProcessOutput(InputStream inputStream) throws IOException {
+        try (BufferedReader output = new BufferedReader(new InputStreamReader(inputStream))) {
+            return output.lines()
+                .collect(Collectors.toList());
+        }
+    }
+
+    private String resolvePythonScriptPath(String filename) {
+        File file = new File("src/test/resources/" + filename);
+        return file.getAbsolutePath();
+    }
+
+}
diff --git a/java-python-interop/src/test/resources/hello.py b/java-python-interop/src/test/resources/hello.py
new file mode 100644
index 0000000000..13275d9257
--- /dev/null
+++ b/java-python-interop/src/test/resources/hello.py
@@ -0,0 +1 @@
+print("Hello Baeldung Readers!!")
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 34703c6f73..f750ea8869 100644
--- a/pom.xml
+++ b/pom.xml
@@ -461,7 +461,8 @@
                 <module>java-lite</module>
                 <module>java-numbers</module>
                 <module>java-numbers-2</module>
-                <module>java-numbers-3</module>
+		<module>java-numbers-3</module>
+		<module>java-python-interop</module>
                 <module>java-rmi</module>
                 <module>java-spi</module>
                 <module>java-vavr-stream</module>

From 020837fa2f2feb4295a315ff285691a459ba54a9 Mon Sep 17 00:00:00 2001
From: sasam0320 <63002713+sasam0320@users.noreply.github.com>
Date: Wed, 13 May 2020 11:09:41 +0200
Subject: [PATCH 306/404] BAEL 3234 - Add missing code snippets from the Spring
 Properties article (#9280)

---
 .../main/resources/configForDbProperties.xml  | 19 +++++++++++++++++++
 .../main/resources/configForProperties.xml    |  3 ++-
 .../src/main/resources/database.properties    |  5 +++--
 ...plePropertiesXmlConfigIntegrationTest.java |  2 +-
 4 files changed, 25 insertions(+), 4 deletions(-)
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/configForDbProperties.xml

diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForDbProperties.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForDbProperties.xml
new file mode 100644
index 0000000000..00fd5f0508
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForDbProperties.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
+      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
+      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
+>
+
+    <context:property-placeholder location="classpath:database.properties"/>
+
+
+    <bean id="dataSource" class="com.baeldung.configurationproperties.Database">
+        <property name="url" value="${jdbc.url}" />
+        <property name="username" value="${database.username}" />
+        <property name="password" value="${database.password}" />
+    </bean>
+
+</beans>
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
index 4468bb485f..bf4452da4a 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
@@ -7,7 +7,8 @@
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
 >
 
-    <context:property-placeholder location="classpath:foo.properties,classpath:bar.properties, classpath:database.properties"/>
+
+    <context:property-placeholder location="classpath:foo.properties,classpath:bar.properties,classpath:database.properties"/>
 
     <bean id="componentInXmlUsingProperties" class="com.baeldung.properties.core.ComponentInXmlUsingProperties">
         <constructor-arg value="${key.something}"/>
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
index 6524ce6109..eb5703ca72 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
@@ -1,4 +1,5 @@
-database.url=jdbc:postgresql:/localhost:5432/instance
+
+jdbc.url=jdbc:postgresql:/localhost:5432
 database.username=foo
 database.password=bar
-jdbc.url=jdbc:postgresql:/localhost:5432
\ No newline at end of file
+
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
index 6827ee1cf1..2150d4b3ec 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
@@ -6,7 +6,7 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-@SpringJUnitConfig(locations = "classpath:configForProperties.xml")
+@SpringJUnitConfig(locations = {"classpath:configForProperties.xml", "classpath:configForDbProperties.xml"})
 public class MultiplePropertiesXmlConfigIntegrationTest {
 
     @Value("${key.something}") private String something;

From b48a87a352ac4d8fec84c257fcb182111a8f6e83 Mon Sep 17 00:00:00 2001
From: Benjamin Caure <bcaure@gmail.com>
Date: Wed, 13 May 2020 17:43:22 +0200
Subject: [PATCH 307/404] Copy "BSON to JSON" tutorial entities to dedicated
 package (#9283)

com.baeldung.bsontojson
---
 .../java/com/baeldung/bsontojson/Book.java    | 168 ++++++++++++++++++
 .../com/baeldung/bsontojson/Publisher.java    |  70 ++++++++
 .../bsontojson/BsonToJsonLiveTest.java        |  22 +--
 3 files changed, 242 insertions(+), 18 deletions(-)
 create mode 100644 persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java
 create mode 100644 persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Publisher.java

diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java
new file mode 100644
index 0000000000..44e4ecb539
--- /dev/null
+++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java
@@ -0,0 +1,168 @@
+package com.baeldung.bsontojson;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.Set;
+
+import dev.morphia.annotations.Embedded;
+import dev.morphia.annotations.Entity;
+import dev.morphia.annotations.Field;
+import dev.morphia.annotations.Id;
+import dev.morphia.annotations.Index;
+import dev.morphia.annotations.IndexOptions;
+import dev.morphia.annotations.Indexes;
+import dev.morphia.annotations.Property;
+import dev.morphia.annotations.Reference;
+import dev.morphia.annotations.Validation;
+
+@Entity("Books")
+@Indexes({ @Index(fields = @Field("title"), options = @IndexOptions(name = "book_title")) })
+@Validation("{ price : { $gt : 0 } }")
+public class Book {
+    @Id
+    private String isbn;
+    @Property
+    private String title;
+    private String author;
+    @Embedded
+    private Publisher publisher;
+    @Property("price")
+    private double cost;
+    @Reference
+    private Set<Book> companionBooks;
+    @Property
+    private LocalDateTime publishDate;
+
+    public Book() {
+
+    }
+
+    public Book(String isbn, String title, String author, double cost, Publisher publisher) {
+        this.isbn = isbn;
+        this.title = title;
+        this.author = author;
+        this.cost = cost;
+        this.publisher = publisher;
+        this.companionBooks = new HashSet<>();
+    }
+
+    // Getters and setters ...
+    public String getIsbn() {
+        return isbn;
+    }
+
+    public Book setIsbn(String isbn) {
+        this.isbn = isbn;
+        return this;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public Book setTitle(String title) {
+        this.title = title;
+        return this;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public Book setAuthor(String author) {
+        this.author = author;
+        return this;
+    }
+
+    public Publisher getPublisher() {
+        return publisher;
+    }
+
+    public Book setPublisher(Publisher publisher) {
+        this.publisher = publisher;
+        return this;
+    }
+
+    public double getCost() {
+        return cost;
+    }
+
+    public Book setCost(double cost) {
+        this.cost = cost;
+        return this;
+    }
+
+    public LocalDateTime getPublishDate() {
+        return publishDate;
+    }
+
+    public Book setPublishDate(LocalDateTime publishDate) {
+        this.publishDate = publishDate;
+        return this;
+    }
+
+    public Set<Book> getCompanionBooks() {
+        return companionBooks;
+    }
+
+    public Book addCompanionBooks(Book book) {
+        if (companionBooks != null)
+            this.companionBooks.add(book);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "Book [isbn=" + isbn + ", title=" + title + ", author=" + author + ", publisher=" + publisher + ", cost=" + cost + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((author == null) ? 0 : author.hashCode());
+        long temp;
+        temp = Double.doubleToLongBits(cost);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        result = prime * result + ((isbn == null) ? 0 : isbn.hashCode());
+        result = prime * result + ((publisher == null) ? 0 : publisher.hashCode());
+        result = prime * result + ((title == null) ? 0 : title.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Book other = (Book) obj;
+        if (author == null) {
+            if (other.author != null)
+                return false;
+        } else if (!author.equals(other.author))
+            return false;
+        if (Double.doubleToLongBits(cost) != Double.doubleToLongBits(other.cost))
+            return false;
+        if (isbn == null) {
+            if (other.isbn != null)
+                return false;
+        } else if (!isbn.equals(other.isbn))
+            return false;
+        if (publisher == null) {
+            if (other.publisher != null)
+                return false;
+        } else if (!publisher.equals(other.publisher))
+            return false;
+        if (title == null) {
+            if (other.title != null)
+                return false;
+        } else if (!title.equals(other.title))
+            return false;
+        return true;
+    }
+
+}
diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Publisher.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Publisher.java
new file mode 100644
index 0000000000..1ab262c82b
--- /dev/null
+++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Publisher.java
@@ -0,0 +1,70 @@
+package com.baeldung.bsontojson;
+
+import org.bson.types.ObjectId;
+
+import dev.morphia.annotations.Entity;
+import dev.morphia.annotations.Id;
+
+@Entity
+public class Publisher {
+
+    @Id
+    private ObjectId id;
+    private String name;
+
+    public Publisher() {
+
+    }
+
+    public Publisher(ObjectId id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public ObjectId getId() {
+        return id;
+    }
+
+    public void setId(ObjectId id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return "Catalog [id=" + id + ", name=" + name + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Publisher other = (Publisher) obj;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
+        return true;
+    }
+
+}
diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java
index 4e70394069..12053523f8 100644
--- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java
+++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java
@@ -2,32 +2,18 @@ package com.baeldung.bsontojson;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
-import java.sql.Timestamp;
-import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.TimeZone;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.bson.Document;
-import org.bson.json.Converter;
 import org.bson.json.JsonMode;
 import org.bson.json.JsonWriterSettings;
-import org.bson.json.StrictJsonWriter;
 import org.bson.types.ObjectId;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.jupiter.api.AfterEach;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import com.baeldung.morphia.domain.Book;
-import com.baeldung.morphia.domain.Publisher;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoDatabase;
 
@@ -42,7 +28,7 @@ public class BsonToJsonLiveTest {
     @BeforeClass
     public static void setUp() {
         Morphia morphia = new Morphia();
-        morphia.mapPackage("com.baeldung.morphia");
+        morphia.mapPackage("com.baeldung.bsontojson");
         datastore = morphia.createDatastore(new MongoClient(), DB_NAME);
         datastore.ensureIndexes();
         
@@ -72,7 +58,7 @@ public class BsonToJsonLiveTest {
         }
         
         String expectedJson = "{\"_id\": \"isbn\", " + 
-            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
+            "\"className\": \"com.baeldung.bsontojson.Book\", " + 
             "\"title\": \"title\", " + 
             "\"author\": \"author\", " + 
             "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
@@ -100,7 +86,7 @@ public class BsonToJsonLiveTest {
         }
         
         String expectedJson = "{\"_id\": \"isbn\", " + 
-            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
+            "\"className\": \"com.baeldung.bsontojson.Book\", " + 
             "\"title\": \"title\", " + 
             "\"author\": \"author\", " + 
             "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 
@@ -127,7 +113,7 @@ public class BsonToJsonLiveTest {
         }
 
         String expectedJson = "{\"_id\": \"isbn\", " + 
-            "\"className\": \"com.baeldung.morphia.domain.Book\", " + 
+            "\"className\": \"com.baeldung.bsontojson.Book\", " + 
             "\"title\": \"title\", " + 
             "\"author\": \"author\", " + 
             "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + 

From 34bbce79950ca2808ee0307fc23c9c109f7b2437 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Wed, 13 May 2020 23:19:54 +0530
Subject: [PATCH 308/404] refactor to move pricing plan logic out into a
 separate class

---
 ...tingApp.java => Bucket4jRateLimitApp.java} |  4 +--
 ...tingApp.java => Bucket4jRateLimitApp.java} | 14 +++++---
 ...rceptor.java => RateLimitInterceptor.java} | 32 +++++++------------
 .../{interceptor => service}/PricingPlan.java |  4 +--
 .../service/PricingPlanService.java           | 32 +++++++++++++++++++
 .../application-bucket4j-starter.yml          |  7 ++--
 .../ratelimiting/application-bucket4j.yml     |  8 ++++-
 7 files changed, 67 insertions(+), 34 deletions(-)
 rename spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/{Bucket4jRateLimitingApp.java => Bucket4jRateLimitApp.java} (88%)
 rename spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/{Bucket4jRateLimitingApp.java => Bucket4jRateLimitApp.java} (73%)
 rename spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/{RateLimitingInterceptor.java => RateLimitInterceptor.java} (68%)
 rename spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/{interceptor => service}/PricingPlan.java (86%)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitApp.java
similarity index 88%
rename from spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java
rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitApp.java
index de2ab41bf0..f16d347f85 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitingApp.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jRateLimitApp.java
@@ -11,10 +11,10 @@ import org.springframework.cache.annotation.EnableCaching;
     SecurityAutoConfiguration.class,
 })
 @EnableCaching
-public class Bucket4jRateLimitingApp {
+public class Bucket4jRateLimitApp {
 
   public static void main(String[] args) {
-    new SpringApplicationBuilder(Bucket4jRateLimitingApp.class)
+    new SpringApplicationBuilder(Bucket4jRateLimitApp.class)
         .properties("spring.config.location=classpath:ratelimiting/application-bucket4j-starter.yml")
         .run(args);
   }
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitApp.java
similarity index 73%
rename from spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java
rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitApp.java
index 2a42448b35..bb179b9b38 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitingApp.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitApp.java
@@ -1,28 +1,34 @@
 package com.baeldung.ratelimiting.bucket4japp;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
 import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
-import com.baeldung.ratelimiting.bucket4japp.interceptor.RateLimitingInterceptor;
+import com.baeldung.ratelimiting.bucket4japp.interceptor.RateLimitInterceptor;
 
 @SpringBootApplication(scanBasePackages = "com.baeldung.ratelimiting", exclude = { 
         DataSourceAutoConfiguration.class,
         SecurityAutoConfiguration.class
 })
-public class Bucket4jRateLimitingApp implements WebMvcConfigurer {
+public class Bucket4jRateLimitApp implements WebMvcConfigurer {
+    
+    @Autowired
+    @Lazy
+    private RateLimitInterceptor interceptor;
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(new RateLimitingInterceptor())
+        registry.addInterceptor(interceptor)
             .addPathPatterns("/api/v1/area/**");
     }
 
     public static void main(String[] args) {
-        new SpringApplicationBuilder(Bucket4jRateLimitingApp.class)
+        new SpringApplicationBuilder(Bucket4jRateLimitApp.class)
             .properties("spring.config.location=classpath:ratelimiting/application-bucket4j.yml")
             .run(args);
     }
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
similarity index 68%
rename from spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java
rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
index 8aa8de531c..c983251e56 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitingInterceptor.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
@@ -1,38 +1,39 @@
 package com.baeldung.ratelimiting.bucket4japp.interceptor;
 
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 
-import io.github.bucket4j.Bandwidth;
+import com.baeldung.ratelimiting.bucket4japp.service.PricingPlanService;
+
 import io.github.bucket4j.Bucket;
-import io.github.bucket4j.Bucket4j;
 import io.github.bucket4j.ConsumptionProbe;
 
-public class RateLimitingInterceptor implements HandlerInterceptor {
+@Component
+public class RateLimitInterceptor implements HandlerInterceptor {
 
     private static final String HEADER_API_KEY = "X-api-key";
     private static final String HEADER_LIMIT_REMAINING = "X-Rate-Limit-Remaining";
     private static final String HEADER_RETRY_AFTER = "X-Rate-Limit-Retry-After-Milliseconds";
 
-    private final Map<String, Bucket> cache = new ConcurrentHashMap<>();
+    @Autowired
+    private PricingPlanService pricingPlanService;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        
+
         String apiKey = request.getHeader(HEADER_API_KEY);
 
         if (apiKey == null || apiKey.isEmpty()) {
             response.sendError(HttpStatus.BAD_REQUEST.value(), "Missing Header: " + HEADER_API_KEY);
             return false;
         }
-        
-        Bucket tokenBucket = cache.computeIfAbsent(apiKey, this::resolveBucket);
+
+        Bucket tokenBucket = pricingPlanService.resolveBucket(apiKey);
 
         ConsumptionProbe probe = tokenBucket.tryConsumeAndReturnRemaining(1);
 
@@ -51,15 +52,4 @@ public class RateLimitingInterceptor implements HandlerInterceptor {
             return false;
         }
     }
-
-    private Bucket resolveBucket(String apiKey) {
-        PricingPlan pricingPlan = PricingPlan.resolvePlanFromApiKey(apiKey);
-        return bucket(pricingPlan.getLimit());
-    }
-    
-    private Bucket bucket(Bandwidth limit) {
-        return Bucket4j.builder()
-            .addLimit(limit)
-            .build();
-    }
 }
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
similarity index 86%
rename from spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java
rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
index e2b3ccb6c6..85632abf0b 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/PricingPlan.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
@@ -1,4 +1,4 @@
-package com.baeldung.ratelimiting.bucket4japp.interceptor;
+package com.baeldung.ratelimiting.bucket4japp.service;
 
 import java.time.Duration;
 
@@ -11,7 +11,7 @@ enum PricingPlan {
 
         @Override
         Bandwidth getLimit() {
-            return Bandwidth.classic(20, Refill.intervally(20, Duration.ofHours(1)));
+            return Bandwidth.classic(2, Refill.intervally(2 , Duration.ofHours(1)));
         }
     },
 
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java
new file mode 100644
index 0000000000..713f4a6e1a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java
@@ -0,0 +1,32 @@
+package com.baeldung.ratelimiting.bucket4japp.service;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.stereotype.Service;
+
+import io.github.bucket4j.Bandwidth;
+import io.github.bucket4j.Bucket;
+import io.github.bucket4j.Bucket4j;
+
+@Service
+public class PricingPlanService {
+
+    private final Map<String, Bucket> cache = new ConcurrentHashMap<>();
+
+    // @Cacheable("rate-limit-buckets")
+    public Bucket resolveBucket(String apiKey) {
+        return cache.computeIfAbsent(apiKey, this::newBucket);
+    }
+
+    private Bucket newBucket(String apiKey) {
+        PricingPlan pricingPlan = PricingPlan.resolvePlanFromApiKey(apiKey);
+        return bucket(pricingPlan.getLimit());
+    }
+
+    private Bucket bucket(Bandwidth limit) {
+        return Bucket4j.builder()
+            .addLimit(limit)
+            .build();
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml
index 1c1337c611..ecc9f22e0a 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml
@@ -3,21 +3,21 @@ server:
 
 spring:
   application:
-    name: bucket4j-starter-api-rate-limiting-app
+    name: bucket4j-starter-api-rate-limit-app
   mvc:
     throw-exception-if-no-handler-found: true
   resources:
     add-mappings: false
   cache:
     cache-names:
-    - rate-limiting-buckets
+    - rate-limit-buckets
     caffeine:
       spec: maximumSize=100000,expireAfterAccess=3600s
 
 bucket4j:
   enabled: true
   filters:
-  - cache-name: rate-limiting-buckets
+  - cache-name: rate-limit-buckets
     url: /api/v1/area.*
     http-response-body: "{ \"status\": 429, \"error\": \"Too Many Requests\", \"message\": \"You have exhausted your API Request Quota\" }"
     rate-limits:
@@ -38,4 +38,3 @@ bucket4j:
       - capacity: 20
         time: 1
         unit: hours
-        
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
index 1fb4d2cf12..0cee593261 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
@@ -3,8 +3,14 @@ server:
 
 spring:
   application:
-    name: bucket4j-api-rate-limiting-app
+    name: bucket4j-api-rate-limit-app
   mvc:
     throw-exception-if-no-handler-found: true
   resources:
     add-mappings: false
+  cache:
+    cache-names:
+    - rate-limit-buckets
+    caffeine:
+      spec: maximumSize=100000,expireAfterAccess=3600s
+    
\ No newline at end of file

From 911f840af59281685b6c6c95ad56a4a1777c3a9d Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Wed, 13 May 2020 23:24:55 +0530
Subject: [PATCH 309/404] some cleanup

---
 .../bucket4japp/service/PricingPlanService.java             | 1 -
 .../main/resources/ratelimiting/application-bucket4j.yml    | 6 ------
 2 files changed, 7 deletions(-)

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java
index 713f4a6e1a..7d8a718601 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java
@@ -14,7 +14,6 @@ public class PricingPlanService {
 
     private final Map<String, Bucket> cache = new ConcurrentHashMap<>();
 
-    // @Cacheable("rate-limit-buckets")
     public Bucket resolveBucket(String apiKey) {
         return cache.computeIfAbsent(apiKey, this::newBucket);
     }
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
index 0cee593261..ae19622d9b 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
+++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j.yml
@@ -8,9 +8,3 @@ spring:
     throw-exception-if-no-handler-found: true
   resources:
     add-mappings: false
-  cache:
-    cache-names:
-    - rate-limit-buckets
-    caffeine:
-      spec: maximumSize=100000,expireAfterAccess=3600s
-    
\ No newline at end of file

From 7a6eb5d217c1d3fc418d68e2a7645f78f6a6ad5a Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Wed, 13 May 2020 16:33:31 -0400
Subject: [PATCH 310/404] Bael-3893 - Fixed tests causing build to fail

---
 .../java/com/baeldung/awsappsync/AppSyncClientHelper.java     | 4 ++--
 .../com/baeldung/awsappsync/AwsAppSyncApplicationTests.java   | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
index b310e60748..f66ac1841b 100644
--- a/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
+++ b/aws-app-sync/src/main/java/com/baeldung/awsappsync/AppSyncClientHelper.java
@@ -10,8 +10,8 @@ import java.util.Map;
 
 public class AppSyncClientHelper {
 
-    static String apiUrl = "https://m4i3b6icrrb7livfbypfspiifi.appsync-api.us-east-2.amazonaws.com";
-    static String apiKey = "da2-bm4rpatkkrc5jfyhvvq7itjeke";
+    static String apiUrl = "<INSERT API URL HERE>";
+    static String apiKey = "<INSERT API KEY HERE>";
     static String API_KEY_HEADER = "x-api-key";
 
     public static WebClient.ResponseSpec getResponseBodySpec(Map<String, Object> requestBody) {
diff --git a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
index 22d99959b3..2338cc29a1 100644
--- a/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
+++ b/aws-app-sync/src/test/java/com/baeldung/awsappsync/AwsAppSyncApplicationTests.java
@@ -1,5 +1,6 @@
 package com.baeldung.awsappsync;
 
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.web.reactive.function.client.WebClient;
@@ -10,6 +11,7 @@ import java.util.Map;
 import static org.junit.jupiter.api.Assertions.*;
 
 @SpringBootTest
+@Disabled
 class AwsAppSyncApplicationTests {
 
     @Test

From f304437ed8959bf3d4d3c6440f64ba9afa5e8c38 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Thu, 14 May 2020 02:26:46 +0530
Subject: [PATCH 311/404] retry after secomds

---
 .../bucket4japp/interceptor/RateLimitInterceptor.java       | 6 +++---
 .../ratelimiting/bucket4japp/service/PricingPlan.java       | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
index c983251e56..d919214983 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
@@ -18,7 +18,7 @@ public class RateLimitInterceptor implements HandlerInterceptor {
 
     private static final String HEADER_API_KEY = "X-api-key";
     private static final String HEADER_LIMIT_REMAINING = "X-Rate-Limit-Remaining";
-    private static final String HEADER_RETRY_AFTER = "X-Rate-Limit-Retry-After-Milliseconds";
+    private static final String HEADER_RETRY_AFTER = "X-Rate-Limit-Retry-After-Seconds";
 
     @Autowired
     private PricingPlanService pricingPlanService;
@@ -44,10 +44,10 @@ public class RateLimitInterceptor implements HandlerInterceptor {
 
         } else {
 
-            long waitForRefillMilli = probe.getNanosToWaitForRefill() % 1_000_000;
+            long waitForRefill = probe.getNanosToWaitForRefill() % 1_000_000_000;
 
             response.sendError(HttpStatus.TOO_MANY_REQUESTS.value(), "You have exhausted your API Request Quota"); // 429
-            response.addHeader(HEADER_RETRY_AFTER, String.valueOf(waitForRefillMilli));
+            response.addHeader(HEADER_RETRY_AFTER, String.valueOf(waitForRefill));
 
             return false;
         }
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
index 85632abf0b..e8b5513e8b 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
@@ -11,7 +11,7 @@ enum PricingPlan {
 
         @Override
         Bandwidth getLimit() {
-            return Bandwidth.classic(2, Refill.intervally(2 , Duration.ofHours(1)));
+            return Bandwidth.classic(20, Refill.intervally(20, Duration.ofHours(1)));
         }
     },
 

From f58c322ae2c2500f14033f88eda10e7c20aaa3d9 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Thu, 14 May 2020 12:13:53 +0530
Subject: [PATCH 312/404] JAVA-943: Migrate spring-mobile to parent-boot-2

---
 spring-mobile/pom.xml                         | 19 ++++++++--
 .../src/main/java/com/baeldung/AppConfig.java | 36 +++++++++++++++++++
 .../baeldung/controller/IndexController.java  |  5 ++-
 .../src/main/resources/application.properties |  4 ++-
 4 files changed, 59 insertions(+), 5 deletions(-)
 create mode 100644 spring-mobile/src/main/java/com/baeldung/AppConfig.java

diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml
index ff90ac6ecb..465458ba49 100644
--- a/spring-mobile/pom.xml
+++ b/spring-mobile/pom.xml
@@ -10,9 +10,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
@@ -23,11 +23,24 @@
         <dependency>
             <groupId>org.springframework.mobile</groupId>
             <artifactId>spring-mobile-device</artifactId>
+            <version>${spring-mobile-device.version}</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-freemarker</artifactId>
         </dependency>
     </dependencies>
-
+    <repositories>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/libs-milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+    <properties>
+        <spring-mobile-device.version>2.0.0.M3</spring-mobile-device.version>
+    </properties>
 </project>
diff --git a/spring-mobile/src/main/java/com/baeldung/AppConfig.java b/spring-mobile/src/main/java/com/baeldung/AppConfig.java
new file mode 100644
index 0000000000..efa073ae11
--- /dev/null
+++ b/spring-mobile/src/main/java/com/baeldung/AppConfig.java
@@ -0,0 +1,36 @@
+package com.baeldung;
+
+import java.util.List;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver;
+import org.springframework.mobile.device.DeviceResolverHandlerInterceptor;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class AppConfig implements WebMvcConfigurer {
+
+    @Bean
+    public DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() {
+        return new DeviceResolverHandlerInterceptor();
+    }
+
+    @Bean
+    public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
+        return new DeviceHandlerMethodArgumentResolver();
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(deviceResolverHandlerInterceptor());
+    }
+
+    @Override
+    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
+        argumentResolvers.add(deviceHandlerMethodArgumentResolver());
+    }
+
+}
diff --git a/spring-mobile/src/main/java/com/baeldung/controller/IndexController.java b/spring-mobile/src/main/java/com/baeldung/controller/IndexController.java
index 196fb680e7..49880f355a 100644
--- a/spring-mobile/src/main/java/com/baeldung/controller/IndexController.java
+++ b/spring-mobile/src/main/java/com/baeldung/controller/IndexController.java
@@ -16,13 +16,16 @@ public class IndexController {
 
 		String deviceType = "browser";
 		String platform = "browser";
+		String viewName = "index";
 
 		if (device.isNormal()) {
 			deviceType = "browser";
 		} else if (device.isMobile()) {
 			deviceType = "mobile";
+			viewName = "mobile/index";
 		} else if (device.isTablet()) {
 			deviceType = "tablet";
+			viewName = "tablet/index";
 		}
 
 		platform = device.getDevicePlatform().name();
@@ -33,7 +36,7 @@ public class IndexController {
 
 		LOGGER.info("Client Device Type: " + deviceType + ", Platform: " + platform);
 
-		return "index";
+		return viewName;
 	}
 
 }
diff --git a/spring-mobile/src/main/resources/application.properties b/spring-mobile/src/main/resources/application.properties
index c0bc91f9ac..7d964f48fb 100644
--- a/spring-mobile/src/main/resources/application.properties
+++ b/spring-mobile/src/main/resources/application.properties
@@ -1 +1,3 @@
-spring.mobile.devicedelegatingviewresolver.enabled: true
\ No newline at end of file
+spring.mobile.devicedelegatingviewresolver.enabled: true
+spring.freemarker.template-loader-path: classpath:/templates
+spring.freemarker.suffix: .ftl
\ No newline at end of file

From 3c9b335ed5d48c0ae19557732ce46470350c58bf Mon Sep 17 00:00:00 2001
From: Roque Santos <roquesantosdev@gmail.com>
Date: Thu, 14 May 2020 13:56:35 -0300
Subject: [PATCH 313/404] BAEL-3942 : Correct failing build (#9289)

Changed IntegrationTest to LiveTest
---
 .../jsonproxy/JsoupProxyLiveTest.java         | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyLiveTest.java

diff --git a/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyLiveTest.java b/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyLiveTest.java
new file mode 100644
index 0000000000..931464c4db
--- /dev/null
+++ b/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyLiveTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.jsonproxy;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+
+import org.jsoup.Jsoup;
+import org.junit.Test;
+
+public class JsoupProxyLiveTest {
+
+    @Test
+    public void whenUsingHostAndPort_thenConnect() throws IOException {
+        Jsoup.connect("https://spring.io/blog")
+            .proxy("200.216.227.141", 53281)
+            .get();
+    }
+
+    @Test
+    public void whenUsingProxyClass_thenConnect() throws IOException {
+        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("200.216.227.141", 53281));
+
+        Jsoup.connect("https://spring.io/blog")
+            .proxy(proxy)
+            .get();
+    }
+}

From b2ce70b8fb9509ef7e24678e0939b167e067525b Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Fri, 15 May 2020 23:06:26 +0800
Subject: [PATCH 314/404] Create README.md

---
 libraries-concurrency/coroutines-with-quasar/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 libraries-concurrency/coroutines-with-quasar/README.md

diff --git a/libraries-concurrency/coroutines-with-quasar/README.md b/libraries-concurrency/coroutines-with-quasar/README.md
new file mode 100644
index 0000000000..d1ffe81fa8
--- /dev/null
+++ b/libraries-concurrency/coroutines-with-quasar/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Intro to Coroutines with Quasar](https://www.baeldung.com/java-quasar-coroutines)

From f139085a1de085cee528b95ee95d2747f5e2f891 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Fri, 15 May 2020 23:07:50 +0800
Subject: [PATCH 315/404] Create README.md

---
 apache-cxf/cxf-aegis/README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 apache-cxf/cxf-aegis/README.md

diff --git a/apache-cxf/cxf-aegis/README.md b/apache-cxf/cxf-aegis/README.md
new file mode 100644
index 0000000000..1cdb6efbb5
--- /dev/null
+++ b/apache-cxf/cxf-aegis/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)

From 536feb6fae354937276faa89a3d5fbfed0e39ade Mon Sep 17 00:00:00 2001
From: Sam Millington <s.j.millington@hotmail.co.uk>
Date: Fri, 15 May 2020 16:32:16 +0100
Subject: [PATCH 316/404] Deleted JsoupProxyIntegrationTest.java (#9294)

---
 .../jsonproxy/JsoupProxyIntegrationTest.java  | 27 -------------------
 1 file changed, 27 deletions(-)
 delete mode 100644 jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java

diff --git a/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java b/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java
deleted file mode 100644
index 8e854ead6a..0000000000
--- a/jsoup/src/test/java/com/baeldung/jsonproxy/JsoupProxyIntegrationTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.baeldung.jsonproxy;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Proxy;
-
-import org.jsoup.Jsoup;
-import org.junit.Test;
-
-public class JsoupProxyIntegrationTest {
-
-    @Test
-    public void whenUsingHostAndPort_thenConnect() throws IOException {
-        Jsoup.connect("https://spring.io/blog")
-            .proxy("200.216.227.141", 53281)
-            .get();
-    }
-
-    @Test
-    public void whenUsingProxyClass_thenConnect() throws IOException {
-        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("200.216.227.141", 53281));
-
-        Jsoup.connect("https://spring.io/blog")
-            .proxy(proxy)
-            .get();
-    }
-}

From b20271ef347e3458b13a9845c6a14a809ebd53e3 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Sat, 16 May 2020 02:57:46 +0800
Subject: [PATCH 317/404] Update README.md

---
 libraries-concurrency/README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/libraries-concurrency/README.md b/libraries-concurrency/README.md
index d1ffe81fa8..8b13789179 100644
--- a/libraries-concurrency/README.md
+++ b/libraries-concurrency/README.md
@@ -1,3 +1 @@
-### Relevant Articles:
 
-- [Intro to Coroutines with Quasar](https://www.baeldung.com/java-quasar-coroutines)

From b660f1cefa61caa3967941fba7fb119466730eec Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Sat, 16 May 2020 02:57:55 +0800
Subject: [PATCH 318/404] Delete README.md

---
 libraries-concurrency/README.md | 1 -
 1 file changed, 1 deletion(-)
 delete mode 100644 libraries-concurrency/README.md

diff --git a/libraries-concurrency/README.md b/libraries-concurrency/README.md
deleted file mode 100644
index 8b13789179..0000000000
--- a/libraries-concurrency/README.md
+++ /dev/null
@@ -1 +0,0 @@
-

From afeeba6ef5749d571f860d934acb7f6a8d593d77 Mon Sep 17 00:00:00 2001
From: johnA1331 <53036378+johnA1331@users.noreply.github.com>
Date: Sat, 16 May 2020 02:58:46 +0800
Subject: [PATCH 319/404] Update README.md

---
 apache-cxf/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apache-cxf/README.md b/apache-cxf/README.md
index f825b85bb3..bedd19a91a 100644
--- a/apache-cxf/README.md
+++ b/apache-cxf/README.md
@@ -3,7 +3,7 @@
 This module contains articles about Apache CXF
 
 ## Relevant Articles:
-- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
+
 - [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api)
 - [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring)
 - [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf)

From faf562e8210bb9e8594c02d28585cc7354ba8c48 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Sat, 16 May 2020 01:34:34 +0530
Subject: [PATCH 320/404] add basic usage as test

---
 .../bucket4j/Bucket4jUsageTest.java           | 82 +++++++++++++++++++
 1 file changed, 82 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java

diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java
new file mode 100644
index 0000000000..247e493324
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java
@@ -0,0 +1,82 @@
+package com.baledung.ratelimiting.bucket4j;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Duration;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.jupiter.api.Test;
+
+import io.github.bucket4j.Bandwidth;
+import io.github.bucket4j.Bucket;
+import io.github.bucket4j.Bucket4j;
+import io.github.bucket4j.Refill;
+
+public class Bucket4jUsageTest {
+
+    @Test
+    public void givenBucketLimit_whenExceedLimit_thenConsumeReturnsFalse() {
+        Refill refill = Refill.intervally(10, Duration.ofMinutes(1));
+        Bandwidth limit = Bandwidth.classic(10, refill);
+        Bucket bucket = Bucket4j.builder()
+            .addLimit(limit)
+            .build();
+
+        for (int i = 1; i <= 10; i++) {
+            assertTrue(bucket.tryConsume(1));
+        }
+        assertFalse(bucket.tryConsume(1));
+    }
+
+    @Test
+    public void givenMultipletLimits_whenExceedSmallerLimit_thenConsumeReturnsFalse() {
+        Bucket bucket = Bucket4j.builder()
+            .addLimit(Bandwidth.classic(10, Refill.intervally(10, Duration.ofMinutes(1))))
+            .addLimit(Bandwidth.classic(5, Refill.intervally(5, Duration.ofSeconds(20))))
+            .build();
+
+        for (int i = 1; i <= 5; i++) {
+            assertTrue(bucket.tryConsume(1));
+        }
+        assertFalse(bucket.tryConsume(1));
+    }
+
+    @Test
+    public void givenBucketLimit_whenThrottleRequests_thenConsumeReturnsTrue() throws InterruptedException {
+        Refill refill = Refill.intervally(1, Duration.ofSeconds(2));
+        Bandwidth limit = Bandwidth.classic(1, refill);
+        Bucket bucket = Bucket4j.builder()
+            .addLimit(limit)
+            .build();
+
+        assertTrue(bucket.tryConsume(1));
+
+        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+        CountDownLatch latch = new CountDownLatch(1);
+
+        executor.schedule(new AssertTryConsume(bucket, latch), 2, TimeUnit.SECONDS);
+
+        latch.await();
+    }
+
+    static class AssertTryConsume implements Runnable {
+
+        private Bucket bucket;
+        private CountDownLatch latch;
+
+        AssertTryConsume(Bucket bucket, CountDownLatch latch) {
+            this.bucket = bucket;
+            this.latch = latch;
+        }
+
+        @Override
+        public void run() {
+            assertTrue(bucket.tryConsume(1));
+            latch.countDown();
+        }
+    }
+}

From f7c396df274ffd374bf12ff2aa5e6b8aca81f58d Mon Sep 17 00:00:00 2001
From: Grzegorz Piwowarek <gpiwowarek@gmail.com>
Date: Fri, 15 May 2020 22:14:25 +0200
Subject: [PATCH 321/404] Update build.gradle

---
 gradle/gradle-employee-app/build.gradle | 1 -
 1 file changed, 1 deletion(-)

diff --git a/gradle/gradle-employee-app/build.gradle b/gradle/gradle-employee-app/build.gradle
index 19b80c0c4a..b343d2b210 100644
--- a/gradle/gradle-employee-app/build.gradle
+++ b/gradle/gradle-employee-app/build.gradle
@@ -1,6 +1,5 @@
 
 plugins {
-    id 'java-library'
     id 'application'
 }
 

From 3977ef96c681bcf1731763ac3fe07898c0efabcb Mon Sep 17 00:00:00 2001
From: CHANDRAKANT Kumar <kumar.chandrakant@soprabanking.com>
Date: Sat, 16 May 2020 01:46:02 +0530
Subject: [PATCH 322/404] Incorporated review comments from editor.

---
 {java-es-cqrs => patterns/cqrs-es}/pom.xml                  | 6 +++---
 .../baeldung/patterns/cqrs/aggregates/UserAggregate.java    | 0
 .../baeldung/patterns/cqrs/commands/CreateUserCommand.java  | 0
 .../baeldung/patterns/cqrs/commands/UpdateUserCommand.java  | 0
 .../baeldung/patterns/cqrs/projections/UserProjection.java  | 0
 .../baeldung/patterns/cqrs/projectors/UserProjector.java    | 0
 .../patterns/cqrs/queries/AddressByRegionQuery.java         | 0
 .../baeldung/patterns/cqrs/queries/ContactByTypeQuery.java  | 0
 .../patterns/cqrs/repository/UserReadRepository.java        | 0
 .../patterns/cqrs/repository/UserWriteRepository.java       | 0
 .../baeldung/patterns/crud/repository/UserRepository.java   | 0
 .../com/baeldung/patterns/crud/service/UserService.java     | 0
 .../src/main/java/com/baeldung/patterns/domain/Address.java | 0
 .../src/main/java/com/baeldung/patterns/domain/Contact.java | 0
 .../src/main/java/com/baeldung/patterns/domain/User.java    | 0
 .../main/java/com/baeldung/patterns/domain/UserAddress.java | 0
 .../main/java/com/baeldung/patterns/domain/UserContact.java | 0
 .../main/java/com/baeldung/patterns/es/events/Event.java    | 0
 .../baeldung/patterns/es/events/UserAddressAddedEvent.java  | 0
 .../patterns/es/events/UserAddressRemovedEvent.java         | 0
 .../baeldung/patterns/es/events/UserContactAddedEvent.java  | 0
 .../patterns/es/events/UserContactRemovedEvent.java         | 0
 .../com/baeldung/patterns/es/events/UserCreatedEvent.java   | 0
 .../com/baeldung/patterns/es/repository/EventStore.java     | 0
 .../java/com/baeldung/patterns/es/service/UserService.java  | 0
 .../java/com/baeldung/patterns/es/service/UserUtility.java  | 0
 .../baeldung/patterns/escqrs/aggregates/UserAggregate.java  | 0
 .../baeldung/patterns/escqrs/projectors/UserProjector.java  | 0
 .../com/baeldung/patterns/cqrs/ApplicationUnitTest.java     | 2 +-
 .../com/baeldung/patterns/crud/ApplicationUnitTest.java     | 2 +-
 .../java/com/baeldung/patterns/es/ApplicationUnitTest.java  | 2 +-
 .../com/baeldung/patterns/escqrs/ApplicationUnitTest.java   | 2 +-
 patterns/pom.xml                                            | 1 +
 pom.xml                                                     | 2 --
 34 files changed, 8 insertions(+), 9 deletions(-)
 rename {java-es-cqrs => patterns/cqrs-es}/pom.xml (88%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/crud/service/UserService.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/Address.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/Contact.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/User.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/UserAddress.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/UserContact.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/Event.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/repository/EventStore.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/service/UserService.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/service/UserUtility.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java (100%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java (96%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java (95%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java (95%)
 rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java (97%)

diff --git a/java-es-cqrs/pom.xml b/patterns/cqrs-es/pom.xml
similarity index 88%
rename from java-es-cqrs/pom.xml
rename to patterns/cqrs-es/pom.xml
index 8760a38262..3c54038837 100644
--- a/java-es-cqrs/pom.xml
+++ b/patterns/cqrs-es/pom.xml
@@ -2,12 +2,12 @@
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">	
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>java-es-cqrs</artifactId>
+    <artifactId>cqrs-es</artifactId>
     <version>1.0-SNAPSHOT</version>
-    <name>java-es-cqrs</name>
+    <name>cqrs-es</name>
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-modules</artifactId>
+        <artifactId>patterns</artifactId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
     <properties>
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/service/UserService.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/service/UserService.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Address.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Address.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Contact.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Contact.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/User.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/User.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserAddress.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserAddress.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserContact.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserContact.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/Event.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/Event.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/repository/EventStore.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/repository/EventStore.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserService.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserService.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserUtility.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
similarity index 100%
rename from java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java
diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
similarity index 96%
rename from java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
index 4a324e72f6..7f68a64274 100644
--- a/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
+++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java
@@ -40,7 +40,7 @@ public class ApplicationUnitTest {
     }
 
     @Test
-    public void testApplication() throws Exception {
+    public void givenCQRSApplication_whenCommandRun_thenQueryShouldReturnResult() throws Exception {
         String userId = UUID.randomUUID()
             .toString();
         User user = null;
diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
similarity index 95%
rename from java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
index 28c113bf46..3fabfe405d 100644
--- a/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
+++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java
@@ -24,7 +24,7 @@ public class ApplicationUnitTest {
     }
 
     @Test
-    public void testApplication() throws Exception {
+    public void givenCRUDApplication_whenDataCreated_thenDataCanBeFetched() throws Exception {
         UserService service = new UserService(repository);
         String userId = UUID.randomUUID()
             .toString();
diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
similarity index 95%
rename from java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
index 52bdde449f..61e7b4c05a 100644
--- a/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
+++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java
@@ -26,7 +26,7 @@ public class ApplicationUnitTest {
     }
 
     @Test
-    public void testApplication() throws Exception {
+    public void givenCRUDApplication_whenDataCreated_thenDataCanBeFetched() throws Exception {
         String userId = UUID.randomUUID()
             .toString();
 
diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
similarity index 97%
rename from java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
index 22cb5235d1..e0460b2f12 100644
--- a/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
+++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java
@@ -41,7 +41,7 @@ public class ApplicationUnitTest {
     }
 
     @Test
-    public void testApplication() throws Exception {
+    public void givenCQRSApplication_whenCommandRun_thenQueryShouldReturnResult() throws Exception {
         String userId = UUID.randomUUID()
             .toString();
         List<Event> events = null;
diff --git a/patterns/pom.xml b/patterns/pom.xml
index 4c17055231..fa46a79f5a 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -21,6 +21,7 @@
         <module>design-patterns-functional</module>
         <module>design-patterns-structural</module>
         <module>dip</module>
+		<module>cqrs-es</module>
         <module>front-controller</module>
         <module>intercepting-filter</module>
         <module>solid</module>
diff --git a/pom.xml b/pom.xml
index 9a4b40b950..2f4579c999 100644
--- a/pom.xml
+++ b/pom.xml
@@ -568,7 +568,6 @@
                 <module>rxjava-operators</module>
 
 				<module>atomikos</module>
-				<module>java-es-cqrs</module>
             </modules>
 
         </profile>
@@ -1084,7 +1083,6 @@
                 <module>rxjava-operators</module>
 
 				<module>atomikos</module>
-				<module>java-es-cqrs</module>
             </modules>
 
         </profile>

From bccc9c836e87bf20a6662c9c9d206949bed7bd04 Mon Sep 17 00:00:00 2001
From: Dhrubajyoti Bhattacharjee <dhruba619@gmail.com>
Date: Fri, 15 May 2020 22:17:08 +0200
Subject: [PATCH 323/404] BAEL-3858 Java Exchanger introduction (#9000)

---
 .../ExchangerPipeLineManualTest.java          | 83 +++++++++++++++++++
 .../baeldung/exchanger/ExchangerUnitTest.java | 63 ++++++++++++++
 2 files changed, 146 insertions(+)
 create mode 100644 core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java
 create mode 100644 core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerUnitTest.java

diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java
new file mode 100644
index 0000000000..093580654b
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.exchanger;
+
+import java.util.Queue;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.Exchanger;
+import java.util.concurrent.ExecutionException;
+import org.junit.Test;
+
+import static java.util.concurrent.CompletableFuture.runAsync;
+
+
+
+public class ExchangerPipeLineManualTest {
+
+    private static final int BUFFER_SIZE = 100;
+
+    @Test
+    public void givenData_whenPassedThrough_thenCorrect() throws InterruptedException, ExecutionException {
+
+        Exchanger<Queue<String>> readerExchanger = new Exchanger<>();
+        Exchanger<Queue<String>> writerExchanger = new Exchanger<>();
+        int counter = 0;
+
+        Runnable reader = () -> {
+            Queue<String> readerBuffer = new ConcurrentLinkedQueue<>();
+            while (true) {
+                readerBuffer.add(UUID.randomUUID().toString());
+                if (readerBuffer.size() >= BUFFER_SIZE) {
+                    try {
+                        readerBuffer = readerExchanger.exchange(readerBuffer);
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        throw new RuntimeException(e);
+                    }
+                }
+            }
+        };
+
+        Runnable processor = () -> {
+            Queue<String> processorBuffer = new ConcurrentLinkedQueue<>();
+            Queue<String> writterBuffer = new ConcurrentLinkedQueue<>();
+            try {
+                processorBuffer = readerExchanger.exchange(processorBuffer);
+                while (true) {
+                    writterBuffer.add(processorBuffer.poll());
+                    if (processorBuffer.isEmpty()) {
+                        try {
+                            processorBuffer = readerExchanger.exchange(processorBuffer);
+                            writterBuffer = writerExchanger.exchange(writterBuffer);
+                        } catch (InterruptedException e) {
+                            Thread.currentThread().interrupt();
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new RuntimeException(e);
+            }
+        };
+
+        Runnable writer = () -> {
+            Queue<String> writterBuffer = new ConcurrentLinkedQueue<>();
+            try {
+                writterBuffer = writerExchanger.exchange(writterBuffer);
+                while (true) {
+                    System.out.println(writterBuffer.poll());
+                    if (writterBuffer.isEmpty()) {
+                        writterBuffer = writerExchanger.exchange(writterBuffer);
+                    }
+                }
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new RuntimeException(e);
+            }
+        };
+
+        CompletableFuture.allOf(runAsync(reader), runAsync(processor), runAsync(writer)).get();
+    }
+
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerUnitTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerUnitTest.java
new file mode 100644
index 0000000000..ec567a3563
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerUnitTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.exchanger;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Exchanger;
+
+import java.util.concurrent.ExecutionException;
+import org.junit.Test;
+
+import static java.util.concurrent.CompletableFuture.runAsync;
+
+public class ExchangerUnitTest {
+    
+    
+    @Test
+    public void givenThreads_whenMessageExchanged_thenCorrect() {
+        Exchanger<String> exchanger = new Exchanger<>();
+
+        Runnable taskA = () -> {
+            try {
+                String message = exchanger.exchange("from A");
+                assertEquals("from B", message);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new RuntimeException(e);
+            }
+        };
+
+        Runnable taskB = () -> {
+            try {
+                String message = exchanger.exchange("from B");
+                assertEquals("from A", message);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new RuntimeException(e);
+            }
+        };
+
+        CompletableFuture.allOf(runAsync(taskA), runAsync(taskB)).join();
+    }
+
+    @Test
+    public void givenThread_WhenExchangedMessage_thenCorrect() throws InterruptedException, ExecutionException {
+        Exchanger<String> exchanger = new Exchanger<>();
+
+        Runnable runner = () -> {
+            try {
+                String message = exchanger.exchange("from runner");
+                assertEquals("to runner", message);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new RuntimeException(e);
+            }
+        };
+
+        CompletableFuture<Void> result = CompletableFuture.runAsync(runner);
+        String msg = exchanger.exchange("to runner");
+        assertEquals("from runner", msg);
+        result.join();
+    }
+
+}

From b707c20297ac4857f314b50efb7d3758aac5e0f7 Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Fri, 15 May 2020 22:26:41 +0200
Subject: [PATCH 324/404] BAEL-4042: Add new test case using
 BufferedReader.lines method (#9288)

---
 .../JavaInputStreamToXUnitTest.java           | 27 ++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java
index eb8c39f2d9..c8c711e328 100644
--- a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java
+++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java
@@ -11,13 +11,26 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.util.Scanner;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
 import static org.hamcrest.Matchers.equalTo;
@@ -46,6 +59,18 @@ public class JavaInputStreamToXUnitTest {
         assertEquals(textBuilder.toString(), originalString);
     }
 
+    @Test
+    public void givenUsingJava8_whenConvertingAnInputStreamToAString_thenCorrect() {
+        final String originalString = randomAlphabetic(DEFAULT_SIZE);
+        final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());
+
+        final String text = new BufferedReader(new InputStreamReader(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))
+          .lines()
+          .collect(Collectors.joining("\n"));
+
+        assertThat(text, equalTo(originalString));
+    }
+
     @Test
     public final void givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException {
         final String originalString = randomAlphabetic(DEFAULT_SIZE);

From 708e85ce38e7bfaaea423e5ea3995fb7abf4aacb Mon Sep 17 00:00:00 2001
From: Sampada <46674082+sampada07@users.noreply.github.com>
Date: Sat, 16 May 2020 02:07:36 +0530
Subject: [PATCH 325/404] BAEL-3493: Spring REST Docs vs OpenAPI (#9295)

---
 .../spring-boot-springdoc/pom.xml             |  50 +++++-
 .../baeldung/restdocopenapi/Application.java  |  28 ++++
 .../java/com/baeldung/restdocopenapi/Foo.java |  93 +++++++++++
 .../restdocopenapi/FooController.java         |  83 ++++++++++
 .../restdocopenapi/FooRepository.java         |   9 ++
 .../springdoc/FooBarController.java           | 121 ++++++++++++++
 .../src/main/resources/application.properties |   5 +-
 .../src/main/resources/asciidocs/fooapi.adoc  | 153 ++++++++++++++++++
 .../src/main/resources/data.sql               |   4 +
 .../src/main/resources/schema.sql             |   8 +
 .../restdoc/SpringRestDocsUnitTest.java       | 120 ++++++++++++++
 11 files changed, 672 insertions(+), 2 deletions(-)
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Application.java
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Foo.java
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooController.java
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooRepository.java
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/springdoc/FooBarController.java
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/resources/asciidocs/fooapi.adoc
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/resources/data.sql
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/resources/schema.sql
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/test/java/com/baeldung/restdocopenapi/restdoc/SpringRestDocsUnitTest.java

diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml
index 375cf06c2c..1c1f27b5a5 100644
--- a/spring-boot-modules/spring-boot-springdoc/pom.xml
+++ b/spring-boot-modules/spring-boot-springdoc/pom.xml
@@ -37,7 +37,7 @@
             <scope>test</scope>
         </dependency>
 
-        <dependency>
+       <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
             <version>${hibernate.version}</version>
@@ -53,7 +53,19 @@
             <groupId>org.springdoc</groupId>
             <artifactId>springdoc-openapi-data-rest</artifactId>
             <version>${springdoc.version}</version>
+        </dependency> 
+        
+         <!-- restdocs -->
+       <dependency>
+            <groupId>org.springframework.restdocs</groupId>
+            <artifactId>spring-restdocs-mockmvc</artifactId>
+            <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.restdocs</groupId>
+            <artifactId>spring-restdocs-restassured</artifactId>
+            <scope>test</scope>
+        </dependency> 
     </dependencies>
 
     <build>
@@ -62,13 +74,49 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
+            <plugin>
+                <groupId>org.asciidoctor</groupId>
+                <artifactId>asciidoctor-maven-plugin</artifactId>
+                <version>${asciidoctor-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <id>generate-docs</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>process-asciidoc</goal>
+                        </goals>
+                        <configuration>
+                            <backend>html</backend>
+                            <doctype>book</doctype>
+                            <attributes>
+                                <snippets>${snippetsDirectory}</snippets>
+                            </attributes>
+                            <sourceDirectory>src/main/resources/asciidocs</sourceDirectory>
+                            <outputDirectory>target/generated-docs</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
+        <resources>
+            <resource>
+                <filtering>true</filtering>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>application.properties</include>
+                    <include>data.sql</include>
+                   <include>schema.sql</include>
+                </includes>
+            </resource>
+        </resources>
     </build>
 
     <properties>
         <java.version>1.8</java.version>
         <hibernate.version>5.2.10.Final</hibernate.version>
         <springdoc.version>1.2.32</springdoc.version>
+        <asciidoctor-plugin.version>1.5.6</asciidoctor-plugin.version>
+        <snippetsDirectory>${project.build.directory}/generated-snippets</snippetsDirectory>
     </properties>
 
     <profiles>
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Application.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Application.java
new file mode 100644
index 0000000000..93a28a2b49
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Application.java
@@ -0,0 +1,28 @@
+package com.baeldung.restdocopenapi;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+
+@SpringBootApplication()
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+    @Bean
+    public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
+        return new OpenAPI().info(new Info().title("Foobar API")
+            .version(appVersion)
+            .description("This is a sample Foobar server created using springdocs - a library for OpenAPI 3 with spring boot.")
+            .termsOfService("http://swagger.io/terms/")
+            .license(new License().name("Apache 2.0")
+                .url("http://springdoc.org")));
+    }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Foo.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Foo.java
new file mode 100644
index 0000000000..99d63581be
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/Foo.java
@@ -0,0 +1,93 @@
+package com.baeldung.restdocopenapi;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Foo {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(nullable = false)
+    private String title;
+    
+    @Column()
+    private String body;
+
+
+    protected Foo() {
+    }
+
+    public Foo(long id, String title, String body) {
+        this.id = id;
+        this.title = title;
+        this.body = body;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result;
+        result = prime * result + ((id == null) ? 0 : id.hashCode());
+        result = prime * result + ((title == null) ? 0 : title.hashCode());
+        return result;
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Foo other = (Foo) obj;
+        if (id == null) {
+            if (other.id != null)
+                return false;
+        } else if (!id.equals(other.id))
+            return false;
+        if (title == null) {
+            if (other.title != null)
+                return false;
+        } else if (!title.equals(other.title))
+            return false;
+        return true;
+    }
+    
+    @Override
+    public String toString() {
+        return "Foo [id=" + id + ", title=" + title + "]";
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooController.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooController.java
new file mode 100644
index 0000000000..55c2cccb3c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooController.java
@@ -0,0 +1,83 @@
+package com.baeldung.restdocopenapi;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/foo")
+public class FooController {
+
+    @Autowired
+    FooRepository repository;
+
+    @GetMapping
+    public ResponseEntity<List<Foo>> getAllFoos() {
+        List<Foo> fooList = (List<Foo>) repository.findAll();
+        if (fooList.isEmpty()) {
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+        }
+        return new ResponseEntity<>(fooList, HttpStatus.OK);
+    }
+
+    @GetMapping(value = "{id}")
+    public ResponseEntity<Foo> getFooById(@PathVariable("id") Long id) {
+
+        Optional<Foo> foo = repository.findById(id);
+        return foo.isPresent() ? new ResponseEntity<>(foo.get(), HttpStatus.OK) : new ResponseEntity<>(HttpStatus.NOT_FOUND);
+    }
+
+    @PostMapping
+    public ResponseEntity<Foo> addFoo(@RequestBody @Valid Foo foo) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setLocation(linkTo(FooController.class).slash(foo.getId())
+            .toUri());
+        Foo savedFoo;
+        try {
+            savedFoo = repository.save(foo);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
+        }
+
+        return new ResponseEntity<>(savedFoo, httpHeaders, HttpStatus.CREATED);
+    }
+
+    @DeleteMapping("/{id}")
+    public ResponseEntity<Void> deleteFoo(@PathVariable("id") long id) {
+        try {
+            repository.deleteById(id);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
+        }
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    @PutMapping("/{id}")
+    public ResponseEntity<Foo> updateFoo(@PathVariable("id") long id, @RequestBody Foo foo) {
+        boolean isFooPresent = repository.existsById(Long.valueOf(id));
+
+        if (!isFooPresent) {
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+        }
+
+        Foo updatedFoo = repository.save(foo);
+
+        return new ResponseEntity<>(updatedFoo, HttpStatus.OK);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooRepository.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooRepository.java
new file mode 100644
index 0000000000..105b57b2ef
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/FooRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.restdocopenapi;
+
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface FooRepository extends PagingAndSortingRepository<Foo, Long>{
+
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/springdoc/FooBarController.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/springdoc/FooBarController.java
new file mode 100644
index 0000000000..8af414c8fd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/restdocopenapi/springdoc/FooBarController.java
@@ -0,0 +1,121 @@
+package com.baeldung.restdocopenapi.springdoc;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.restdocopenapi.Foo;
+import com.baeldung.restdocopenapi.FooRepository;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@RestController
+@RequestMapping("/foobar")
+@Tag(name = "foobar", description = "the foobar API with documentation annotations")
+public class FooBarController {
+
+    @Autowired
+    FooRepository repository;
+
+    @Operation(summary = "Get all foos")
+    @ApiResponses(value = { 
+            @ApiResponse(responseCode = "200", description = "found foos", content = { 
+                @Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = Foo.class)))}), 
+            @ApiResponse(responseCode = "404", description = "No Foos found", content = @Content) })
+    @GetMapping
+    public ResponseEntity<List<Foo>> getAllFoos() {
+        List<Foo> fooList = (List<Foo>) repository.findAll();
+        if (fooList.isEmpty()) {
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+        }
+        return new ResponseEntity<>(fooList, HttpStatus.OK);
+    }
+
+    @Operation(summary = "Get a foo by foo id")
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "200", description = "found the foo", content = { 
+                    @Content(mediaType = "application/json", schema = @Schema(implementation = Foo.class))}),
+            @ApiResponse(responseCode = "400", description = "Invalid id supplied", content = @Content), 
+            @ApiResponse(responseCode = "404", description = "Foo not found", content = @Content) })
+    @GetMapping(value = "{id}")
+    public ResponseEntity<Foo> getFooById(@Parameter(description = "id of foo to be searched") @PathVariable("id") String id) {
+
+        Optional<Foo> foo = repository.findById(Long.valueOf(id));
+        return foo.isPresent() ? new ResponseEntity<>(foo.get(), HttpStatus.OK) : new ResponseEntity<>(HttpStatus.NOT_FOUND);
+    }
+
+    @Operation(summary = "Create a foo")
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "201", description = "foo created", content = { @
+                    Content(mediaType = "application/json", schema = @Schema(implementation = Foo.class))}),
+            @ApiResponse(responseCode = "404", description = "Bad request", content = @Content) })
+    @PostMapping
+    public ResponseEntity<Foo> addFoo(@Parameter(description = "foo object to be created") @RequestBody @Valid Foo foo) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setLocation(linkTo(FooBarController.class).slash(foo.getId()).toUri());
+        Foo savedFoo;
+        try {
+            savedFoo = repository.save(foo);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
+        }
+
+        return new ResponseEntity<>(savedFoo, httpHeaders, HttpStatus.CREATED);
+    }
+
+    @Operation(summary = "Delete a foo")
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "204", description = "foo deleted"),
+            @ApiResponse(responseCode = "404", description = "Bad request", content = @Content) })
+    @DeleteMapping("/{id}")
+    public ResponseEntity<Void> deleteFoo(@Parameter(description = "id of foo to be deleted") @PathVariable("id") long id) {
+        try {
+            repository.deleteById(id);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
+        }
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    @Operation(summary = "Update a foo")
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "200", description = "foo updated successfully", content = {
+                    @Content(mediaType = "application/json", schema = @Schema(implementation = Foo.class))}),
+            @ApiResponse(responseCode = "404", description = "No Foo exists with given id", content = @Content) })
+    @PutMapping("/{id}")
+    public ResponseEntity<Foo> updateFoo(@Parameter(description = "id of foo to be updated") @PathVariable("id") long id, @RequestBody Foo foo) {
+        
+        boolean isFooPresent = repository.existsById(Long.valueOf(id));
+
+        if (!isFooPresent) {
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+        }
+        
+        Foo updatedFoo = repository.save(foo);
+
+        return new ResponseEntity<>(updatedFoo, HttpStatus.OK);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
index 45378e610b..4191d8ba25 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
@@ -5,4 +5,7 @@ springdoc.swagger-ui.path=/swagger-ui-custom.html
 springdoc.api-docs.path=/api-docs
 
 # H2 Related Configurations
-spring.datasource.url=jdbc:h2:mem:springdoc
\ No newline at end of file
+spring.datasource.url=jdbc:h2:mem:springdoc
+
+springdoc.version=@springdoc.version@
+spring.jpa.hibernate.ddl-auto=none
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/asciidocs/fooapi.adoc b/spring-boot-modules/spring-boot-springdoc/src/main/resources/asciidocs/fooapi.adoc
new file mode 100644
index 0000000000..90791cbbcf
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/asciidocs/fooapi.adoc
@@ -0,0 +1,153 @@
+= RESTful Notes API Guide
+Baeldung;
+:doctype: book
+:icons: font
+:source-highlighter: highlightjs
+:toc: left
+:toclevels: 4
+:sectlinks:
+
+[[overview]]
+= Overview
+
+[[overview-http-verbs]]
+== HTTP verbs
+
+RESTful notes tries to adhere as closely as possible to standard HTTP and REST conventions in its
+use of HTTP verbs.
+
+|===
+| Verb | Usage
+
+| `GET`
+| Used to retrieve a resource
+
+| `POST`
+| Used to create a new resource
+
+| `PUT`
+| Used to update an existing resource
+
+| `DELETE`
+| Used to delete an existing resource
+|===
+
+RESTful notes tries to adhere as closely as possible to standard HTTP and REST conventions in its
+use of HTTP status codes.
+
+|===
+| Status code | Usage
+
+| `200 OK`
+| The request completed successfully
+
+| `201 Created`
+| A new resource has been created successfully. The resource's URI is available from the response's
+`Location` header
+
+| `204 No Content`
+| An update to an existing resource has been applied successfully
+
+| `400 Bad Request`
+| The request was malformed. The response body will include an error providing further information
+
+| `404 Not Found`
+| The requested resource did not exist
+|===
+
+[[overview-hypermedia]]
+== Hypermedia
+
+RESTful Notes uses hypermedia and resources include links to other resources in their
+responses. Responses are in http://stateless.co/hal_specification.html[Hypertext Application
+from resource to resource.
+Language (HAL)] format. Links can be found beneath the `_links` key. Users of the API should
+not create URIs themselves, instead they should use the above-described links to navigate
+
+[[resources]]
+= Resources
+
+[[resources-FOO]]
+== FOO REST Service 
+
+The FOO provides the entry point into the service.
+
+[[resources-foo-get]]
+=== Accessing the foo GET
+
+A `GET` request is used to access the foo read.
+
+==== Request structure
+
+include::{snippets}/getAFoo/http-request.adoc[]
+
+==== Path Parameters
+include::{snippets}/getAFoo/path-parameters.adoc[]
+
+==== Example response
+
+include::{snippets}/getAFoo/http-response.adoc[]
+
+==== CURL request
+
+include::{snippets}/getAFoo/curl-request.adoc[]
+
+[[resources-foo-post]]
+=== Accessing the foo POST
+
+A `POST` request is used to access the foo create.
+
+==== Request structure
+
+include::{snippets}/createFoo/http-request.adoc[]
+
+==== Example response
+
+include::{snippets}/createFoo/http-response.adoc[]
+
+==== CURL request
+
+include::{snippets}/createFoo/curl-request.adoc[]
+
+[[resources-foo-delete]]
+=== Accessing the foo DELETE
+
+A `DELETE` request is used to access the foo delete.
+
+==== Request structure
+
+include::{snippets}/deleteFoo/http-request.adoc[]
+
+==== Path Parameters
+include::{snippets}/deleteFoo/path-parameters.adoc[]
+
+==== Example response
+
+include::{snippets}/deleteFoo/http-response.adoc[]
+
+==== CURL request
+
+include::{snippets}/deleteFoo/curl-request.adoc[]
+
+[[resources-foo-put]]
+=== Accessing the foo PUT
+
+A `PUT` request is used to access the foo update.
+
+==== Request structure
+
+include::{snippets}/updateFoo/http-request.adoc[]
+
+==== Path Parameters
+include::{snippets}/updateFoo/path-parameters.adoc[]
+
+==== Example response
+
+include::{snippets}/updateFoo/http-response.adoc[]
+
+==== CURL request
+
+include::{snippets}/updateFoo/curl-request.adoc[]
+
+
+
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/data.sql b/spring-boot-modules/spring-boot-springdoc/src/main/resources/data.sql
new file mode 100644
index 0000000000..f80e53b717
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/data.sql
@@ -0,0 +1,4 @@
+INSERT INTO Foo(id, title, body) VALUES (1, 'Foo 1', 'Foo body 1');
+INSERT INTO Foo(id, title, body) VALUES (2, 'Foo 2', 'Foo body 2');
+INSERT INTO Foo(id, title, body) VALUES (3, 'Foo 3', 'Foo body 3');
+
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-springdoc/src/main/resources/schema.sql
new file mode 100644
index 0000000000..e5d33da019
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/schema.sql
@@ -0,0 +1,8 @@
+DROP TABLE IF EXISTS foo;
+
+CREATE TABLE foo (
+  id   INTEGER      NOT NULL AUTO_INCREMENT,
+  title VARCHAR(250) NOT NULL,
+  body VARCHAR(250),
+  PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/src/test/java/com/baeldung/restdocopenapi/restdoc/SpringRestDocsUnitTest.java b/spring-boot-modules/spring-boot-springdoc/src/test/java/com/baeldung/restdocopenapi/restdoc/SpringRestDocsUnitTest.java
new file mode 100644
index 0000000000..4d37abf78a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/test/java/com/baeldung/restdocopenapi/restdoc/SpringRestDocsUnitTest.java
@@ -0,0 +1,120 @@
+package com.baeldung.restdocopenapi.restdoc;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
+import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
+import static org.springframework.restdocs.request.RequestDocumentation.pathParameters;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.util.StringUtils.collectionToDelimitedString;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.hateoas.MediaTypes;
+import org.springframework.restdocs.RestDocumentationContextProvider;
+import org.springframework.restdocs.RestDocumentationExtension;
+import org.springframework.restdocs.constraints.ConstraintDescriptions;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import com.baeldung.restdocopenapi.Application;
+import com.baeldung.restdocopenapi.Foo;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@ExtendWith({ RestDocumentationExtension.class, SpringExtension.class })
+@SpringBootTest(classes = Application.class)
+public class SpringRestDocsUnitTest {
+
+    private MockMvc mockMvc;
+    
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    @BeforeEach
+    public void setup(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) {
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
+            .apply(documentationConfiguration(restDocumentation))
+            .build();
+    }
+
+    @Test
+    public void whenGetFoo_thenSuccessful() throws Exception {
+        this.mockMvc.perform(get("/foo"))
+            .andDo(print())
+            .andExpect(status().isOk())
+            .andExpect(content().string(containsString("Foo 1")))
+            .andDo(document("getAllFoos"));
+    }
+
+    @Test
+    public void whenGetFooById_thenSuccessful() throws Exception {
+        ConstraintDescriptions desc = new ConstraintDescriptions(Foo.class);
+
+        this.mockMvc.perform(get("/foo/{id}", 1))
+            .andExpect(status().isOk())
+            .andDo(document("getAFoo", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), 
+                pathParameters(parameterWithName("id").description("id of foo to be searched")),
+                responseFields(fieldWithPath("id").description("The id of the foo" + collectionToDelimitedString(desc.descriptionsForProperty("id"), ". ")),
+                fieldWithPath("title").description("The title of the foo"), fieldWithPath("body").description("The body of the foo"))));
+    }
+
+    @Test
+    public void whenPostFoo_thenSuccessful() throws Exception {
+        Map<String, Object> foo = new HashMap<>();
+        foo.put("id", 4L);
+        foo.put("title", "New Foo");
+        foo.put("body", "Body of New Foo");
+    
+        this.mockMvc.perform(post("/foo").contentType(MediaTypes.HAL_JSON)
+            .content(this.objectMapper.writeValueAsString(foo)))
+            .andExpect(status().isCreated())
+            .andDo(document("createFoo", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields(fieldWithPath("id").description("The id of the foo"), fieldWithPath("title").description("The title of the foo"),
+                fieldWithPath("body").description("The body of the foo"))));
+    }
+    
+    @Test
+    public void whenDeleteFoo_thenSuccessful() throws Exception {
+        this.mockMvc.perform(delete("/foo/{id}", 2))
+            .andExpect(status().isNoContent())
+            .andDo(document("deleteFoo", pathParameters(parameterWithName("id").description("The id of the foo to delete"))));
+    }
+    
+    @Test
+    public void whenUpdateFoo_thenSuccessful() throws Exception {
+        
+        ConstraintDescriptions desc = new ConstraintDescriptions(Foo.class);
+    
+        Map<String, Object> foo = new HashMap<>();
+        foo.put("title", "Updated Foo");
+        foo.put("body", "Body of Updated Foo");
+    
+        this.mockMvc.perform(put("/foo/{id}", 3).contentType(MediaTypes.HAL_JSON)
+            .content(this.objectMapper.writeValueAsString(foo)))
+            .andExpect(status().isOk())
+            .andDo(document("updateFoo", pathParameters(parameterWithName("id").description("The id of the foo to update")),
+                responseFields(fieldWithPath("id").description("The id of the updated foo" + collectionToDelimitedString(desc.descriptionsForProperty("id"), ". ")),
+                    fieldWithPath("title").description("The title of the updated foo"), fieldWithPath("body").description("The body of the updated foo"))));
+    }
+    
+
+}

From e264ffd4bc99e7bba12b692a5e27d2749fc17ffa Mon Sep 17 00:00:00 2001
From: Anirban <canirban99@gmail.com>
Date: Sat, 16 May 2020 09:43:14 +0200
Subject: [PATCH 326/404] Added if-else expression examples in kotlin (#9296)

---
 .../IfElseExpressionExample.kt                | 86 +++++++++++++++++++
 .../IfElseExpressionExampleTest.kt            | 43 ++++++++++
 2 files changed, 129 insertions(+)
 create mode 100644 core-kotlin-modules/core-kotlin-lang-2/src/main/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExample.kt
 create mode 100644 core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExampleTest.kt

diff --git a/core-kotlin-modules/core-kotlin-lang-2/src/main/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExample.kt b/core-kotlin-modules/core-kotlin-lang-2/src/main/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExample.kt
new file mode 100644
index 0000000000..f4e42a4f4f
--- /dev/null
+++ b/core-kotlin-modules/core-kotlin-lang-2/src/main/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExample.kt
@@ -0,0 +1,86 @@
+package com.baeldung.ifelseexpression
+
+fun ifStatementUsage(): String {
+    val number = 15
+
+    if (number > 0) {
+        return "Positive number"
+    }
+    return "Positive number not found"
+}
+
+fun ifElseStatementUsage(): String {
+    val number = -50
+
+    if (number > 0) {
+        return "Positive number"
+    } else {
+        return "Negative number"
+    }
+}
+
+fun ifElseExpressionUsage(): String {
+    val number = -50
+
+    val result = if (number > 0) {
+        "Positive number"
+    } else {
+        "Negative number"
+    }
+    return result
+}
+
+fun ifElseExpressionSingleLineUsage(): String {
+    val number = -50
+    val result = if (number > 0) "Positive number" else "Negative number"
+
+    return result
+}
+
+fun ifElseMultipleExpressionUsage(): Int {
+    val x = 24
+    val y = 73
+
+    val result = if (x > y) {
+        println("$x is greater than $y")
+        x
+    } else {
+        println("$x is less than or equal to $y")
+        y
+    }
+    return result
+}
+
+fun ifElseLadderExpressionUsage(): String {
+    val number = 60
+
+    val result = if (number < 0) {
+        "Negative number"
+    } else if (number in 0..9) {
+        "Single digit number"
+    } else if (number in 10..99) {
+        "Double digit number"
+    } else {
+        "Number has more digits"
+    }
+    return result
+}
+
+fun ifElseNestedExpressionUsage(): Int {
+    val x = 37
+    val y = 89
+    val z = 6
+
+    val result = if (x > y) {
+        if (x > z)
+            x
+        else
+            z
+    } else {
+        if (y > z)
+            y
+        else
+            z
+    }
+    return result
+}
\ No newline at end of file
diff --git a/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExampleTest.kt b/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExampleTest.kt
new file mode 100644
index 0000000000..266e41e07b
--- /dev/null
+++ b/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/ifelseexpression/IfElseExpressionExampleTest.kt
@@ -0,0 +1,43 @@
+package com.baeldung.ifelseexpression
+
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertNotEquals
+
+class IfElseExpressionExampleTest {
+
+    @Test
+    fun givenNumber_whenIfStatementCalled_thenReturnsString() {
+        assertEquals("Positive number", ifStatementUsage())
+    }
+
+    @Test
+    fun givenNumber_whenIfElseStatementCalled_thenReturnsString() {
+        assertEquals("Negative number", ifElseStatementUsage())
+    }
+
+    @Test
+    fun givenNumber_whenIfElseExpressionCalled_thenReturnsString() {
+        assertEquals("Negative number", ifElseExpressionUsage())
+    }
+
+    @Test
+    fun givenNumber_whenIfElseExpressionSingleLineCalled_thenReturnsString() {
+        assertEquals("Negative number", ifElseExpressionSingleLineUsage())
+    }
+
+    @Test
+    fun givenNumber_whenIfElseMultipleExpressionCalled_thenReturnsNumber() {
+        assertEquals(73, ifElseMultipleExpressionUsage())
+    }
+
+    @Test
+    fun givenNumber_whenIfElseLadderExpressionCalled_thenReturnsString() {
+        assertEquals("Double digit number", ifElseLadderExpressionUsage())
+    }
+
+    @Test
+    fun givenNumber_whenIfElseNestedExpressionCalled_thenReturnsNumber() {
+        assertEquals(89, ifElseNestedExpressionUsage())
+    }
+}
\ No newline at end of file

From c72b2846d5e8b65868a1196f2cc11fb520d791d2 Mon Sep 17 00:00:00 2001
From: sasam0320 <63002713+sasam0320@users.noreply.github.com>
Date: Sat, 16 May 2020 10:03:47 +0200
Subject: [PATCH 327/404] BAEL 3234 - Add missing code snippets (#9285)

---
 .../ConfigPropertiesDemoApplication.java      |  2 +-
 .../com/baeldung/properties/Database.java     | 33 -------------------
 .../main/resources/configForProperties.xml    |  4 ---
 .../src/main/resources/database.properties    |  1 -
 .../src/main/resources/database.yml           |  3 +-
 .../ConfigPropertiesIntegrationTest.java      | 14 ++------
 .../DatabasePropertiesIntegrationTest.java    | 10 +++---
 .../src/test/resources/application.properties |  3 --
 8 files changed, 11 insertions(+), 59 deletions(-)
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java

diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
index e54f28837d..e280bbd79f 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
@@ -7,7 +7,7 @@ import org.springframework.context.annotation.ComponentScan;
 import com.baeldung.configurationproperties.ConfigProperties;
 
 @SpringBootApplication
-@ComponentScan(basePackageClasses = { ConfigProperties.class, JsonProperties.class, CustomJsonProperties.class, Database.class })
+@ComponentScan(basePackageClasses = { ConfigProperties.class, JsonProperties.class, CustomJsonProperties.class})
 public class ConfigPropertiesDemoApplication {
     public static void main(String[] args) {
         new SpringApplicationBuilder(ConfigPropertiesDemoApplication.class).initializers(new JsonPropertyContextInitializer())
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java
deleted file mode 100644
index 6e798672e7..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.baeldung.properties;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConfigurationProperties(prefix = "database")
-public class Database {
-
-    private String url;
-    private String username;
-    private String password;
-    
-    public String getUrl() {
-        return url;
-    }
-    public void setUrl(String url) {
-        this.url = url;
-    }
-    public String getUsername() {
-        return username;
-    }
-    public void setUsername(String username) {
-        this.username = username;
-    }
-    public String getPassword() {
-        return password;
-    }
-    public void setPassword(String password) {
-        this.password = password;
-    }
-    
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
index bf4452da4a..16db00ace3 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
@@ -14,8 +14,4 @@
         <constructor-arg value="${key.something}"/>
     </bean>
 
-    <bean id="dataSource" class="com.baeldung.configurationproperties.Database">
-        <property name="url" value="${jdbc.url}" />
-    </bean>
-
 </beans>
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
index eb5703ca72..24bfdf2096 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
@@ -1,4 +1,3 @@
-
 jdbc.url=jdbc:postgresql:/localhost:5432
 database.username=foo
 database.password=bar
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml b/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
index 8404d9411a..83432f65bc 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
@@ -1,5 +1,6 @@
 database:
-    url: jdbc:postresql:/localhost:5432/instance
+    jdbc:
+      url: jdbc:postresql:/localhost:5432
     username: foo
     password: bar
 secret: foo
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
index 2b0833c387..3b80fa66fe 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
@@ -14,17 +14,13 @@ import com.baeldung.properties.AdditionalProperties;
 import com.baeldung.properties.ConfigPropertiesDemoApplication;
 
 @RunWith(SpringRunner.class)
-@SpringBootTest(classes = {ConfigPropertiesDemoApplication.class, DatabaseConfigPropertiesApp.class})
-@TestPropertySource(locations = {"classpath:configprops-test.properties", "classpath:database-test.properties"})
+@SpringBootTest(classes = {ConfigPropertiesDemoApplication.class})
+@TestPropertySource(locations = {"classpath:configprops-test.properties"})
 public class ConfigPropertiesIntegrationTest {
 
     @Autowired
     private ConfigProperties properties;
 
-    @Autowired
-    @Qualifier("dataSource")
-    private Database databaseProperties;
-
     @Autowired
     private AdditionalProperties additionalProperties;
 
@@ -59,10 +55,4 @@ public class ConfigPropertiesIntegrationTest {
         Assert.assertTrue(additionalProperties.getMax() == 100);
     }
 
-    @Test
-    public void whenDatabasePropertyQueriedthenReturnsProperty() {
-        Assert.assertTrue(databaseProperties.getUrl().equals("jdbc:postgresql:/localhost:5432"));
-        Assert.assertTrue(databaseProperties.getUsername().equals("foo"));
-        Assert.assertTrue(databaseProperties.getPassword().equals("bar"));
-    }
 }
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java
index 0b9bd797ae..50a129916f 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java
@@ -4,26 +4,28 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import com.baeldung.properties.ConfigPropertiesDemoApplication;
-import com.baeldung.properties.Database;
+import com.baeldung.configurationproperties.Database;
 
 
 @RunWith(SpringRunner.class)
-@SpringBootTest(classes = ConfigPropertiesDemoApplication.class)
-@TestPropertySource("classpath:application.properties")
+@SpringBootTest(classes = DatabaseConfigPropertiesApp.class)
+@TestPropertySource("classpath:database-test.properties")
 public class DatabasePropertiesIntegrationTest {
 
     @Autowired
+    @Qualifier("dataSource")
     private Database database;
     
     @Test
     public void testDatabaseProperties() {
         Assert.assertNotNull(database);
-        Assert.assertEquals("jdbc:postgresql:/localhost:5432/instance", database.getUrl());
+        Assert.assertEquals("jdbc:postgresql:/localhost:5432", database.getUrl());
         Assert.assertEquals("foo", database.getUsername());
         Assert.assertEquals("bar", database.getPassword());
     }
diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties
index d4d1df7abc..af38556f81 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties
+++ b/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties
@@ -3,6 +3,3 @@ spring.properties.refreshDelay=1000
 spring.config.location=file:extra.properties
 spring.main.allow-bean-definition-overriding=true
 
-database.url=jdbc:postgresql:/localhost:5432/instance
-database.username=foo
-database.password=bar
\ No newline at end of file

From ab9d1cd461e80a3a263096f3263d122f960b8e93 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sat, 16 May 2020 15:24:23 +0530
Subject: [PATCH 328/404] updated java comment

---
 .../CollectionToArrayListUnitTest.java                          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
index 15960c300d..b8134de08a 100644
--- a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
@@ -88,7 +88,7 @@ public class CollectionToArrayListUnitTest {
         Iterator<Foo> iterA = a.iterator();
         Iterator<Foo> iterB = b.iterator();
         while (iterA.hasNext()) {
-            // use '==' to test instance identity
+            // test instance identity
             assertSame("Foo instances differ!", iterA.next(), iterB.next());
         }
     }

From 7d1e22b44f158bad2f59fa6b3506e09839d87823 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sat, 16 May 2020 16:29:39 +0530
Subject: [PATCH 329/404] modified MvcVoterConfig controller path

---
 .../src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java
index f11a4ae06c..402065129f 100644
--- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java
@@ -12,6 +12,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 public class VoterMvcConfig implements WebMvcConfigurer {
     @Override
     public void addViewControllers(ViewControllerRegistry registry) {
-        registry.addViewController("/").setViewName("private");
+        registry.addViewController("/private").setViewName("private");
     }
 }

From 29dde3b4855c49ddba924a035099d752fa10c46a Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sat, 16 May 2020 17:06:29 +0530
Subject: [PATCH 330/404] updated spring kafka version

---
 spring-kafka/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml
index d60a2ee506..2b4a0914e6 100644
--- a/spring-kafka/pom.xml
+++ b/spring-kafka/pom.xml
@@ -33,7 +33,7 @@
     </dependencies>
 
     <properties>
-        <spring-kafka.version>2.2.7.RELEASE</spring-kafka.version>
+        <spring-kafka.version>2.3.7.RELEASE</spring-kafka.version>
     </properties>
 
 </project>
\ No newline at end of file

From 8d79b7c5d6c58a6096c697d9da976c0bb9d0413b Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Sat, 16 May 2020 17:20:15 +0530
Subject: [PATCH 331/404] unit test renamed

---
 .../{Bucket4jUsageTest.java => Bucket4jUsageUnitTest.java}      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/{Bucket4jUsageTest.java => Bucket4jUsageUnitTest.java} (98%)

diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageUnitTest.java
similarity index 98%
rename from spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java
rename to spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageUnitTest.java
index 247e493324..e6b774034e 100644
--- a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageTest.java
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageUnitTest.java
@@ -16,7 +16,7 @@ import io.github.bucket4j.Bucket;
 import io.github.bucket4j.Bucket4j;
 import io.github.bucket4j.Refill;
 
-public class Bucket4jUsageTest {
+public class Bucket4jUsageUnitTest {
 
     @Test
     public void givenBucketLimit_whenExceedLimit_thenConsumeReturnsFalse() {

From 958435e0b3ab23725010544c8ad2c307c490f6fb Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Sat, 16 May 2020 17:04:21 +0200
Subject: [PATCH 332/404] BAEL-1524 Add HikariCP exclusion to Spring Boot Data
 JPA dependency

---
 persistence-modules/spring-boot-persistence-2/pom.xml | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index 58432a5c9c..b5cdfbafc9 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -49,6 +49,12 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.zaxxer</groupId>
+                    <artifactId>HikariCP</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -120,7 +126,6 @@
             <groupId>org.hsqldb</groupId>
             <artifactId>hsqldb</artifactId>
         </dependency>
-
     </dependencies>
 
     <build>

From 3d9c2403ab8a6d5ab2d6c0b1ecfee173469a890b Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Sat, 16 May 2020 17:17:21 +0200
Subject: [PATCH 333/404] BAEL-1524 Put back HikariCP

---
 persistence-modules/spring-boot-persistence/pom.xml | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index c58e8dbf86..99c00f6784 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -26,12 +26,6 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.zaxxer</groupId>
-                    <artifactId>HikariCP</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>

From 94ed56e4f5410c7c478e23150ed858f89803e8f8 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Sat, 16 May 2020 17:21:28 +0200
Subject: [PATCH 334/404] BAEL-1524 Put back HikariCP

---
 persistence-modules/spring-boot-persistence-2/pom.xml | 6 ------
 persistence-modules/spring-boot-persistence/pom.xml   | 6 ++++++
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index b5cdfbafc9..33b33d7160 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -49,12 +49,6 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.zaxxer</groupId>
-                    <artifactId>HikariCP</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
 
         <dependency>
diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index 99c00f6784..c58e8dbf86 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -26,6 +26,12 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.zaxxer</groupId>
+                    <artifactId>HikariCP</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>

From dca1a9fb3f644731d5b41b13d0c55f08a00beed4 Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Sat, 16 May 2020 18:20:33 +0200
Subject: [PATCH 335/404] BAEL-1524 Fix test

---
 .../spring-boot-persistence-2/src/test/resources/schema.sql    | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql b/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql
index a0d0eaf62e..8d7db6c9f3 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql
+++ b/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql
@@ -1,3 +1,6 @@
+drop table if exists car_maker;
+drop table if exists car_model;
+
 --
 -- Car makers table
 --

From 44a1ec0195c5e92200f60fea26f1eb39ec73f716 Mon Sep 17 00:00:00 2001
From: ajay74984 <51405689+ajay74984@users.noreply.github.com>
Date: Sun, 17 May 2020 05:27:15 +0200
Subject: [PATCH 336/404] OCP change (#9266)

* OCP change

* calculator unit test
---
 .../main/java/com/baeldung/o/Addition.java    | 41 +++++++++++++++++
 .../main/java/com/baeldung/o/Calculator.java  | 14 ++++++
 .../com/baeldung/o/CalculatorOperation.java   |  7 +++
 .../main/java/com/baeldung/o/Division.java    | 43 ++++++++++++++++++
 .../main/java/com/baeldung/o/Subtraction.java | 41 +++++++++++++++++
 .../com/baeldung/o/CalculatorUnitTest.java    | 44 +++++++++++++++++++
 6 files changed, 190 insertions(+)
 create mode 100644 patterns/solid/src/main/java/com/baeldung/o/Addition.java
 create mode 100644 patterns/solid/src/main/java/com/baeldung/o/Calculator.java
 create mode 100644 patterns/solid/src/main/java/com/baeldung/o/CalculatorOperation.java
 create mode 100644 patterns/solid/src/main/java/com/baeldung/o/Division.java
 create mode 100644 patterns/solid/src/main/java/com/baeldung/o/Subtraction.java
 create mode 100644 patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java

diff --git a/patterns/solid/src/main/java/com/baeldung/o/Addition.java b/patterns/solid/src/main/java/com/baeldung/o/Addition.java
new file mode 100644
index 0000000000..6145b386d9
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/Addition.java
@@ -0,0 +1,41 @@
+package com.baeldung.o;
+
+public class Addition implements CalculatorOperation {
+    private double number1;
+    private double number2;
+    private double result = 0.0;
+
+    public Addition(double number1, double number2) {
+        this.number1 = number1;
+        this.number2 = number2;
+    }
+
+    public double getNumber1() {
+        return number1;
+    }
+
+    public void setNumber1(double number1) {
+        this.number1 = number1;
+    }
+
+    public double getNumber2() {
+        return number2;
+    }
+
+    public void setNumber2(double number2) {
+        this.number2 = number2;
+    }
+
+    public double getResult() {
+        return result;
+    }
+
+    public void setResult(double result) {
+        this.result = result;
+    }
+
+    @Override
+    public void perform() {
+        result = number1 + number2;
+    }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Calculator.java b/patterns/solid/src/main/java/com/baeldung/o/Calculator.java
new file mode 100644
index 0000000000..11ace8eb20
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/Calculator.java
@@ -0,0 +1,14 @@
+package com.baeldung.o;
+
+import java.security.InvalidParameterException;
+
+public class Calculator {
+
+    public void calculate(CalculatorOperation operation) {
+        if (operation == null) {
+            throw new InvalidParameterException("Can not perform operation");
+        }
+
+        operation.perform();
+    }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/CalculatorOperation.java b/patterns/solid/src/main/java/com/baeldung/o/CalculatorOperation.java
new file mode 100644
index 0000000000..46648e25d8
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/CalculatorOperation.java
@@ -0,0 +1,7 @@
+package com.baeldung.o;
+
+public interface CalculatorOperation {
+
+    void perform();
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Division.java b/patterns/solid/src/main/java/com/baeldung/o/Division.java
new file mode 100644
index 0000000000..24ab4355c2
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/Division.java
@@ -0,0 +1,43 @@
+package com.baeldung.o;
+
+public class Division implements CalculatorOperation {
+    private double number1;
+    private double number2;
+    private double result = 0.0;
+
+    public Division(double number1, double number2) {
+        this.number1 = number1;
+        this.number2 = number2;
+    }
+
+    public double getNumber1() {
+        return number1;
+    }
+
+    public void setNumber1(double number1) {
+        this.number1 = number1;
+    }
+
+    public double getNumber2() {
+        return number2;
+    }
+
+    public void setNumber2(double number2) {
+        this.number2 = number2;
+    }
+
+    public double getResult() {
+        return result;
+    }
+
+    public void setResult(double result) {
+        this.result = result;
+    }
+
+    @Override
+    public void perform() {
+        if (number2 != 0) {
+            result = number1 / number2;
+        }
+    }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java b/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java
new file mode 100644
index 0000000000..b74e0c5f73
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java
@@ -0,0 +1,41 @@
+package com.baeldung.o;
+
+public class Subtraction implements CalculatorOperation {
+    private double number1;
+    private double number2;
+    private double result = 0.0;
+
+    public Subtraction(double number1, double number2) {
+        this.number1 = number1;
+        this.number2 = number2;
+    }
+
+    public double getNumber1() {
+        return number1;
+    }
+
+    public void setNumber1(double number1) {
+        this.number1 = number1;
+    }
+
+    public double getNumber2() {
+        return number2;
+    }
+
+    public void setNumber2(double number2) {
+        this.number2 = number2;
+    }
+
+    public double getResult() {
+        return result;
+    }
+
+    public void setResult(double result) {
+        this.result = result;
+    }
+
+    @Override
+    public void perform() {
+        result = number1 - number2;
+    }
+}
diff --git a/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java b/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java
new file mode 100644
index 0000000000..f372d450a7
--- /dev/null
+++ b/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.o;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class CalculatorUnitTest {
+
+	private static final double NUMBER_1 = 10.0;
+	private static final double NUMBER_2 = 20.0;
+	private static final double SUM = 30.0;
+	private static final double SUBTRACTION_RESULT = 10.0;
+	private static final double DIVISION_RESULT = 2.0;
+	
+	private Calculator calculator;
+	
+	@BeforeEach
+	public void setUp() {
+		 calculator = new Calculator();
+	}
+
+	@Test
+	public void whenAddTwoNumber_returnSum() {
+		Addition addition = new Addition(NUMBER_1, NUMBER_2);
+		calculator.calculate(addition);
+		assertEquals(SUM, addition.getResult(), 0.0);
+	}
+
+	@Test
+	public void whenSutractTwoNumber_returnCorrectResult() {
+		Subtraction subtraction = new Subtraction(NUMBER_2, NUMBER_1);
+		calculator.calculate(subtraction);
+		assertEquals(SUBTRACTION_RESULT, subtraction.getResult(), 0.0);
+	}
+
+	@Test
+	public void whenDivideTwoNumber_returnCorrectResult() {
+		Division division = new Division(NUMBER_2, NUMBER_1);
+		calculator.calculate(division);
+		assertEquals(DIVISION_RESULT, division.getResult(), 0.0);
+	}
+
+}

From ef5ea0f77c228e0fb5d6862e99a553f8c55ab765 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Sun, 17 May 2020 11:31:38 +0530
Subject: [PATCH 337/404] JAVA-941: Migrate spring-jinq to parent-boot-2

---
 spring-jinq/pom.xml | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/spring-jinq/pom.xml b/spring-jinq/pom.xml
index 29fc3605d7..96cff4b886 100644
--- a/spring-jinq/pom.xml
+++ b/spring-jinq/pom.xml
@@ -9,9 +9,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
@@ -31,6 +31,11 @@
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-entitymanager</artifactId>
         </dependency>
+        
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
 
         <!-- Spring -->
         <dependency>

From 832b32210c2843ac0c1168005c5e5e07dcfbe461 Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Sun, 17 May 2020 12:59:16 +0200
Subject: [PATCH 338/404] BAEL-3745: Implement PropertySourceFactory to load
 YAML files (new module) (#9307)

---
 .../spring-boot-properties-2/README.md        |  5 +++
 .../spring-boot-properties-2/pom.xml          | 25 +++++++++++
 .../properties/yaml/YamlApplication.java      | 22 ++++++++++
 .../properties/yaml/YamlFooProperties.java    | 42 +++++++++++++++++++
 .../factory/YamlPropertySourceFactory.java    | 24 +++++++++++
 .../src/main/resources/foo.yml                |  5 +++
 .../YamlFooPropertiesIntegrationTest.java     | 23 ++++++++++
 7 files changed, 146 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-properties-2/README.md
 create mode 100644 spring-boot-modules/spring-boot-properties-2/pom.xml
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlApplication.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlFooProperties.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/factory/YamlPropertySourceFactory.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/resources/foo.yml
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/yaml/YamlFooPropertiesIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties-2/README.md b/spring-boot-modules/spring-boot-properties-2/README.md
new file mode 100644
index 0000000000..01e2970e89
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/README.md
@@ -0,0 +1,5 @@
+## Spring Boot Properties
+
+This module contains articles about Properties in Spring Boot.
+
+### Relevant Articles:
diff --git a/spring-boot-modules/spring-boot-properties-2/pom.xml b/spring-boot-modules/spring-boot-properties-2/pom.xml
new file mode 100644
index 0000000000..c3c3e57251
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/pom.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>spring-boot-properties-2</artifactId>
+    <name>spring-boot-properties-2</name>
+    <packaging>jar</packaging>
+    <description>Spring Boot Properties Module</description>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../../parent-boot-2</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlApplication.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlApplication.java
new file mode 100644
index 0000000000..f1244925f1
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlApplication.java
@@ -0,0 +1,22 @@
+package com.baeldung.properties.yaml;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class YamlApplication implements CommandLineRunner {
+
+    @Autowired
+    private YamlFooProperties yamlFooProperties;
+
+    public static void main(String[] args) {
+        SpringApplication.run(YamlApplication.class, args);
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        System.out.println("YAML Properties " + yamlFooProperties);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlFooProperties.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlFooProperties.java
new file mode 100644
index 0000000000..264fc865ad
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/YamlFooProperties.java
@@ -0,0 +1,42 @@
+package com.baeldung.properties.yaml;
+
+import com.baeldung.properties.yaml.factory.YamlPropertySourceFactory;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import java.util.List;
+
+@Configuration
+@ConfigurationProperties(prefix = "yaml")
+@PropertySource(value = "classpath:foo.yml", factory = YamlPropertySourceFactory.class)
+public class YamlFooProperties {
+
+    private String name;
+
+    private List<String> aliases;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<String> getAliases() {
+        return aliases;
+    }
+
+    public void setAliases(List<String> aliases) {
+        this.aliases = aliases;
+    }
+
+    @Override
+    public String toString() {
+        return "YamlFooProperties{" +
+                "name='" + name + '\'' +
+                ", aliases=" + aliases +
+                '}';
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/factory/YamlPropertySourceFactory.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/factory/YamlPropertySourceFactory.java
new file mode 100644
index 0000000000..50201f9377
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/yaml/factory/YamlPropertySourceFactory.java
@@ -0,0 +1,24 @@
+package com.baeldung.properties.yaml.factory;
+
+import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
+import org.springframework.core.env.PropertiesPropertySource;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.support.EncodedResource;
+import org.springframework.core.io.support.PropertySourceFactory;
+
+import java.io.IOException;
+import java.util.Properties;
+
+public class YamlPropertySourceFactory implements PropertySourceFactory {
+
+    @Override
+    public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
+        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
+        factory.setResources(encodedResource.getResource());
+
+        Properties properties = factory.getObject();
+
+        return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
+    }
+
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/resources/foo.yml b/spring-boot-modules/spring-boot-properties-2/src/main/resources/foo.yml
new file mode 100644
index 0000000000..6320510a94
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/resources/foo.yml
@@ -0,0 +1,5 @@
+yaml:
+  name: foo
+  aliases:
+    - abc
+    - xyz
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/yaml/YamlFooPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/yaml/YamlFooPropertiesIntegrationTest.java
new file mode 100644
index 0000000000..dfe1c830b4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/yaml/YamlFooPropertiesIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.yaml;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class YamlFooPropertiesIntegrationTest {
+
+    @Autowired
+    private YamlFooProperties yamlFooProperties;
+
+    @Test
+    public void whenFactoryProvidedThenYamlPropertiesInjected() {
+        assertThat(yamlFooProperties.getName()).isEqualTo("foo");
+        assertThat(yamlFooProperties.getAliases()).containsExactly("abc", "xyz");
+    }
+}
\ No newline at end of file

From 34bdc3f6cd10ac614da6b43101bb914d509996df Mon Sep 17 00:00:00 2001
From: Lukasz Rys <lukaszrys@me.com>
Date: Sun, 17 May 2020 13:10:44 +0200
Subject: [PATCH 339/404] [BAEL-3751]: Move spring-boot-ci-cd module under
 spring-boot-modules

---
 pom.xml                                                         | 2 --
 spring-boot-modules/pom.xml                                     | 1 +
 .../spring-boot-ci-cd}/.mvn/wrapper/MavenWrapperDownloader.java | 0
 .../spring-boot-ci-cd}/.mvn/wrapper/maven-wrapper.properties    | 0
 .../spring-boot-ci-cd}/.travis.yml                              | 0
 .../spring-boot-ci-cd}/README.md                                | 0
 .../spring-boot-ci-cd}/mvnw                                     | 0
 .../spring-boot-ci-cd}/mvnw.cmd                                 | 0
 .../spring-boot-ci-cd}/pom.xml                                  | 2 +-
 .../src/main/java/com/baeldung/cicd/CiCdApplication.java        | 0
 .../src/main/resources/introduction-config.yml                  | 0
 .../java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java  | 0
 12 files changed, 2 insertions(+), 3 deletions(-)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/.mvn/wrapper/MavenWrapperDownloader.java (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/.mvn/wrapper/maven-wrapper.properties (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/.travis.yml (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/README.md (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/mvnw (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/mvnw.cmd (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/pom.xml (98%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/src/main/java/com/baeldung/cicd/CiCdApplication.java (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/src/main/resources/introduction-config.yml (100%)
 rename {spring-boot-ci-cd => spring-boot-modules/spring-boot-ci-cd}/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java (100%)

diff --git a/pom.xml b/pom.xml
index 9cf1aa2e92..15331d8c95 100644
--- a/pom.xml
+++ b/pom.xml
@@ -638,7 +638,6 @@
 
                 <module>spring-batch</module>
                 <module>spring-bom</module>
-                <module>spring-boot-ci-cd</module>
                 <module>spring-boot-modules</module>
                 <module>spring-boot-rest</module>
 
@@ -1142,7 +1141,6 @@
 
                 <module>spring-batch</module>
                 <module>spring-bom</module>
-                <module>spring-boot-ci-cd</module>
                 <module>spring-boot-modules</module>
                 <module>spring-boot-rest</module>
 
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 228e7ce481..5acaa30328 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -28,6 +28,7 @@
         <module>spring-boot-deployment</module>
         <module>spring-boot-di</module>
         <module>spring-boot-camel</module>
+        <module>spring-boot-ci-cd</module>
         <!-- <module>spring-boot-cli</module> --> <!-- Not a maven project -->
         <module>spring-boot-custom-starter</module>
         <module>spring-boot-crud</module>
diff --git a/spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java b/spring-boot-modules/spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java
similarity index 100%
rename from spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java
rename to spring-boot-modules/spring-boot-ci-cd/.mvn/wrapper/MavenWrapperDownloader.java
diff --git a/spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties b/spring-boot-modules/spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties
rename to spring-boot-modules/spring-boot-ci-cd/.mvn/wrapper/maven-wrapper.properties
diff --git a/spring-boot-ci-cd/.travis.yml b/spring-boot-modules/spring-boot-ci-cd/.travis.yml
similarity index 100%
rename from spring-boot-ci-cd/.travis.yml
rename to spring-boot-modules/spring-boot-ci-cd/.travis.yml
diff --git a/spring-boot-ci-cd/README.md b/spring-boot-modules/spring-boot-ci-cd/README.md
similarity index 100%
rename from spring-boot-ci-cd/README.md
rename to spring-boot-modules/spring-boot-ci-cd/README.md
diff --git a/spring-boot-ci-cd/mvnw b/spring-boot-modules/spring-boot-ci-cd/mvnw
similarity index 100%
rename from spring-boot-ci-cd/mvnw
rename to spring-boot-modules/spring-boot-ci-cd/mvnw
diff --git a/spring-boot-ci-cd/mvnw.cmd b/spring-boot-modules/spring-boot-ci-cd/mvnw.cmd
similarity index 100%
rename from spring-boot-ci-cd/mvnw.cmd
rename to spring-boot-modules/spring-boot-ci-cd/mvnw.cmd
diff --git a/spring-boot-ci-cd/pom.xml b/spring-boot-modules/spring-boot-ci-cd/pom.xml
similarity index 98%
rename from spring-boot-ci-cd/pom.xml
rename to spring-boot-modules/spring-boot-ci-cd/pom.xml
index e5204d53fd..25e45d56f3 100644
--- a/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-modules/spring-boot-ci-cd/pom.xml
@@ -12,7 +12,7 @@
         <groupId>com.baeldung</groupId>
         <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-2</relativePath>
+        <relativePath>../../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
diff --git a/spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java b/spring-boot-modules/spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java
similarity index 100%
rename from spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java
rename to spring-boot-modules/spring-boot-ci-cd/src/main/java/com/baeldung/cicd/CiCdApplication.java
diff --git a/spring-boot-ci-cd/src/main/resources/introduction-config.yml b/spring-boot-modules/spring-boot-ci-cd/src/main/resources/introduction-config.yml
similarity index 100%
rename from spring-boot-ci-cd/src/main/resources/introduction-config.yml
rename to spring-boot-modules/spring-boot-ci-cd/src/main/resources/introduction-config.yml
diff --git a/spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java
similarity index 100%
rename from spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java
rename to spring-boot-modules/spring-boot-ci-cd/src/test/java/com/baeldung/cicd/CiCdApplicationIntegrationTest.java

From d44a7f3d1c02f30cf4b375d28a6840584d3c99a1 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 08:46:23 -0400
Subject: [PATCH 340/404] Rename to hibernate-libraries

---
 .../.mvn/wrapper/MavenWrapperDownloader.java  | 117 +++++++
 .../.mvn/wrapper/maven-wrapper.properties     |   2 +
 .../docker-compose.yml                        |   0
 .../docker-entrypoint-initdb.d/init-db.sql    |   0
 .../docker/etc/mysql/conf.d/utf8.cnf          |   0
 persistence-modules/hibernate-libraries/mvnw  | 310 ++++++++++++++++++
 .../hibernate-libraries/mvnw.cmd              | 182 ++++++++++
 .../pom.xml                                   |   0
 .../com/baeldung/hibernate/types/Album.java   |   0
 .../hibernate/types/AlbumRepository.java      |   0
 .../com/baeldung/hibernate/types/Artist.java  |   0
 .../baeldung/hibernate/types/BaseEntity.java  |   0
 .../baeldung/hibernate/types/CoverArt.java    |   0
 .../types/HibernateTypesApplication.java      |   0
 .../com/baeldung/hibernate/types/Song.java    |   0
 .../hibernate/types/SongRepository.java       |   0
 .../src/main/resources/application.properties |   0
 .../main/resources/hibernate-types.properties |   0
 .../types/HibernateTypesIntegrationTest.java  |   0
 .../hibernate-types/.gitignore                |  33 --
 persistence-modules/hibernate-types/README.md |   7 -
 21 files changed, 611 insertions(+), 40 deletions(-)
 create mode 100644 persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java
 create mode 100644 persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties
 rename persistence-modules/{hibernate-types => hibernate-libraries}/docker-compose.yml (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/docker/docker-entrypoint-initdb.d/init-db.sql (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/docker/etc/mysql/conf.d/utf8.cnf (100%)
 create mode 100755 persistence-modules/hibernate-libraries/mvnw
 create mode 100644 persistence-modules/hibernate-libraries/mvnw.cmd
 rename persistence-modules/{hibernate-types => hibernate-libraries}/pom.xml (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/Album.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/Artist.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/BaseEntity.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/CoverArt.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/Song.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/java/com/baeldung/hibernate/types/SongRepository.java (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/resources/application.properties (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/main/resources/hibernate-types.properties (100%)
 rename persistence-modules/{hibernate-types => hibernate-libraries}/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java (100%)
 delete mode 100644 persistence-modules/hibernate-types/.gitignore
 delete mode 100644 persistence-modules/hibernate-types/README.md

diff --git a/persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java b/persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000000..b901097f2d
--- /dev/null
+++ b/persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed 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.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}
diff --git a/persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties b/persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000000..642d572ce9
--- /dev/null
+++ b/persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/persistence-modules/hibernate-types/docker-compose.yml b/persistence-modules/hibernate-libraries/docker-compose.yml
similarity index 100%
rename from persistence-modules/hibernate-types/docker-compose.yml
rename to persistence-modules/hibernate-libraries/docker-compose.yml
diff --git a/persistence-modules/hibernate-types/docker/docker-entrypoint-initdb.d/init-db.sql b/persistence-modules/hibernate-libraries/docker/docker-entrypoint-initdb.d/init-db.sql
similarity index 100%
rename from persistence-modules/hibernate-types/docker/docker-entrypoint-initdb.d/init-db.sql
rename to persistence-modules/hibernate-libraries/docker/docker-entrypoint-initdb.d/init-db.sql
diff --git a/persistence-modules/hibernate-types/docker/etc/mysql/conf.d/utf8.cnf b/persistence-modules/hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf
similarity index 100%
rename from persistence-modules/hibernate-types/docker/etc/mysql/conf.d/utf8.cnf
rename to persistence-modules/hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf
diff --git a/persistence-modules/hibernate-libraries/mvnw b/persistence-modules/hibernate-libraries/mvnw
new file mode 100755
index 0000000000..41c0f0c23d
--- /dev/null
+++ b/persistence-modules/hibernate-libraries/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/persistence-modules/hibernate-libraries/mvnw.cmd b/persistence-modules/hibernate-libraries/mvnw.cmd
new file mode 100644
index 0000000000..86115719e5
--- /dev/null
+++ b/persistence-modules/hibernate-libraries/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/persistence-modules/hibernate-types/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
similarity index 100%
rename from persistence-modules/hibernate-types/pom.xml
rename to persistence-modules/hibernate-libraries/pom.xml
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Album.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/Album.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Album.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/Album.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/AlbumRepository.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Artist.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/Artist.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Artist.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/Artist.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/BaseEntity.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/BaseEntity.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/BaseEntity.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/BaseEntity.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/CoverArt.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/CoverArt.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/CoverArt.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/CoverArt.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/HibernateTypesApplication.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Song.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/Song.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/Song.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/Song.java
diff --git a/persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/SongRepository.java b/persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/SongRepository.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/java/com/baeldung/hibernate/types/SongRepository.java
rename to persistence-modules/hibernate-libraries/src/main/java/com/baeldung/hibernate/types/SongRepository.java
diff --git a/persistence-modules/hibernate-types/src/main/resources/application.properties b/persistence-modules/hibernate-libraries/src/main/resources/application.properties
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/resources/application.properties
rename to persistence-modules/hibernate-libraries/src/main/resources/application.properties
diff --git a/persistence-modules/hibernate-types/src/main/resources/hibernate-types.properties b/persistence-modules/hibernate-libraries/src/main/resources/hibernate-types.properties
similarity index 100%
rename from persistence-modules/hibernate-types/src/main/resources/hibernate-types.properties
rename to persistence-modules/hibernate-libraries/src/main/resources/hibernate-types.properties
diff --git a/persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java b/persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
similarity index 100%
rename from persistence-modules/hibernate-types/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
rename to persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
diff --git a/persistence-modules/hibernate-types/.gitignore b/persistence-modules/hibernate-types/.gitignore
deleted file mode 100644
index 94b9c48616..0000000000
--- a/persistence-modules/hibernate-types/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-.classpath
-.project
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**
-!**/src/test/**
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-
-### VS Code ###
-.vscode/
diff --git a/persistence-modules/hibernate-types/README.md b/persistence-modules/hibernate-types/README.md
deleted file mode 100644
index 9d02d8c8f2..0000000000
--- a/persistence-modules/hibernate-types/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## Hibernate Types
-
-This module contains articles specific to use of Hibernate Types.
-
-### Relevant articles:
-
-- [A Guide to Hibernate Types Project](https://www.baeldung.com/a-guide-to-hibernate-types-project/)

From cc2dfb4206355318e25b110920e3c2af19a62f2c Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 08:52:18 -0400
Subject: [PATCH 341/404] Remove maven wrapper files

---
 .../.mvn/wrapper/MavenWrapperDownloader.java  | 117 -------
 .../.mvn/wrapper/maven-wrapper.properties     |   2 -
 persistence-modules/hibernate-libraries/mvnw  | 310 ------------------
 .../hibernate-libraries/mvnw.cmd              | 182 ----------
 4 files changed, 611 deletions(-)
 delete mode 100644 persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java
 delete mode 100644 persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties
 delete mode 100755 persistence-modules/hibernate-libraries/mvnw
 delete mode 100644 persistence-modules/hibernate-libraries/mvnw.cmd

diff --git a/persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java b/persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java
deleted file mode 100644
index b901097f2d..0000000000
--- a/persistence-modules/hibernate-libraries/.mvn/wrapper/MavenWrapperDownloader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2007-present the original author or authors.
- *
- * Licensed 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.
- */
-import java.net.*;
-import java.io.*;
-import java.nio.channels.*;
-import java.util.Properties;
-
-public class MavenWrapperDownloader {
-
-    private static final String WRAPPER_VERSION = "0.5.6";
-    /**
-     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
-     */
-    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
-        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
-
-    /**
-     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
-     * use instead of the default one.
-     */
-    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
-            ".mvn/wrapper/maven-wrapper.properties";
-
-    /**
-     * Path where the maven-wrapper.jar will be saved to.
-     */
-    private static final String MAVEN_WRAPPER_JAR_PATH =
-            ".mvn/wrapper/maven-wrapper.jar";
-
-    /**
-     * Name of the property which should be used to override the default download url for the wrapper.
-     */
-    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
-
-    public static void main(String args[]) {
-        System.out.println("- Downloader started");
-        File baseDirectory = new File(args[0]);
-        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
-
-        // If the maven-wrapper.properties exists, read it and check if it contains a custom
-        // wrapperUrl parameter.
-        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
-        String url = DEFAULT_DOWNLOAD_URL;
-        if(mavenWrapperPropertyFile.exists()) {
-            FileInputStream mavenWrapperPropertyFileInputStream = null;
-            try {
-                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
-                Properties mavenWrapperProperties = new Properties();
-                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
-                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
-            } catch (IOException e) {
-                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
-            } finally {
-                try {
-                    if(mavenWrapperPropertyFileInputStream != null) {
-                        mavenWrapperPropertyFileInputStream.close();
-                    }
-                } catch (IOException e) {
-                    // Ignore ...
-                }
-            }
-        }
-        System.out.println("- Downloading from: " + url);
-
-        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
-        if(!outputFile.getParentFile().exists()) {
-            if(!outputFile.getParentFile().mkdirs()) {
-                System.out.println(
-                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
-            }
-        }
-        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
-        try {
-            downloadFileFromURL(url, outputFile);
-            System.out.println("Done");
-            System.exit(0);
-        } catch (Throwable e) {
-            System.out.println("- Error downloading");
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
-        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
-            String username = System.getenv("MVNW_USERNAME");
-            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
-            Authenticator.setDefault(new Authenticator() {
-                @Override
-                protected PasswordAuthentication getPasswordAuthentication() {
-                    return new PasswordAuthentication(username, password);
-                }
-            });
-        }
-        URL website = new URL(urlString);
-        ReadableByteChannel rbc;
-        rbc = Channels.newChannel(website.openStream());
-        FileOutputStream fos = new FileOutputStream(destination);
-        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
-        fos.close();
-        rbc.close();
-    }
-
-}
diff --git a/persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties b/persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index 642d572ce9..0000000000
--- a/persistence-modules/hibernate-libraries/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
-wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/persistence-modules/hibernate-libraries/mvnw b/persistence-modules/hibernate-libraries/mvnw
deleted file mode 100755
index 41c0f0c23d..0000000000
--- a/persistence-modules/hibernate-libraries/mvnw
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# 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.
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-# Maven Start Up Batch script
-#
-# Required ENV vars:
-# ------------------
-#   JAVA_HOME - location of a JDK home dir
-#
-# Optional ENV vars
-# -----------------
-#   M2_HOME - location of maven2's installed home dir
-#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
-#     e.g. to debug Maven itself, use
-#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-# ----------------------------------------------------------------------------
-
-if [ -z "$MAVEN_SKIP_RC" ] ; then
-
-  if [ -f /etc/mavenrc ] ; then
-    . /etc/mavenrc
-  fi
-
-  if [ -f "$HOME/.mavenrc" ] ; then
-    . "$HOME/.mavenrc"
-  fi
-
-fi
-
-# OS specific support.  $var _must_ be set to either true or false.
-cygwin=false;
-darwin=false;
-mingw=false
-case "`uname`" in
-  CYGWIN*) cygwin=true ;;
-  MINGW*) mingw=true;;
-  Darwin*) darwin=true
-    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
-    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
-    if [ -z "$JAVA_HOME" ]; then
-      if [ -x "/usr/libexec/java_home" ]; then
-        export JAVA_HOME="`/usr/libexec/java_home`"
-      else
-        export JAVA_HOME="/Library/Java/Home"
-      fi
-    fi
-    ;;
-esac
-
-if [ -z "$JAVA_HOME" ] ; then
-  if [ -r /etc/gentoo-release ] ; then
-    JAVA_HOME=`java-config --jre-home`
-  fi
-fi
-
-if [ -z "$M2_HOME" ] ; then
-  ## resolve links - $0 may be a link to maven's home
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-
-  saveddir=`pwd`
-
-  M2_HOME=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  M2_HOME=`cd "$M2_HOME" && pwd`
-
-  cd "$saveddir"
-  # echo Using m2 at $M2_HOME
-fi
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched
-if $cygwin ; then
-  [ -n "$M2_HOME" ] &&
-    M2_HOME=`cygpath --unix "$M2_HOME"`
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-  [ -n "$CLASSPATH" ] &&
-    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
-fi
-
-# For Mingw, ensure paths are in UNIX format before anything is touched
-if $mingw ; then
-  [ -n "$M2_HOME" ] &&
-    M2_HOME="`(cd "$M2_HOME"; pwd)`"
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
-fi
-
-if [ -z "$JAVA_HOME" ]; then
-  javaExecutable="`which javac`"
-  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
-    # readlink(1) is not available as standard on Solaris 10.
-    readLink=`which readlink`
-    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
-      if $darwin ; then
-        javaHome="`dirname \"$javaExecutable\"`"
-        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
-      else
-        javaExecutable="`readlink -f \"$javaExecutable\"`"
-      fi
-      javaHome="`dirname \"$javaExecutable\"`"
-      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
-      JAVA_HOME="$javaHome"
-      export JAVA_HOME
-    fi
-  fi
-fi
-
-if [ -z "$JAVACMD" ] ; then
-  if [ -n "$JAVA_HOME"  ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-    fi
-  else
-    JAVACMD="`which java`"
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
-  echo "Error: JAVA_HOME is not defined correctly." >&2
-  echo "  We cannot execute $JAVACMD" >&2
-  exit 1
-fi
-
-if [ -z "$JAVA_HOME" ] ; then
-  echo "Warning: JAVA_HOME environment variable is not set."
-fi
-
-CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
-
-# traverses directory structure from process work directory to filesystem root
-# first directory with .mvn subdirectory is considered project base directory
-find_maven_basedir() {
-
-  if [ -z "$1" ]
-  then
-    echo "Path not specified to find_maven_basedir"
-    return 1
-  fi
-
-  basedir="$1"
-  wdir="$1"
-  while [ "$wdir" != '/' ] ; do
-    if [ -d "$wdir"/.mvn ] ; then
-      basedir=$wdir
-      break
-    fi
-    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
-    if [ -d "${wdir}" ]; then
-      wdir=`cd "$wdir/.."; pwd`
-    fi
-    # end of workaround
-  done
-  echo "${basedir}"
-}
-
-# concatenates all lines of a file
-concat_lines() {
-  if [ -f "$1" ]; then
-    echo "$(tr -s '\n' ' ' < "$1")"
-  fi
-}
-
-BASE_DIR=`find_maven_basedir "$(pwd)"`
-if [ -z "$BASE_DIR" ]; then
-  exit 1;
-fi
-
-##########################################################################################
-# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
-# This allows using the maven wrapper in projects that prohibit checking in binary data.
-##########################################################################################
-if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
-    if [ "$MVNW_VERBOSE" = true ]; then
-      echo "Found .mvn/wrapper/maven-wrapper.jar"
-    fi
-else
-    if [ "$MVNW_VERBOSE" = true ]; then
-      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
-    fi
-    if [ -n "$MVNW_REPOURL" ]; then
-      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
-    else
-      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
-    fi
-    while IFS="=" read key value; do
-      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
-      esac
-    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
-    if [ "$MVNW_VERBOSE" = true ]; then
-      echo "Downloading from: $jarUrl"
-    fi
-    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
-    if $cygwin; then
-      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
-    fi
-
-    if command -v wget > /dev/null; then
-        if [ "$MVNW_VERBOSE" = true ]; then
-          echo "Found wget ... using wget"
-        fi
-        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
-            wget "$jarUrl" -O "$wrapperJarPath"
-        else
-            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
-        fi
-    elif command -v curl > /dev/null; then
-        if [ "$MVNW_VERBOSE" = true ]; then
-          echo "Found curl ... using curl"
-        fi
-        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
-            curl -o "$wrapperJarPath" "$jarUrl" -f
-        else
-            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
-        fi
-
-    else
-        if [ "$MVNW_VERBOSE" = true ]; then
-          echo "Falling back to using Java to download"
-        fi
-        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
-        # For Cygwin, switch paths to Windows format before running javac
-        if $cygwin; then
-          javaClass=`cygpath --path --windows "$javaClass"`
-        fi
-        if [ -e "$javaClass" ]; then
-            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
-                if [ "$MVNW_VERBOSE" = true ]; then
-                  echo " - Compiling MavenWrapperDownloader.java ..."
-                fi
-                # Compiling the Java class
-                ("$JAVA_HOME/bin/javac" "$javaClass")
-            fi
-            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
-                # Running the downloader
-                if [ "$MVNW_VERBOSE" = true ]; then
-                  echo " - Running MavenWrapperDownloader.java ..."
-                fi
-                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
-            fi
-        fi
-    fi
-fi
-##########################################################################################
-# End of extension
-##########################################################################################
-
-export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
-if [ "$MVNW_VERBOSE" = true ]; then
-  echo $MAVEN_PROJECTBASEDIR
-fi
-MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin; then
-  [ -n "$M2_HOME" ] &&
-    M2_HOME=`cygpath --path --windows "$M2_HOME"`
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
-  [ -n "$CLASSPATH" ] &&
-    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
-    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
-fi
-
-# Provide a "standardized" way to retrieve the CLI args that will
-# work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
-export MAVEN_CMD_LINE_ARGS
-
-WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-exec "$JAVACMD" \
-  $MAVEN_OPTS \
-  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/persistence-modules/hibernate-libraries/mvnw.cmd b/persistence-modules/hibernate-libraries/mvnw.cmd
deleted file mode 100644
index 86115719e5..0000000000
--- a/persistence-modules/hibernate-libraries/mvnw.cmd
+++ /dev/null
@@ -1,182 +0,0 @@
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements.  See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership.  The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License.  You may obtain a copy of the License at
-@REM
-@REM    http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied.  See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Maven Start Up Batch script
-@REM
-@REM Required ENV vars:
-@REM JAVA_HOME - location of a JDK home dir
-@REM
-@REM Optional ENV vars
-@REM M2_HOME - location of maven2's installed home dir
-@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
-@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
-@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
-@REM     e.g. to debug Maven itself, use
-@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-@REM ----------------------------------------------------------------------------
-
-@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
-@echo off
-@REM set title of command window
-title %0
-@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
-@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
-
-@REM set %HOME% to equivalent of $HOME
-if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
-
-@REM Execute a user defined script before this one
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
-@REM check for pre script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
-if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
-:skipRcPre
-
-@setlocal
-
-set ERROR_CODE=0
-
-@REM To isolate internal variables from possible post scripts, we use another setlocal
-@setlocal
-
-@REM ==== START VALIDATION ====
-if not "%JAVA_HOME%" == "" goto OkJHome
-
-echo.
-echo Error: JAVA_HOME not found in your environment. >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-:OkJHome
-if exist "%JAVA_HOME%\bin\java.exe" goto init
-
-echo.
-echo Error: JAVA_HOME is set to an invalid directory. >&2
-echo JAVA_HOME = "%JAVA_HOME%" >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-@REM ==== END VALIDATION ====
-
-:init
-
-@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
-@REM Fallback to current working directory if not found.
-
-set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
-IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
-
-set EXEC_DIR=%CD%
-set WDIR=%EXEC_DIR%
-:findBaseDir
-IF EXIST "%WDIR%"\.mvn goto baseDirFound
-cd ..
-IF "%WDIR%"=="%CD%" goto baseDirNotFound
-set WDIR=%CD%
-goto findBaseDir
-
-:baseDirFound
-set MAVEN_PROJECTBASEDIR=%WDIR%
-cd "%EXEC_DIR%"
-goto endDetectBaseDir
-
-:baseDirNotFound
-set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
-cd "%EXEC_DIR%"
-
-:endDetectBaseDir
-
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
-
-@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
-@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
-
-:endReadAdditionalConfig
-
-SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
-set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
-set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
-
-FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
-    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
-)
-
-@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
-@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
-if exist %WRAPPER_JAR% (
-    if "%MVNW_VERBOSE%" == "true" (
-        echo Found %WRAPPER_JAR%
-    )
-) else (
-    if not "%MVNW_REPOURL%" == "" (
-        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
-    )
-    if "%MVNW_VERBOSE%" == "true" (
-        echo Couldn't find %WRAPPER_JAR%, downloading it ...
-        echo Downloading from: %DOWNLOAD_URL%
-    )
-
-    powershell -Command "&{"^
-		"$webclient = new-object System.Net.WebClient;"^
-		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
-		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
-		"}"^
-		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
-		"}"
-    if "%MVNW_VERBOSE%" == "true" (
-        echo Finished downloading %WRAPPER_JAR%
-    )
-)
-@REM End of extension
-
-@REM Provide a "standardized" way to retrieve the CLI args that will
-@REM work with both Windows and non-Windows executions.
-set MAVEN_CMD_LINE_ARGS=%*
-
-%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
-if ERRORLEVEL 1 goto error
-goto end
-
-:error
-set ERROR_CODE=1
-
-:end
-@endlocal & set ERROR_CODE=%ERROR_CODE%
-
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
-@REM check for post script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
-if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
-:skipRcPost
-
-@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
-if "%MAVEN_BATCH_PAUSE%" == "on" pause
-
-if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
-
-exit /B %ERROR_CODE%

From 8fd2a5ee8dd72f5e6f026f44f0b6b2e0d64e0006 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 09:10:36 -0400
Subject: [PATCH 342/404] Create create-database.sh

---
 .../hibernate-libraries/create-database.sh                | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 persistence-modules/hibernate-libraries/create-database.sh

diff --git a/persistence-modules/hibernate-libraries/create-database.sh b/persistence-modules/hibernate-libraries/create-database.sh
new file mode 100644
index 0000000000..aa363b582e
--- /dev/null
+++ b/persistence-modules/hibernate-libraries/create-database.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+docker run \
+  -p 53306:3306 \
+  --name=mysql57-hibernate-types \
+  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
+  -v ${PWD}/docker/etc/mysql/conf.d:/etc/mysql/conf.d \
+  -v ${PWD}/docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d \
+  -d mysql:5.7

From 2819b53e15e4591b3bcd399e95c45b5bd84bf2da Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 09:12:52 -0400
Subject: [PATCH 343/404] Make shell script executable

---
 persistence-modules/hibernate-libraries/create-database.sh | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 persistence-modules/hibernate-libraries/create-database.sh

diff --git a/persistence-modules/hibernate-libraries/create-database.sh b/persistence-modules/hibernate-libraries/create-database.sh
old mode 100644
new mode 100755

From aa9ee72e9e0b1eef0689b1a58cc848e415af1f43 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 09:49:42 -0400
Subject: [PATCH 344/404] Update create-database.sh

---
 persistence-modules/hibernate-libraries/create-database.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/persistence-modules/hibernate-libraries/create-database.sh b/persistence-modules/hibernate-libraries/create-database.sh
index aa363b582e..fec49cd5db 100755
--- a/persistence-modules/hibernate-libraries/create-database.sh
+++ b/persistence-modules/hibernate-libraries/create-database.sh
@@ -3,6 +3,6 @@ docker run \
   -p 53306:3306 \
   --name=mysql57-hibernate-types \
   -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
-  -v ${PWD}/docker/etc/mysql/conf.d:/etc/mysql/conf.d \
-  -v ${PWD}/docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d \
+  -v "${PWD}/docker/etc/mysql/conf.d":/etc/mysql/conf.d \
+  -v "${PWD}/docker/docker-entrypoint-initdb.d":/docker-entrypoint-initdb.d \
   -d mysql:5.7

From 8a30bb544c9436ec859a0697e232c1a4d8974031 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 09:50:24 -0400
Subject: [PATCH 345/404] Update pom.xml

---
 persistence-modules/hibernate-libraries/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
index 4d686c72a5..418437eb8b 100644
--- a/persistence-modules/hibernate-libraries/pom.xml
+++ b/persistence-modules/hibernate-libraries/pom.xml
@@ -2,7 +2,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>hibernate-types</artifactId>
+    <artifactId>hibernate-libraries</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>hibernate-types</name>
     <description>Introduction into hibernate types library</description>

From 488989e3de23df21f0050e0f46e4b5d64e8f49e0 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 09:59:02 -0400
Subject: [PATCH 346/404] Update pom.xml

---
 persistence-modules/hibernate-libraries/pom.xml | 6 +++---
 persistence-modules/pom.xml                     | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
index 4d686c72a5..0b6b5546aa 100644
--- a/persistence-modules/hibernate-libraries/pom.xml
+++ b/persistence-modules/hibernate-libraries/pom.xml
@@ -4,7 +4,7 @@
     <modelVersion>4.0.0</modelVersion>
     <artifactId>hibernate-types</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <name>hibernate-types</name>
+    <name>hibernate-libraries</name>
     <description>Introduction into hibernate types library</description>
 
     <parent>
@@ -142,8 +142,8 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>${maven.version}</version>
                 <configuration>
-                    <source>${source.version}</source>
-                    <target>${target.version}</target>
+                    <source>1.8</source>
+                    <target>1.8</target>
                 </configuration>
             </plugin>
             <plugin>
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 4d39b2d98b..3e2c2e6a0f 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -24,7 +24,7 @@
         <module>hibernate-mapping</module> <!-- long running -->
         <module>hibernate-ogm</module>
         <module>hibernate-annotations</module>
-        <module>hibernate-types</module>
+        <module>hibernate-libraries</module>
         <module>hibernate-jpa</module>
         <module>hibernate-queries</module>
         <module>hibernate-enterprise</module>

From ade74299c8d1d4eaca1807a3e08830df6abce132 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 10:11:56 -0400
Subject: [PATCH 347/404] Remove build plugins

---
 .../hibernate-libraries/pom.xml               | 26 -------------------
 1 file changed, 26 deletions(-)

diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
index 0e99b0d904..ea2dda7e88 100644
--- a/persistence-modules/hibernate-libraries/pom.xml
+++ b/persistence-modules/hibernate-libraries/pom.xml
@@ -132,32 +132,6 @@
                 <filtering>true</filtering>
             </resource>
         </resources>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>${maven.version}</version>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <forkCount>3</forkCount>
-                    <reuseForks>true</reuseForks>
-                    <excludes>
-                        <exclude>**/*IntegrationTest.java</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
     </build>
 
     <profiles>

From aca989958fb2143df787a11b0770b5a04dccba10 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sun, 17 May 2020 10:17:12 -0400
Subject: [PATCH 348/404] Remove utf8.cnf

---
 persistence-modules/hibernate-libraries/create-database.sh | 1 -
 .../hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf   | 7 -------
 2 files changed, 8 deletions(-)
 delete mode 100644 persistence-modules/hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf

diff --git a/persistence-modules/hibernate-libraries/create-database.sh b/persistence-modules/hibernate-libraries/create-database.sh
index fec49cd5db..da55dc917d 100755
--- a/persistence-modules/hibernate-libraries/create-database.sh
+++ b/persistence-modules/hibernate-libraries/create-database.sh
@@ -3,6 +3,5 @@ docker run \
   -p 53306:3306 \
   --name=mysql57-hibernate-types \
   -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
-  -v "${PWD}/docker/etc/mysql/conf.d":/etc/mysql/conf.d \
   -v "${PWD}/docker/docker-entrypoint-initdb.d":/docker-entrypoint-initdb.d \
   -d mysql:5.7
diff --git a/persistence-modules/hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf b/persistence-modules/hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf
deleted file mode 100644
index 1885d83c8b..0000000000
--- a/persistence-modules/hibernate-libraries/docker/etc/mysql/conf.d/utf8.cnf
+++ /dev/null
@@ -1,7 +0,0 @@
-[mysqld]
-init_connect='SET collation_connection = utf8_unicode_ci'
-character-set-server = utf8
-collation-server = utf8_unicode_ci
-
-[client]
-default-character-set = utf8
\ No newline at end of file

From 8de92f7f4c07e3db25349590d497181dfe99bc84 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 17 May 2020 21:10:55 +0530
Subject: [PATCH 349/404] removed unwanted path from web security config

---
 spring-security-modules/spring-security-mvc-boot-1/pom.xml    | 4 ++++
 .../main/java/com/baeldung/roles/voter/VoterApplication.java  | 2 +-
 .../main/java/com/baeldung/roles/voter/WebSecurityConfig.java | 2 +-
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/spring-security-modules/spring-security-mvc-boot-1/pom.xml b/spring-security-modules/spring-security-mvc-boot-1/pom.xml
index 7ad18376ec..b00b7bab32 100644
--- a/spring-security-modules/spring-security-mvc-boot-1/pom.xml
+++ b/spring-security-modules/spring-security-mvc-boot-1/pom.xml
@@ -106,6 +106,10 @@
             <version>${ehcache-core.version}</version>
             <type>jar</type>
         </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java
index d3e0652ae9..148f9c17b1 100644
--- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java
@@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration;
 
 @Configuration
 @EnableAutoConfiguration
-@ComponentScan(basePackages = {"com.baeldung.voter"})
+@ComponentScan(basePackages = {"com.baeldung.roles.voter"})
 public class VoterApplication {
 
     public static void main(String[] args) {
diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java
index 8a0f438b49..1a6d1b8235 100644
--- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java
@@ -34,7 +34,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
         // @formatter: off
         http
                 // needed so our login could work
-                .csrf().disable().authorizeRequests().anyRequest().authenticated().accessDecisionManager(accessDecisionManager()).antMatchers("/").hasAnyRole("ROLE_ADMIN", "ROLE_USER").and().formLogin().permitAll().and().logout().permitAll()
+                .csrf().disable().authorizeRequests().anyRequest().authenticated().accessDecisionManager(accessDecisionManager()).and().formLogin().permitAll().and().logout().permitAll()
                 .deleteCookies("JSESSIONID").logoutSuccessUrl("/login");
         // @formatter: on
     }

From c66c60bcffa4c1023636f136acf52e7a7d7bd3e4 Mon Sep 17 00:00:00 2001
From: Amy DeGregorio <amy.m.degregorio@gmail.com>
Date: Sun, 17 May 2020 14:17:51 -0400
Subject: [PATCH 350/404] BAEL-3462 Univosity Parsers (#9222)

* BAEL-3462 CSV Univosity Example

* Added a row processor example
---
 libraries-data-2/pom.xml                      |   6 +
 .../com/baeldung/univocity/OutputService.java |  80 +++++++++++++
 .../baeldung/univocity/ParsingService.java    |  85 +++++++++++++
 .../com/baeldung/univocity/model/Product.java |  44 +++++++
 .../univocity/ParsingServiceUnitTest.java     | 112 ++++++++++++++++++
 .../src/test/resources/largeProductList.csv   |  36 ++++++
 .../src/test/resources/productList.csv        |   3 +
 .../src/test/resources/productList.txt        |   3 +
 .../test/resources/productListWithHeaders.csv |   3 +
 .../test/resources/productListWithHeaders.txt |   2 +
 10 files changed, 374 insertions(+)
 create mode 100644 libraries-data-2/src/main/java/com/baeldung/univocity/OutputService.java
 create mode 100644 libraries-data-2/src/main/java/com/baeldung/univocity/ParsingService.java
 create mode 100644 libraries-data-2/src/main/java/com/baeldung/univocity/model/Product.java
 create mode 100644 libraries-data-2/src/test/java/com/baeldung/univocity/ParsingServiceUnitTest.java
 create mode 100644 libraries-data-2/src/test/resources/largeProductList.csv
 create mode 100644 libraries-data-2/src/test/resources/productList.csv
 create mode 100644 libraries-data-2/src/test/resources/productList.txt
 create mode 100644 libraries-data-2/src/test/resources/productListWithHeaders.csv
 create mode 100644 libraries-data-2/src/test/resources/productListWithHeaders.txt

diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml
index 73c5452f77..cbb24edd3f 100644
--- a/libraries-data-2/pom.xml
+++ b/libraries-data-2/pom.xml
@@ -116,6 +116,11 @@
             <artifactId>slf4j-log4j12</artifactId>
             <version>${slf4j.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.univocity</groupId>
+            <artifactId>univocity-parsers</artifactId>
+            <version>${univocity.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.awaitility</groupId>
             <artifactId>awaitility</artifactId>
@@ -175,6 +180,7 @@
         <assertj.version>3.6.2</assertj.version>
         <slf4j.version>1.7.25</slf4j.version>
         <awaitility.version>3.0.0</awaitility.version>
+        <univocity.version>2.8.4</univocity.version>
         <renjin.version>RELEASE</renjin.version>
         <rcaller.version>3.0</rcaller.version>
         <rserve.version>1.8.1</rserve.version>
diff --git a/libraries-data-2/src/main/java/com/baeldung/univocity/OutputService.java b/libraries-data-2/src/main/java/com/baeldung/univocity/OutputService.java
new file mode 100644
index 0000000000..b316a602ad
--- /dev/null
+++ b/libraries-data-2/src/main/java/com/baeldung/univocity/OutputService.java
@@ -0,0 +1,80 @@
+package com.baeldung.univocity;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.univocity.model.Product;
+import com.univocity.parsers.common.processor.BeanWriterProcessor;
+import com.univocity.parsers.csv.CsvWriter;
+import com.univocity.parsers.csv.CsvWriterSettings;
+import com.univocity.parsers.fixed.FixedWidthFields;
+import com.univocity.parsers.fixed.FixedWidthWriter;
+import com.univocity.parsers.fixed.FixedWidthWriterSettings;
+import com.univocity.parsers.tsv.TsvWriter;
+import com.univocity.parsers.tsv.TsvWriterSettings;
+
+public class OutputService {
+    private Logger logger = LoggerFactory.getLogger(ParsingService.class);
+
+    public enum OutputType {
+        CSV, TSV, FIXED_WIDTH
+    };
+
+    public boolean writeData(List<Object[]> products, OutputType outputType, String outputPath) {
+        try (Writer outputWriter = new OutputStreamWriter(new FileOutputStream(new File(outputPath)), "UTF-8")) {
+            switch (outputType) {
+            case CSV: {
+                CsvWriter writer = new CsvWriter(outputWriter, new CsvWriterSettings());
+                writer.writeRowsAndClose(products);
+            }
+                break;
+            case TSV: {
+                TsvWriter writer = new TsvWriter(outputWriter, new TsvWriterSettings());
+                writer.writeRowsAndClose(products);
+            }
+                break;
+            case FIXED_WIDTH: {
+                FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10);
+                FixedWidthWriterSettings settings = new FixedWidthWriterSettings(fieldLengths);
+                FixedWidthWriter writer = new FixedWidthWriter(outputWriter, settings);
+                writer.writeRowsAndClose(products);
+            }
+                break;
+            default:
+                logger.warn("Invalid OutputType: " + outputType);
+                return false;
+            }
+            return true;
+        } catch (IOException e) {
+            logger.error(e.getMessage());
+            return false;
+        }
+    }
+
+    public boolean writeBeanToFixedWidthFile(List<Product> products, String outputPath) {
+        try (Writer outputWriter = new OutputStreamWriter(new FileOutputStream(new File(outputPath)), "UTF-8")) {
+            BeanWriterProcessor<Product> rowProcessor = new BeanWriterProcessor<Product>(Product.class);
+            FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10);
+            FixedWidthWriterSettings settings = new FixedWidthWriterSettings(fieldLengths);
+            settings.setHeaders("product_no", "description", "unit_price");
+            settings.setRowWriterProcessor(rowProcessor);
+            FixedWidthWriter writer = new FixedWidthWriter(outputWriter, settings);
+            writer.writeHeaders();
+            for (Product product : products) {
+                writer.processRecord(product);
+            }
+            writer.close();
+            return true;
+        } catch (IOException e) {
+            logger.error(e.getMessage());
+            return false;
+        }
+    }
+}
diff --git a/libraries-data-2/src/main/java/com/baeldung/univocity/ParsingService.java b/libraries-data-2/src/main/java/com/baeldung/univocity/ParsingService.java
new file mode 100644
index 0000000000..a88023b5d3
--- /dev/null
+++ b/libraries-data-2/src/main/java/com/baeldung/univocity/ParsingService.java
@@ -0,0 +1,85 @@
+package com.baeldung.univocity;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.univocity.model.Product;
+import com.univocity.parsers.common.processor.BatchedColumnProcessor;
+import com.univocity.parsers.common.processor.BeanListProcessor;
+import com.univocity.parsers.csv.CsvParser;
+import com.univocity.parsers.csv.CsvParserSettings;
+import com.univocity.parsers.fixed.FixedWidthFields;
+import com.univocity.parsers.fixed.FixedWidthParser;
+import com.univocity.parsers.fixed.FixedWidthParserSettings;
+
+public class ParsingService {
+    private Logger logger = LoggerFactory.getLogger(ParsingService.class);
+
+    public List<String[]> parseCsvFile(String relativePath) {
+        try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
+            CsvParserSettings settings = new CsvParserSettings();
+            settings.setMaxCharsPerColumn(100);
+            settings.setMaxColumns(50);
+            CsvParser parser = new CsvParser(settings);
+            List<String[]> parsedRows = parser.parseAll(inputReader);
+            return parsedRows;
+        } catch (IOException e) {
+            logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
+            return new ArrayList<String[]>();
+        }
+    }
+
+    public List<String[]> parseFixedWidthFile(String relativePath) {
+        try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
+            FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10);
+            FixedWidthParserSettings settings = new FixedWidthParserSettings(fieldLengths);
+
+            FixedWidthParser parser = new FixedWidthParser(settings);
+            List<String[]> parsedRows = parser.parseAll(inputReader);
+            return parsedRows;
+        } catch (IOException e) {
+            logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
+            return new ArrayList<String[]>();
+        }
+    }
+
+    public List<Product> parseCsvFileIntoBeans(String relativePath) {
+        try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
+            BeanListProcessor<Product> rowProcessor = new BeanListProcessor<Product>(Product.class);
+            CsvParserSettings settings = new CsvParserSettings();
+            settings.setHeaderExtractionEnabled(true);
+            settings.setProcessor(rowProcessor);
+            CsvParser parser = new CsvParser(settings);
+            parser.parse(inputReader);
+            return rowProcessor.getBeans();
+        } catch (IOException e) {
+            logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
+            return new ArrayList<Product>();
+        }
+    }
+
+    public List<String[]> parseCsvFileInBatches(String relativePath) {
+        try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
+            CsvParserSettings settings = new CsvParserSettings();
+            settings.setProcessor(new BatchedColumnProcessor(5) {
+                @Override
+                public void batchProcessed(int rowsInThisBatch) {
+                }
+            });
+            CsvParser parser = new CsvParser(settings);
+            List<String[]> parsedRows = parser.parseAll(inputReader);
+            return parsedRows;
+        } catch (IOException e) {
+            logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
+            return new ArrayList<String[]>();
+        }
+    }
+}
diff --git a/libraries-data-2/src/main/java/com/baeldung/univocity/model/Product.java b/libraries-data-2/src/main/java/com/baeldung/univocity/model/Product.java
new file mode 100644
index 0000000000..dc4a28f62a
--- /dev/null
+++ b/libraries-data-2/src/main/java/com/baeldung/univocity/model/Product.java
@@ -0,0 +1,44 @@
+package com.baeldung.univocity.model;
+
+import com.univocity.parsers.annotations.Parsed;
+
+public class Product {
+
+    @Parsed(field = "product_no")
+    private String productNumber;
+
+    @Parsed
+    private String description;
+
+    @Parsed(field = "unit_price")
+    private float unitPrice;
+
+    public String getProductNumber() {
+        return productNumber;
+    }
+
+    public void setProductNumber(String productNumber) {
+        this.productNumber = productNumber;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public float getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(float unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    @Override
+    public String toString() {
+        return "Product [Product Number: " + productNumber + ", Description: " + description + ", Unit Price: " + unitPrice + "]";
+    }
+}
diff --git a/libraries-data-2/src/test/java/com/baeldung/univocity/ParsingServiceUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/univocity/ParsingServiceUnitTest.java
new file mode 100644
index 0000000000..8cac0bc4b8
--- /dev/null
+++ b/libraries-data-2/src/test/java/com/baeldung/univocity/ParsingServiceUnitTest.java
@@ -0,0 +1,112 @@
+package com.baeldung.univocity;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.baeldung.univocity.model.Product;
+
+public class ParsingServiceUnitTest {
+
+    @Test
+    public void givenCsvFile_thenParsedResultsShouldBeReturned() {
+        ParsingService parsingService = new ParsingService();
+        List<String[]> productData = parsingService.parseCsvFile("src/test/resources/productList.csv");
+        assertEquals(3, productData.size());
+        assertEquals(3, productData.get(0).length);
+        assertEquals("A8993-10", productData.get(0)[0]);
+        assertEquals("Extra large widget", productData.get(0)[1]);
+        assertEquals("35.42", productData.get(0)[2]);
+        assertEquals("D-2938-1", productData.get(1)[0]);
+        assertEquals("Winding widget \"Deluxe Model\"", productData.get(1)[1]);
+        assertEquals("245.99", productData.get(1)[2]);
+        assertEquals("R3212-32", productData.get(2)[0]);
+        assertEquals("Standard widget", productData.get(2)[1]);
+        assertEquals("2.34", productData.get(2)[2]);
+    }
+
+    @Test
+    public void givenFixedWidthFile_thenParsedResultsShouldBeReturned() {
+        ParsingService parsingService = new ParsingService();
+        List<String[]> productData = parsingService.parseFixedWidthFile("src/test/resources/productList.txt");
+        // Note: any extra spaces on the end will cause a null line to be added
+        assertEquals(3, productData.size());
+        assertEquals(3, productData.get(0).length);
+        assertEquals("A8993-10", productData.get(0)[0]);
+        assertEquals("Extra large widget", productData.get(0)[1]);
+        assertEquals("35.42", productData.get(0)[2]);
+        assertEquals("D-2938-1", productData.get(1)[0]);
+        assertEquals("Winding widget \"Deluxe Model\"", productData.get(1)[1]);
+        assertEquals("245.99", productData.get(1)[2]);
+        assertEquals("R3212-32", productData.get(2)[0]);
+        assertEquals("Standard widget", productData.get(2)[1]);
+        assertEquals("2.34", productData.get(2)[2]);
+    }
+
+    @Test
+    public void givenDataAndCsvOutputType_thenCsvFileProduced() {
+        OutputService outputService = new OutputService();
+        List<Object[]> productData = new ArrayList<>();
+        productData.add(new Object[] { "1000-3-0", "Widget No. 96", "5.67" });
+        productData.add(new Object[] { "G930-M-P", "1/4\" Wocket", ".67" });
+        productData.add(new Object[] { "8080-0-M", "No. 54 Jumbo Widget", "35.74" });
+        outputService.writeData(productData, OutputService.OutputType.CSV, "src/test/resources/outputProductList.csv");
+
+        ParsingService parsingService = new ParsingService();
+        List<String[]> writtenData = parsingService.parseCsvFile("src/test/resources/outputProductList.csv");
+        assertEquals(3, writtenData.size());
+        assertEquals(3, writtenData.get(0).length);
+    }
+
+    @Test
+    public void givenDataAndFixedWidthOutputType_thenFixedWidthFileProduced() {
+        OutputService outputService = new OutputService();
+        List<Object[]> productData = new ArrayList<>();
+        productData.add(new Object[] { "1000-3-0", "Widget No. 96", "5.67" });
+        productData.add(new Object[] { "G930-M-P", "1/4\" Wocket", ".67" });
+        productData.add(new Object[] { "8080-0-M", "No. 54 Jumbo Widget", "35.74" });
+        outputService.writeData(productData, OutputService.OutputType.FIXED_WIDTH, "src/test/resources/outputProductList.txt");
+
+        ParsingService parsingService = new ParsingService();
+        List<String[]> writtenData = parsingService.parseFixedWidthFile("src/test/resources/outputProductList.txt");
+        assertEquals(3, writtenData.size());
+        assertEquals(3, writtenData.get(0).length);
+    }
+
+    @Test
+    public void givenCsvFile_thenCsvFileParsedIntoBeans() {
+        ParsingService parsingService = new ParsingService();
+        List<Product> products = parsingService.parseCsvFileIntoBeans("src/test/resources/productListWithHeaders.csv");
+        assertEquals(2, products.size());
+        assertEquals("Product [Product Number: 99-378AG, Description: Wocket Widget #42, Unit Price: 3.56]", products.get(0)
+            .toString());
+        assertEquals("Product [Product Number: TB-333-0, Description: Turbine Widget replacement kit, Unit Price: 800.99]", products.get(1)
+            .toString());
+    }
+
+    @Test
+    public void givenLisOfProduct_thenWriteFixedWidthFile() {
+        OutputService outputService = new OutputService();
+        Product product = new Product();
+        product.setProductNumber("007-PPG0");
+        product.setDescription("3/8\" x 1\" Wocket");
+        product.setUnitPrice(45.99f);
+        List<Product> products = new ArrayList<>();
+        products.add(product);
+        outputService.writeBeanToFixedWidthFile(products, "src/test/resources/productListWithHeaders.txt");
+        ParsingService parsingService = new ParsingService();
+        List<String[]> writtenData = parsingService.parseFixedWidthFile("src/test/resources/productListWithHeaders.txt");
+        assertEquals(2, writtenData.size());
+        assertEquals(3, writtenData.get(0).length);
+    }
+
+    @Test
+    public void givenLargeCsvFile_thenParsedDataShouldBeReturned() {
+        ParsingService parsingService = new ParsingService();
+        List<String[]> productData = parsingService.parseCsvFileInBatches("src/test/resources/largeProductList.csv");
+        assertEquals(36, productData.size());
+    }
+}
diff --git a/libraries-data-2/src/test/resources/largeProductList.csv b/libraries-data-2/src/test/resources/largeProductList.csv
new file mode 100644
index 0000000000..2b1813d974
--- /dev/null
+++ b/libraries-data-2/src/test/resources/largeProductList.csv
@@ -0,0 +1,36 @@
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
\ No newline at end of file
diff --git a/libraries-data-2/src/test/resources/productList.csv b/libraries-data-2/src/test/resources/productList.csv
new file mode 100644
index 0000000000..f3a03b6c98
--- /dev/null
+++ b/libraries-data-2/src/test/resources/productList.csv
@@ -0,0 +1,3 @@
+A8993-10,"Extra large widget",35.42
+D-2938-1,"Winding widget ""Deluxe Model""",245.99
+R3212-32,"Standard widget",2.34
\ No newline at end of file
diff --git a/libraries-data-2/src/test/resources/productList.txt b/libraries-data-2/src/test/resources/productList.txt
new file mode 100644
index 0000000000..eca4caf55a
--- /dev/null
+++ b/libraries-data-2/src/test/resources/productList.txt
@@ -0,0 +1,3 @@
+A8993-10Extra large widget            35.42     
+D-2938-1Winding widget "Deluxe Model" 245.99    
+R3212-32Standard widget               2.34      
\ No newline at end of file
diff --git a/libraries-data-2/src/test/resources/productListWithHeaders.csv b/libraries-data-2/src/test/resources/productListWithHeaders.csv
new file mode 100644
index 0000000000..6514a7f0f7
--- /dev/null
+++ b/libraries-data-2/src/test/resources/productListWithHeaders.csv
@@ -0,0 +1,3 @@
+product_no, description, unit_price
+99-378AG,Wocket Widget #42,3.56
+TB-333-0,Turbine Widget replacement kit,800.99
\ No newline at end of file
diff --git a/libraries-data-2/src/test/resources/productListWithHeaders.txt b/libraries-data-2/src/test/resources/productListWithHeaders.txt
new file mode 100644
index 0000000000..0fced57aed
--- /dev/null
+++ b/libraries-data-2/src/test/resources/productListWithHeaders.txt
@@ -0,0 +1,2 @@
+product_description                   unit_price
+007-PPG03/8" x 1" Wocket              45.99     

From 515bcf55ea8f2787c33ee8b8351374b192868208 Mon Sep 17 00:00:00 2001
From: ajay74984 <51405689+ajay74984@users.noreply.github.com>
Date: Sun, 17 May 2020 20:51:59 +0200
Subject: [PATCH 351/404] OCP review comments. (#9310)

* OCP change

* calculator unit test

* renamed variable and abstract class addition
---
 .../o/AbstractCalculatorOperation.java        |  7 +++
 .../main/java/com/baeldung/o/Addition.java    | 28 ++++-----
 .../main/java/com/baeldung/o/Division.java    | 62 +++++++++----------
 .../main/java/com/baeldung/o/Subtraction.java | 28 ++++-----
 .../com/baeldung/o/CalculatorUnitTest.java    | 10 +--
 5 files changed, 71 insertions(+), 64 deletions(-)
 create mode 100644 patterns/solid/src/main/java/com/baeldung/o/AbstractCalculatorOperation.java

diff --git a/patterns/solid/src/main/java/com/baeldung/o/AbstractCalculatorOperation.java b/patterns/solid/src/main/java/com/baeldung/o/AbstractCalculatorOperation.java
new file mode 100644
index 0000000000..798d5e2d95
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/AbstractCalculatorOperation.java
@@ -0,0 +1,7 @@
+package com.baeldung.o;
+
+public abstract class AbstractCalculatorOperation {
+
+	abstract void perform();
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Addition.java b/patterns/solid/src/main/java/com/baeldung/o/Addition.java
index 6145b386d9..1ad99aad4b 100644
--- a/patterns/solid/src/main/java/com/baeldung/o/Addition.java
+++ b/patterns/solid/src/main/java/com/baeldung/o/Addition.java
@@ -1,29 +1,29 @@
 package com.baeldung.o;
 
 public class Addition implements CalculatorOperation {
-    private double number1;
-    private double number2;
+    private double left;
+    private double right;
     private double result = 0.0;
 
-    public Addition(double number1, double number2) {
-        this.number1 = number1;
-        this.number2 = number2;
+    public Addition(double left, double right) {
+        this.left = left;
+        this.right = right;
     }
 
-    public double getNumber1() {
-        return number1;
+    public double getLeft() {
+        return left;
     }
 
-    public void setNumber1(double number1) {
-        this.number1 = number1;
+    public void setLeft(double left) {
+        this.left = left;
     }
 
-    public double getNumber2() {
-        return number2;
+    public double getRight() {
+        return right;
     }
 
-    public void setNumber2(double number2) {
-        this.number2 = number2;
+    public void setRight(double right) {
+        this.right = right;
     }
 
     public double getResult() {
@@ -36,6 +36,6 @@ public class Addition implements CalculatorOperation {
 
     @Override
     public void perform() {
-        result = number1 + number2;
+        result = left + right;
     }
 }
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Division.java b/patterns/solid/src/main/java/com/baeldung/o/Division.java
index 24ab4355c2..fbb8a1f523 100644
--- a/patterns/solid/src/main/java/com/baeldung/o/Division.java
+++ b/patterns/solid/src/main/java/com/baeldung/o/Division.java
@@ -1,43 +1,43 @@
 package com.baeldung.o;
 
 public class Division implements CalculatorOperation {
-    private double number1;
-    private double number2;
-    private double result = 0.0;
+	private double left;
+	private double right;
+	private double result = 0.0;
 
-    public Division(double number1, double number2) {
-        this.number1 = number1;
-        this.number2 = number2;
-    }
+	public Division(double left, double right) {
+		this.left = left;
+		this.right = right;
+	}
 
-    public double getNumber1() {
-        return number1;
-    }
+	public double getLeft() {
+		return left;
+	}
 
-    public void setNumber1(double number1) {
-        this.number1 = number1;
-    }
+	public void setLeft(double left) {
+		this.left = left;
+	}
 
-    public double getNumber2() {
-        return number2;
-    }
+	public double getRight() {
+		return right;
+	}
 
-    public void setNumber2(double number2) {
-        this.number2 = number2;
-    }
+	public void setRight(double right) {
+		this.right = right;
+	}
 
-    public double getResult() {
-        return result;
-    }
+	public double getResult() {
+		return result;
+	}
 
-    public void setResult(double result) {
-        this.result = result;
-    }
+	public void setResult(double result) {
+		this.result = result;
+	}
 
-    @Override
-    public void perform() {
-        if (number2 != 0) {
-            result = number1 / number2;
-        }
-    }
+	@Override
+	public void perform() {
+		if (right != 0) {
+			result = left / right;
+		}
+	}
 }
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java b/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java
index b74e0c5f73..5827d33568 100644
--- a/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java
+++ b/patterns/solid/src/main/java/com/baeldung/o/Subtraction.java
@@ -1,29 +1,29 @@
 package com.baeldung.o;
 
 public class Subtraction implements CalculatorOperation {
-    private double number1;
-    private double number2;
+    private double left;
+    private double right;
     private double result = 0.0;
 
-    public Subtraction(double number1, double number2) {
-        this.number1 = number1;
-        this.number2 = number2;
+    public Subtraction(double left, double right) {
+        this.left = left;
+        this.right = right;
     }
 
-    public double getNumber1() {
-        return number1;
+    public double getLeft() {
+        return left;
     }
 
-    public void setNumber1(double number1) {
-        this.number1 = number1;
+    public void setLeft(double left) {
+        this.left = left;
     }
 
-    public double getNumber2() {
-        return number2;
+    public double getRight() {
+        return right;
     }
 
-    public void setNumber2(double number2) {
-        this.number2 = number2;
+    public void setRight(double right) {
+        this.right = right;
     }
 
     public double getResult() {
@@ -36,6 +36,6 @@ public class Subtraction implements CalculatorOperation {
 
     @Override
     public void perform() {
-        result = number1 - number2;
+        result = left - right;
     }
 }
diff --git a/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java b/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java
index f372d450a7..3ae894e963 100644
--- a/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java
+++ b/patterns/solid/src/main/test/com/baeldung/o/CalculatorUnitTest.java
@@ -7,8 +7,8 @@ import org.junit.jupiter.api.Test;
 
 public class CalculatorUnitTest {
 
-	private static final double NUMBER_1 = 10.0;
-	private static final double NUMBER_2 = 20.0;
+	private static final double RIGHT = 10.0;
+	private static final double LEFT = 20.0;
 	private static final double SUM = 30.0;
 	private static final double SUBTRACTION_RESULT = 10.0;
 	private static final double DIVISION_RESULT = 2.0;
@@ -22,21 +22,21 @@ public class CalculatorUnitTest {
 
 	@Test
 	public void whenAddTwoNumber_returnSum() {
-		Addition addition = new Addition(NUMBER_1, NUMBER_2);
+		Addition addition = new Addition(RIGHT, LEFT);
 		calculator.calculate(addition);
 		assertEquals(SUM, addition.getResult(), 0.0);
 	}
 
 	@Test
 	public void whenSutractTwoNumber_returnCorrectResult() {
-		Subtraction subtraction = new Subtraction(NUMBER_2, NUMBER_1);
+		Subtraction subtraction = new Subtraction(LEFT, RIGHT);
 		calculator.calculate(subtraction);
 		assertEquals(SUBTRACTION_RESULT, subtraction.getResult(), 0.0);
 	}
 
 	@Test
 	public void whenDivideTwoNumber_returnCorrectResult() {
-		Division division = new Division(NUMBER_2, NUMBER_1);
+		Division division = new Division(LEFT, RIGHT);
 		calculator.calculate(division);
 		assertEquals(DIVISION_RESULT, division.getResult(), 0.0);
 	}

From 5183afbce183afd825d67d7494717251a03205e7 Mon Sep 17 00:00:00 2001
From: Kyle Doyle <kdoyle8597@gmail.com>
Date: Sun, 17 May 2020 23:45:25 -0400
Subject: [PATCH 352/404] Bael 3893 - Move module in pom

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 8f2cc8e902..81d414f540 100644
--- a/pom.xml
+++ b/pom.xml
@@ -370,6 +370,7 @@
                 <module>asm</module>
                 <module>atomix</module>
                 <module>aws</module>
+                <module>aws-app-sync</module>
                 <module>aws-lambda</module>
                 <module>axon</module>
                 <module>azure</module>
@@ -1015,7 +1016,6 @@
                 <module>asm</module>
                 <module>atomix</module>
                 <module>aws</module>
-                <module>aws-app-sync</module>
                 <module>aws-lambda</module>
                 <module>axon</module>
                 <module>azure</module>

From 642b12365ae3cbe6e3cccb03ddebd38935d89761 Mon Sep 17 00:00:00 2001
From: CHANDRAKANT Kumar <kumar.chandrakant@soprabanking.com>
Date: Mon, 18 May 2020 23:04:48 +0530
Subject: [PATCH 353/404] Removed blank lines from the parent pom.

---
 patterns/pom.xml | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/patterns/pom.xml b/patterns/pom.xml
index fa46a79f5a..be8d183be0 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -5,13 +5,11 @@
     <artifactId>patterns</artifactId>
     <name>patterns</name>
     <packaging>pom</packaging>
-
     <parent>
         <groupId>com.baeldung</groupId>
         <artifactId>parent-modules</artifactId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
-
     <modules>
         <module>design-patterns-architectural</module>
         <module>design-patterns-behavioral</module>
@@ -26,7 +24,6 @@
         <module>intercepting-filter</module>
         <module>solid</module>
     </modules>
-
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -37,7 +34,6 @@
             </dependency>
         </dependencies>
     </dependencyManagement>
-
     <build>
         <pluginManagement>
             <plugins>
@@ -54,9 +50,7 @@
             </plugins>
         </pluginManagement>
     </build>
-
     <properties>
         <jetty-maven-plugin.version>9.4.0.v20161208</jetty-maven-plugin.version>
     </properties>
-
-</project>
+</project>
\ No newline at end of file

From 4ab92fd3fc050fdca2e6a3dd47559fee979995df Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Mon, 18 May 2020 21:35:09 +0200
Subject: [PATCH 354/404] JAVA-1643: Align Spring Boot versions used in
 articles and in the repo

---
 .../spring-boot-with-starter-parent/pom.xml                   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
index baba410b39..331a85ec5b 100644
--- a/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
@@ -20,7 +20,7 @@
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-data-jpa</artifactId>
-                <version>${spring-boot.version}</version>
+                <version>${spring-boot-starter-data-jpa.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
@@ -38,7 +38,7 @@
 
     <properties>
         <java.version>1.8</java.version>
-        <spring-boot.version>2.1.5.RELEASE</spring-boot.version>
+        <spring-boot-starter-data-jpa.version>2.2.5.RELEASE</spring-boot-starter-data-jpa.version>
         <junit.version>4.11</junit.version>
     </properties>
 

From 51b4218f25c139a333c0ceb8a6f9ce6d534896cd Mon Sep 17 00:00:00 2001
From: Jonathan Cook <jonathan.cook@erars.plus.com>
Date: Mon, 18 May 2020 23:15:04 +0200
Subject: [PATCH 355/404] BAEL-3925 - How to call Python from Java (#9312)

* BAEL-3491 - Check for null before calling parse in the
Double.parseDouble

* BAEL-3491 - Check for null before calling parse in the
Double.parseDouble

- Return to indentation with spaces.

* BAEL-3854 - Pattern Matching for instanceof in Java 14

* BAEL-3854 - Pattern Matching for instanceof in Java 14 - add unit test

* BAEL-3868 - Fix the integrations tests in mocks

* BAEL-3925 - How to call Python from Java

* BAEL-3925-How to call Python from Java

* BAEL-3925-How to call Python from Java

Co-authored-by: Jonathan Cook <jcook@sciops.esa.int>
---
 java-python-interop/README.md                             | 5 -----
 language-interop/README.md                                | 5 +++++
 {java-python-interop => language-interop}/pom.xml         | 8 ++++----
 .../interop/python}/ScriptEngineManagerUtils.java         | 2 +-
 .../src/main/resources/logback.xml                        | 0
 .../interop/python}/JavaPythonInteropUnitTest.java        | 2 +-
 .../src/test/resources/hello.py                           | 0
 pom.xml                                                   | 4 ++--
 8 files changed, 13 insertions(+), 13 deletions(-)
 delete mode 100644 java-python-interop/README.md
 create mode 100644 language-interop/README.md
 rename {java-python-interop => language-interop}/pom.xml (91%)
 rename {java-python-interop/src/main/java/com/baeldung/python/interop => language-interop/src/main/java/com/baeldung/language/interop/python}/ScriptEngineManagerUtils.java (95%)
 rename {java-python-interop => language-interop}/src/main/resources/logback.xml (100%)
 rename {java-python-interop/src/test/java/com/baeldung/python/interop => language-interop/src/test/java/com/baeldung/language/interop/python}/JavaPythonInteropUnitTest.java (99%)
 rename {java-python-interop => language-interop}/src/test/resources/hello.py (100%)

diff --git a/java-python-interop/README.md b/java-python-interop/README.md
deleted file mode 100644
index dc9573ecde..0000000000
--- a/java-python-interop/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-## Java Python Interop
-
-This module contains articles about Java and Python interoperability.  
-
-### Relevant Articles:
diff --git a/language-interop/README.md b/language-interop/README.md
new file mode 100644
index 0000000000..a28c4a5405
--- /dev/null
+++ b/language-interop/README.md
@@ -0,0 +1,5 @@
+## Language Interop
+
+This module contains articles about Java interop with other language integrations.  
+
+### Relevant Articles:
diff --git a/java-python-interop/pom.xml b/language-interop/pom.xml
similarity index 91%
rename from java-python-interop/pom.xml
rename to language-interop/pom.xml
index 6ee5a0be3b..bdf872a076 100644
--- a/java-python-interop/pom.xml
+++ b/language-interop/pom.xml
@@ -3,9 +3,9 @@
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>java-python-interop</artifactId>
+    <artifactId>language-interop</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <name>java-python-interop</name>
+    <name>language-interop</name>
 
     <parent>
         <groupId>com.baeldung</groupId>
@@ -33,7 +33,7 @@
     </dependencies>
 
     <build>
-        <finalName>java-python-interop</finalName>
+        <finalName>language-interop</finalName>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
@@ -52,4 +52,4 @@
         <assertj.version>3.6.1</assertj.version>
     </properties>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java b/language-interop/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java
similarity index 95%
rename from java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java
rename to language-interop/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java
index 981f174c33..7bf07cf598 100644
--- a/java-python-interop/src/main/java/com/baeldung/python/interop/ScriptEngineManagerUtils.java
+++ b/language-interop/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java
@@ -1,4 +1,4 @@
-package com.baeldung.python.interop;
+package com.baeldung.language.interop.python;
 
 import java.util.List;
 
diff --git a/java-python-interop/src/main/resources/logback.xml b/language-interop/src/main/resources/logback.xml
similarity index 100%
rename from java-python-interop/src/main/resources/logback.xml
rename to language-interop/src/main/resources/logback.xml
diff --git a/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java b/language-interop/src/test/java/com/baeldung/language/interop/python/JavaPythonInteropUnitTest.java
similarity index 99%
rename from java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java
rename to language-interop/src/test/java/com/baeldung/language/interop/python/JavaPythonInteropUnitTest.java
index 5ec3a2b61f..50e7403470 100644
--- a/java-python-interop/src/test/java/com/baeldung/python/interop/JavaPythonInteropUnitTest.java
+++ b/language-interop/src/test/java/com/baeldung/language/interop/python/JavaPythonInteropUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.python.interop;
+package com.baeldung.language.interop.python;
 
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.empty;
diff --git a/java-python-interop/src/test/resources/hello.py b/language-interop/src/test/resources/hello.py
similarity index 100%
rename from java-python-interop/src/test/resources/hello.py
rename to language-interop/src/test/resources/hello.py
diff --git a/pom.xml b/pom.xml
index 1efce8457b..2efea40c91 100644
--- a/pom.xml
+++ b/pom.xml
@@ -463,7 +463,6 @@
                 <module>java-numbers</module>
                 <module>java-numbers-2</module>
 		<module>java-numbers-3</module>
-		<module>java-python-interop</module>
                 <module>java-rmi</module>
                 <module>java-spi</module>
                 <module>java-vavr-stream</module>
@@ -497,7 +496,8 @@
                 <module>kotlin-quasar</module>
 
                 <!-- <module>lagom</module> --> <!-- Not a maven project -->
-                <module>libraries-2</module>
+		<module>language-interop</module>
+		<module>libraries-2</module>
                 <module>libraries-3</module>
                 <module>libraries-apache-commons</module>
                 <module>libraries-apache-commons-collections</module>

From 93809a3441102cb0f5803a5dbd2eeed65b6dfa11 Mon Sep 17 00:00:00 2001
From: Krzysztof Majewski <krzysztof.majewski.km1@contractors.roche.com>
Date: Tue, 19 May 2020 08:17:45 +0200
Subject: [PATCH 356/404] update package name

---
 .../SeleniumJavaScriptClickTest.java                            | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/{junit => clickusingjavascript}/SeleniumJavaScriptClickTest.java (97%)

diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickTest.java
similarity index 97%
rename from testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickTest.java
index e738454ea7..6d2ab8ef1f 100644
--- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumJavaScriptClickTest.java
+++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickTest.java
@@ -1,4 +1,4 @@
-package java.com.baeldung.selenium.junit;
+package java.com.baeldung.selenium.clickusingjavascript;
 
 import org.junit.After;
 import org.junit.Before;

From 24fe7f5fe413e0e56e113852bfc8ffbc9e5e88dd Mon Sep 17 00:00:00 2001
From: CHANDRAKANT Kumar <kumar.chandrakant@soprabanking.com>
Date: Tue, 19 May 2020 16:56:21 +0530
Subject: [PATCH 357/404] Incorporated review comments from the editor.

---
 .../com/baeldung/patterns/cqrs/aggregates/UserAggregate.java    | 2 +-
 .../com/baeldung/patterns/cqrs/commands/CreateUserCommand.java  | 2 +-
 .../com/baeldung/patterns/escqrs/aggregates/UserAggregate.java  | 2 +-
 patterns/pom.xml                                                | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
index b5e16cff0e..96476dc15a 100644
--- a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
+++ b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java
@@ -14,7 +14,7 @@ public class UserAggregate {
     }
 
     public User handleCreateUserCommand(CreateUserCommand command) {
-        User user = new User(command.getUserId(), command.getFiratName(), command.getLastName());
+        User user = new User(command.getUserId(), command.getFirstName(), command.getLastName());
         writeRepository.addUser(user.getUserid(), user);
         return user;
     }
diff --git a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
index 4ab939dbab..362804c610 100644
--- a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
+++ b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java
@@ -8,7 +8,7 @@ import lombok.Data;
 public class CreateUserCommand {
 
     private String userId;
-    private String firatName;
+    private String firstName;
     private String lastName;
 
 }
diff --git a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
index 7d32aeb2a2..04bfeb634d 100644
--- a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
+++ b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java
@@ -28,7 +28,7 @@ public class UserAggregate {
     }
 
     public List<Event> handleCreateUserCommand(CreateUserCommand command) {
-        UserCreatedEvent event = new UserCreatedEvent(command.getUserId(), command.getFiratName(), command.getLastName());
+        UserCreatedEvent event = new UserCreatedEvent(command.getUserId(), command.getFirstName(), command.getLastName());
         writeRepository.addEvent(command.getUserId(), event);
         return Arrays.asList(event);
     }
diff --git a/patterns/pom.xml b/patterns/pom.xml
index be8d183be0..e1753aba56 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -19,7 +19,7 @@
         <module>design-patterns-functional</module>
         <module>design-patterns-structural</module>
         <module>dip</module>
-		<module>cqrs-es</module>
+        <module>cqrs-es</module>
         <module>front-controller</module>
         <module>intercepting-filter</module>
         <module>solid</module>

From 73762873f6def0fc720e3e8abf59a30d9e196cd7 Mon Sep 17 00:00:00 2001
From: Somnath Musib <7885767+musibs@users.noreply.github.com>
Date: Wed, 20 May 2020 02:48:58 +1000
Subject: [PATCH 358/404] BAEL-4033 LinkedBlockingQueue vs
 ConcurrentLinkedQueue (#9281)

* BAEL-4033 Added unit test cases for LinkedBlockingQueue and ConcurrentLinkedQueue

* BAEL-4033 Updated unit test class names due to PMD rule violations

* Moved files to another module based on the editor review
---
 .../pom.xml                                   |  9 ++-
 .../queue/TestConcurrentLinkedQueue.java      | 66 +++++++++++++++
 .../queue/TestLinkedBlockingQueue.java        | 81 +++++++++++++++++++
 3 files changed, 155 insertions(+), 1 deletion(-)
 create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java
 create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java

diff --git a/core-java-modules/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml
index 65a91c9a9c..7fdd348dc5 100644
--- a/core-java-modules/core-java-concurrency-collections-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections-2/pom.xml
@@ -23,7 +23,12 @@
             <artifactId>jmh-generator-annprocess</artifactId>
             <version>${jmh.version}</version>
         </dependency>
-
+		<dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <build>
         <sourceDirectory>src</sourceDirectory>
@@ -42,6 +47,8 @@
     <properties>
         <jmh.version>1.21</jmh.version>
         <guava.version>28.2-jre</guava.version>
+         <!-- testing -->
+        <assertj.version>3.6.1</assertj.version>
     </properties>
 
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java
new file mode 100644
index 0000000000..c61becc366
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java
@@ -0,0 +1,66 @@
+package com.baeldung.concurrent.queue;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+@FixMethodOrder
+public class TestConcurrentLinkedQueue {
+
+    @Test
+    public void givenThereIsExistingCollection_WhenAddedIntoQueue_ThenShouldContainElements() {
+        Collection<Integer> elements = Arrays.asList(1, 2, 3, 4, 5);
+        ConcurrentLinkedQueue<Integer> concurrentLinkedQueue = new ConcurrentLinkedQueue<>(elements);
+        assertThat(concurrentLinkedQueue).containsExactly(1, 2, 3, 4, 5);
+    }
+
+    @Test
+    public void givenQueueIsEmpty_WhenAccessingTheQueue_ThenQueueReturnsNull() throws InterruptedException {
+        ExecutorService executorService = Executors.newFixedThreadPool(1);
+        ConcurrentLinkedQueue<Integer> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
+        executorService.submit(() -> assertNull("Retrieve object is null", concurrentLinkedQueue.poll()));
+        TimeUnit.SECONDS.sleep(1);
+        executorService.awaitTermination(1, TimeUnit.SECONDS);
+        executorService.shutdown();
+    }
+
+    @Test
+    public void givenProducerOffersElementInQueue_WhenConsumerPollsQueue_ThenItRetrievesElement() throws Exception {
+        int element = 1;
+
+        ExecutorService executorService = Executors.newFixedThreadPool(2);
+        ConcurrentLinkedQueue<Integer> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
+        Runnable offerTask = () -> concurrentLinkedQueue.offer(element);
+
+        Callable<Integer> pollTask = () -> {
+            while (concurrentLinkedQueue.peek() != null) {
+                return concurrentLinkedQueue.poll()
+                    .intValue();
+            }
+            return null;
+        };
+
+        executorService.submit(offerTask);
+        TimeUnit.SECONDS.sleep(1);
+
+        Future<Integer> returnedElement = executorService.submit(pollTask);
+        assertThat(returnedElement.get()
+            .intValue(), is(equalTo(element)));
+        executorService.awaitTermination(1, TimeUnit.SECONDS);
+        executorService.shutdown();
+    }
+}
diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java
new file mode 100644
index 0000000000..7a78bc7b3b
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java
@@ -0,0 +1,81 @@
+package com.baeldung.concurrent.queue;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+@FixMethodOrder
+public class TestLinkedBlockingQueue {
+
+    @Test
+    public void givenThereIsExistingCollection_WhenAddedIntoQueue_ThenShouldContainElements() {
+        Collection<Integer> elements = Arrays.asList(1, 2, 3, 4, 5);
+        LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>(elements);
+        assertThat(linkedBlockingQueue).containsExactly(1, 2, 3, 4, 5);
+    }
+
+    @Test
+    public void givenQueueIsEmpty_WhenAccessingTheQueue_ThenThreadBlocks() throws InterruptedException {
+        ExecutorService executorService = Executors.newFixedThreadPool(1);
+        LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>();
+        executorService.submit(() -> {
+            try {
+                linkedBlockingQueue.take();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        });
+        TimeUnit.SECONDS.sleep(1);
+        executorService.awaitTermination(1, TimeUnit.SECONDS);
+        executorService.shutdown();
+    }
+
+    @Test
+    public void givenProducerPutsElementInQueue_WhenConsumerAccessQueue_ThenItRetrieve() {
+        int element = 10;
+        ExecutorService executorService = Executors.newFixedThreadPool(2);
+        LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>();
+        Runnable putTask = () -> {
+            try {
+                linkedBlockingQueue.put(element);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        };
+
+        Callable<Integer> takeTask = () -> {
+            try {
+                return linkedBlockingQueue.take();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            return null;
+        };
+
+        executorService.submit(putTask);
+        Future<Integer> returnElement = executorService.submit(takeTask);
+        try {
+            TimeUnit.SECONDS.sleep(1);
+            assertThat(returnElement.get()
+                .intValue(), is(equalTo(element)));
+            executorService.awaitTermination(1, TimeUnit.SECONDS);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        executorService.shutdown();
+    }
+}

From 7bc07fdac96a914f3edad82fd8881420db77e24c Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Tue, 19 May 2020 21:59:55 +0200
Subject: [PATCH 359/404] BAEL-4069: Add example of using @Value with
 constructor/setter (#9318)

---
 .../baeldung/value/CollectionProvider.java    | 27 +++++++++++++++++++
 .../com/baeldung/value/PriorityProvider.java  | 22 +++++++++++++++
 .../src/main/resources/values.properties      |  2 +-
 .../CollectionProviderIntegrationTest.java    | 22 +++++++++++++++
 .../PriorityProviderIntegrationTest.java      | 22 +++++++++++++++
 5 files changed, 94 insertions(+), 1 deletion(-)
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java
new file mode 100644
index 0000000000..fdc1f8ee03
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java
@@ -0,0 +1,27 @@
+package com.baeldung.value;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+@Component
+@PropertySource("classpath:values.properties")
+public class CollectionProvider {
+
+    private final List<String> values = new ArrayList<>();
+
+    public Collection<String> getValues() {
+        return Collections.unmodifiableCollection(values);
+    }
+
+    @Autowired
+    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
+        this.values.addAll(values);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java
new file mode 100644
index 0000000000..9d4b105afa
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java
@@ -0,0 +1,22 @@
+package com.baeldung.value;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+@Component
+@PropertySource("classpath:values.properties")
+public class PriorityProvider {
+
+    private final String priority;
+
+    @Autowired
+    public PriorityProvider(@Value("${priority:normal}") String priority) {
+        this.priority = priority;
+    }
+
+    public String getPriority() {
+        return priority;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties
index c6db5873fb..9c85893d5f 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties
@@ -1,4 +1,4 @@
 value.from.file=Value got from the file
-priority=Properties file
+priority=high
 listOfValues=A,B,C
 valuesMap={key1:'1', key2 : '2', key3 : '3'}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java
new file mode 100644
index 0000000000..33552f2e1a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.value;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = CollectionProvider.class)
+public class CollectionProviderIntegrationTest {
+
+    @Autowired
+    private CollectionProvider collectionProvider;
+
+    @Test
+    public void givenPropertyFileWhenSetterInjectionUsedThenValueInjected() {
+        assertThat(collectionProvider.getValues()).contains("A", "B", "C");
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
new file mode 100644
index 0000000000..19b5a36ff5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.value;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = PriorityProvider.class)
+public class PriorityProviderIntegrationTest {
+
+    @Autowired
+    private PriorityProvider priorityProvider;
+
+    @Test
+    public void givenPropertyFileWhenConstructorInjectionUsedThenValueInjected() {
+        assertThat(priorityProvider.getPriority()).isEqualTo("Properties file");
+    }
+}
\ No newline at end of file

From c119a51ff995182df4625c0d7fc6357cca959979 Mon Sep 17 00:00:00 2001
From: Roland Weisleder <rweisleder@users.noreply.github.com>
Date: Tue, 19 May 2020 22:24:05 +0200
Subject: [PATCH 360/404] BAEL-4010 Add test for InputStream.readAllBytes()
 (#9265)

* BAEL-4010 Add test for InputStream.readAllBytes()

* BAEL-4010 Refactor: Move "InputStream to Bytes" to Java 9 specific module

The issue BAEL-4010 introduces a new example to the article "Java
InputStream to Byte Array and ByteBuffer". The example is about
  byte[] InputStream.readAllBytes()
which was added with Java 9.

To be consistent, all examples for this article were moved to a module
which is compiled with at least Java 9.
---
 .../core-java-9-improvements/README.md        |  1 +
 .../core-java-9-improvements/pom.xml          |  5 ++
 .../InputStreamToByteArrayUnitTest.java       | 57 +++++++++++++++++++
 .../InputStreamToByteBufferUnitTest.java      |  2 +-
 .../core-java-io-conversions-2/README.md      |  1 -
 .../JavaInputStreamToXUnitTest.java           | 37 ------------
 6 files changed, 64 insertions(+), 39 deletions(-)
 create mode 100644 core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java
 rename core-java-modules/{core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes => core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion}/InputStreamToByteBufferUnitTest.java (97%)

diff --git a/core-java-modules/core-java-9-improvements/README.md b/core-java-modules/core-java-9-improvements/README.md
index c89d0e3c09..3b0bdcd651 100644
--- a/core-java-modules/core-java-9-improvements/README.md
+++ b/core-java-modules/core-java-9-improvements/README.md
@@ -9,3 +9,4 @@ This module contains articles about the improvements to core Java features intro
 - [Java 9 Stream API Improvements](https://www.baeldung.com/java-9-stream-api)
 - [Java 9 java.util.Objects Additions](https://www.baeldung.com/java-9-objects-new)
 - [Java 9 CompletableFuture API Improvements](https://www.baeldung.com/java-9-completablefuture)
+- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes)
diff --git a/core-java-modules/core-java-9-improvements/pom.xml b/core-java-modules/core-java-9-improvements/pom.xml
index d1c6bac9ec..5cc4fce7a9 100644
--- a/core-java-modules/core-java-9-improvements/pom.xml
+++ b/core-java-modules/core-java-9-improvements/pom.xml
@@ -33,6 +33,11 @@
             <artifactId>guava</artifactId>
             <version>${guava.version}</version>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.junit.platform</groupId>
             <artifactId>junit-platform-runner</artifactId>
diff --git a/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java
new file mode 100644
index 0000000000..b64709be09
--- /dev/null
+++ b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java
@@ -0,0 +1,57 @@
+package com.baeldung.java9.io.conversion;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Test;
+
+import com.google.common.io.ByteSource;
+import com.google.common.io.ByteStreams;
+
+public class InputStreamToByteArrayUnitTest {
+
+    @Test
+    public final void givenUsingPlainJavaOnFixedSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
+        final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
+        final byte[] targetArray = new byte[initialStream.available()];
+        initialStream.read(targetArray);
+    }
+
+    @Test
+    public final void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
+        final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
+
+        final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+        int nRead;
+        final byte[] data = new byte[1024];
+        while ((nRead = is.read(data, 0, data.length)) != -1) {
+            buffer.write(data, 0, nRead);
+        }
+
+        buffer.flush();
+        final byte[] byteArray = buffer.toByteArray();
+    }
+
+    @Test
+    public void givenUsingPlainJava9_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
+        final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
+
+        byte[] data = is.readAllBytes();
+    }
+
+    @Test
+    public final void givenUsingGuava_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
+        final InputStream initialStream = ByteSource.wrap(new byte[] { 0, 1, 2 })
+            .openStream();
+        final byte[] targetArray = ByteStreams.toByteArray(initialStream);
+    }
+
+    @Test
+    public final void givenUsingCommonsIO_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
+        final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
+        final byte[] targetArray = IOUtils.toByteArray(initialStream);
+    }
+}
diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteBufferUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java
rename to core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteBufferUnitTest.java
index c10aaae22a..f97352ac27 100644
--- a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java
+++ b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteBufferUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.inputstreamtobytes;
+package com.baeldung.java9.io.conversion;
 
 import com.google.common.io.ByteSource;
 import com.google.common.io.ByteStreams;
diff --git a/core-java-modules/core-java-io-conversions-2/README.md b/core-java-modules/core-java-io-conversions-2/README.md
index 4a28bf37c5..5cb9c21c54 100644
--- a/core-java-modules/core-java-io-conversions-2/README.md
+++ b/core-java-modules/core-java-io-conversions-2/README.md
@@ -4,6 +4,5 @@ This module contains articles about core Java input/output(IO) conversions.
 
 ### Relevant Articles:
 - [Java InputStream to String](https://www.baeldung.com/convert-input-stream-to-string)
-- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes)
 - [Java – Write an InputStream to a File](https://www.baeldung.com/convert-input-stream-to-a-file)
 - More articles: [[<-- prev]](/core-java-modules/core-java-io-conversions)
diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java
index c8c711e328..c34c32891f 100644
--- a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java
+++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java
@@ -2,7 +2,6 @@ package com.baeldung.inputstreamtostring;
 
 import com.google.common.base.Charsets;
 import com.google.common.io.ByteSource;
-import com.google.common.io.ByteStreams;
 import com.google.common.io.CharStreams;
 import com.google.common.io.Files;
 import org.apache.commons.io.FileUtils;
@@ -152,42 +151,6 @@ public class JavaInputStreamToXUnitTest {
         assertThat(result, equalTo(originalString));
     }
 
-    // tests - InputStream to byte[]
-
-    @Test
-    public final void givenUsingPlainJavaOnFixedSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
-        final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
-        final byte[] targetArray = new byte[initialStream.available()];
-        initialStream.read(targetArray);
-    }
-
-    @Test
-    public final void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
-        final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
-
-        final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-        int nRead;
-        final byte[] data = new byte[1024];
-        while ((nRead = is.read(data, 0, data.length)) != -1) {
-            buffer.write(data, 0, nRead);
-        }
-
-        buffer.flush();
-        final byte[] byteArray = buffer.toByteArray();
-    }
-
-    @Test
-    public final void givenUsingGuava_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
-        final InputStream initialStream = ByteSource.wrap(new byte[] { 0, 1, 2 }).openStream();
-        final byte[] targetArray = ByteStreams.toByteArray(initialStream);
-    }
-
-    @Test
-    public final void givenUsingCommonsIO_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
-        final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
-        final byte[] targetArray = IOUtils.toByteArray(initialStream);
-    }
-
     // tests - InputStream to File
 
     @Test

From eb739e3ab22ea1976e023981e1ea910f121ca7fa Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Tue, 19 May 2020 22:30:01 +0200
Subject: [PATCH 361/404] BAEL-3745: Update spring-boot-modules pom.xml (#9316)

---
 spring-boot-modules/pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 5acaa30328..6caa93158a 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -49,6 +49,7 @@
         <module>spring-boot-parent</module>
         <module>spring-boot-performance</module>
         <module>spring-boot-properties</module>
+        <module>spring-boot-properties-2</module>
         <module>spring-boot-property-exp</module>
         <module>spring-boot-runtime</module>
         <module>spring-boot-security</module>

From 07576ef07b840cdc91aa5639ca6bce3b4c312871 Mon Sep 17 00:00:00 2001
From: Josh Cummings <josh.cummings@gmail.com>
Date: Tue, 19 May 2020 19:24:45 -0600
Subject: [PATCH 362/404] Update README.md

Issue BAEL-3751
---
 spring-boot-modules/spring-boot-ci-cd/README.md | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-ci-cd/README.md b/spring-boot-modules/spring-boot-ci-cd/README.md
index d207cd0fa0..ee8f106b53 100644
--- a/spring-boot-modules/spring-boot-ci-cd/README.md
+++ b/spring-boot-modules/spring-boot-ci-cd/README.md
@@ -1 +1,7 @@
-# Spring Boot CI/CD
\ No newline at end of file
+# Spring Boot CI/CD
+
+This module contains articles about CI/CD with Spring Boot
+
+## Relevant Articles
+
+- [CI/CD for a Spring Boot Project](https://www.baeldung.com/spring-boot-ci-cd)

From f1be6fa3ae82baeb75918c47864c6f2d10bfd73d Mon Sep 17 00:00:00 2001
From: Grzegorz Piwowarek <gpiwowarek@gmail.com>
Date: Wed, 20 May 2020 07:54:02 +0200
Subject: [PATCH 363/404] Update ExchangerPipeLineManualTest.java (#9326)

---
 .../exchanger/ExchangerPipeLineManualTest.java   | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java
index 093580654b..af8b8b9aa1 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/exchanger/ExchangerPipeLineManualTest.java
@@ -40,15 +40,15 @@ public class ExchangerPipeLineManualTest {
 
         Runnable processor = () -> {
             Queue<String> processorBuffer = new ConcurrentLinkedQueue<>();
-            Queue<String> writterBuffer = new ConcurrentLinkedQueue<>();
+            Queue<String> writerBuffer = new ConcurrentLinkedQueue<>();
             try {
                 processorBuffer = readerExchanger.exchange(processorBuffer);
                 while (true) {
-                    writterBuffer.add(processorBuffer.poll());
+                    writerBuffer.add(processorBuffer.poll());
                     if (processorBuffer.isEmpty()) {
                         try {
                             processorBuffer = readerExchanger.exchange(processorBuffer);
-                            writterBuffer = writerExchanger.exchange(writterBuffer);
+                            writerBuffer = writerExchanger.exchange(writerBuffer);
                         } catch (InterruptedException e) {
                             Thread.currentThread().interrupt();
                             throw new RuntimeException(e);
@@ -62,13 +62,13 @@ public class ExchangerPipeLineManualTest {
         };
 
         Runnable writer = () -> {
-            Queue<String> writterBuffer = new ConcurrentLinkedQueue<>();
+            Queue<String> writerBuffer = new ConcurrentLinkedQueue<>();
             try {
-                writterBuffer = writerExchanger.exchange(writterBuffer);
+                writerBuffer = writerExchanger.exchange(writerBuffer);
                 while (true) {
-                    System.out.println(writterBuffer.poll());
-                    if (writterBuffer.isEmpty()) {
-                        writterBuffer = writerExchanger.exchange(writterBuffer);
+                    System.out.println(writerBuffer.poll());
+                    if (writerBuffer.isEmpty()) {
+                        writerBuffer = writerExchanger.exchange(writerBuffer);
                     }
                 }
             } catch (InterruptedException e) {

From 78683ecf0c323d6cf26be7e19aff0dcb1f859044 Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Wed, 20 May 2020 11:46:37 +0530
Subject: [PATCH 364/404] JAVA-940: Migrate spring-jenkins-pipeline to
 parent-boot-2

---
 spring-jenkins-pipeline/pom.xml                       |  4 ++--
 .../test/java/com/baeldung/SomeIntegrationTest.java   |  2 +-
 .../src/test/java/com/baeldung/TestMongoConfig.java   | 11 -----------
 3 files changed, 3 insertions(+), 14 deletions(-)
 delete mode 100644 spring-jenkins-pipeline/src/test/java/com/baeldung/TestMongoConfig.java

diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml
index aa6008162c..38d4ed15de 100644
--- a/spring-jenkins-pipeline/pom.xml
+++ b/spring-jenkins-pipeline/pom.xml
@@ -10,9 +10,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java
index 477a7d2adb..9033d10c5d 100644
--- a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java
+++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java
@@ -13,7 +13,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import static org.junit.Assert.assertNotEquals;
 
 @RunWith(SpringJUnit4ClassRunner.class)
-@SpringBootTest(classes = {SpringJenkinsPipelineApplication.class, TestMongoConfig.class })
+@SpringBootTest(classes = {SpringJenkinsPipelineApplication.class})
 public class SomeIntegrationTest {
     @Autowired
     private StudentRepository studentRepository;
diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/TestMongoConfig.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/TestMongoConfig.java
deleted file mode 100644
index a85491cf7e..0000000000
--- a/spring-jenkins-pipeline/src/test/java/com/baeldung/TestMongoConfig.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.baeldung;
-
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
-public class TestMongoConfig {
-    
-}
\ No newline at end of file

From 5ab3de4965aead4cc30ed2027638fd49a480383b Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 13:36:48 +0200
Subject: [PATCH 365/404] JAVA-1526: Copy spring-boot-json-properties to
 spring-boot-properties-2

---
 .../spring-boot-properties-2/pom.xml          |  4 ++
 .../json/ConfigPropertiesDemoApplication.java | 16 +++++
 .../properties/json/CustomJsonProperties.java | 71 +++++++++++++++++++
 .../properties/json/JsonProperties.java       | 65 +++++++++++++++++
 .../json/JsonPropertyContextInitializer.java  | 67 +++++++++++++++++
 .../factory/JsonPropertySourceFactory.java    | 20 ++++++
 .../src/main/resources/configprops.json       | 10 +++
 .../json/JsonPropertiesIntegrationTest.java   | 59 +++++++++++++++
 8 files changed, 312 insertions(+)
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/ConfigPropertiesDemoApplication.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/CustomJsonProperties.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonProperties.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonPropertyContextInitializer.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/factory/JsonPropertySourceFactory.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/resources/configprops.json
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/json/JsonPropertiesIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties-2/pom.xml b/spring-boot-modules/spring-boot-properties-2/pom.xml
index c3c3e57251..bd2a35b19d 100644
--- a/spring-boot-modules/spring-boot-properties-2/pom.xml
+++ b/spring-boot-modules/spring-boot-properties-2/pom.xml
@@ -20,6 +20,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/ConfigPropertiesDemoApplication.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/ConfigPropertiesDemoApplication.java
new file mode 100644
index 0000000000..a1e2584b2c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/ConfigPropertiesDemoApplication.java
@@ -0,0 +1,16 @@
+package com.baeldung.properties.json;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackageClasses = {JsonProperties.class, CustomJsonProperties.class})
+public class ConfigPropertiesDemoApplication {
+
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(ConfigPropertiesDemoApplication.class).initializers(new JsonPropertyContextInitializer())
+                .run();
+    }
+
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/CustomJsonProperties.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/CustomJsonProperties.java
new file mode 100644
index 0000000000..555711c49b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/CustomJsonProperties.java
@@ -0,0 +1,71 @@
+package com.baeldung.properties.json;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "custom")
+public class CustomJsonProperties {
+
+    private String host;
+
+    private int port;
+
+    private boolean resend;
+
+    private Person sender;
+
+    public static class Person {
+
+        private String name;
+        private String address;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getAddress() {
+            return address;
+        }
+
+        public void setAddress(String address) {
+            this.address = address;
+        }
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public boolean isResend() {
+        return resend;
+    }
+
+    public void setResend(boolean resend) {
+        this.resend = resend;
+    }
+
+    public Person getSender() {
+        return sender;
+    }
+
+    public void setSender(Person sender) {
+        this.sender = sender;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonProperties.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonProperties.java
new file mode 100644
index 0000000000..6ada770e3b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonProperties.java
@@ -0,0 +1,65 @@
+package com.baeldung.properties.json;
+
+import com.baeldung.properties.json.factory.JsonPropertySourceFactory;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+
+@Component
+@PropertySource(value = "classpath:configprops.json", factory = JsonPropertySourceFactory.class)
+@ConfigurationProperties
+public class JsonProperties {
+
+    private String host;
+
+    private int port;
+
+    private boolean resend;
+
+    private List<String> topics;
+
+    private LinkedHashMap<String, ?> sender;
+
+    public LinkedHashMap<String, ?> getSender() {
+        return sender;
+    }
+
+    public void setSender(LinkedHashMap<String, ?> sender) {
+        this.sender = sender;
+    }
+
+    public List<String> getTopics() {
+        return topics;
+    }
+
+    public void setTopics(List<String> topics) {
+        this.topics = topics;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public boolean isResend() {
+        return resend;
+    }
+
+    public void setResend(boolean resend) {
+        this.resend = resend;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonPropertyContextInitializer.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonPropertyContextInitializer.java
new file mode 100644
index 0000000000..e3b713f29b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/JsonPropertyContextInitializer.java
@@ -0,0 +1,67 @@
+package com.baeldung.properties.json;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.Resource;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class JsonPropertyContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
+
+    private final static String CUSTOM_PREFIX = "custom.";
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
+        try {
+            Resource resource = configurableApplicationContext.getResource("classpath:configprops.json");
+            Map readValue = new ObjectMapper().readValue(resource.getInputStream(), Map.class);
+            Set<Map.Entry> set = readValue.entrySet();
+            List<MapPropertySource> propertySources = convertEntrySet(set, Optional.empty());
+            for (PropertySource propertySource : propertySources) {
+                configurableApplicationContext.getEnvironment()
+                    .getPropertySources()
+                    .addFirst(propertySource);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static List<MapPropertySource> convertEntrySet(Set<Map.Entry> entrySet, Optional<String> parentKey) {
+        return entrySet.stream()
+            .map((Map.Entry e) -> convertToPropertySourceList(e, parentKey))
+            .flatMap(Collection::stream)
+            .collect(Collectors.toList());
+    }
+
+    private static List<MapPropertySource> convertToPropertySourceList(Map.Entry e, Optional<String> parentKey) {
+        String key = parentKey.map(s -> s + ".")
+            .orElse("") + (String) e.getKey();
+        Object value = e.getValue();
+        return covertToPropertySourceList(key, value);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static List<MapPropertySource> covertToPropertySourceList(String key, Object value) {
+        if (value instanceof LinkedHashMap) {
+            LinkedHashMap map = (LinkedHashMap) value;
+            Set<Map.Entry> entrySet = map.entrySet();
+            return convertEntrySet(entrySet, Optional.ofNullable(key));
+        }
+        String finalKey = CUSTOM_PREFIX + key;
+        return Collections.singletonList(new MapPropertySource(finalKey, Collections.singletonMap(finalKey, value)));
+    }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/factory/JsonPropertySourceFactory.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/factory/JsonPropertySourceFactory.java
new file mode 100644
index 0000000000..dccaae4ad2
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/json/factory/JsonPropertySourceFactory.java
@@ -0,0 +1,20 @@
+package com.baeldung.properties.json.factory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.support.EncodedResource;
+import org.springframework.core.io.support.PropertySourceFactory;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class JsonPropertySourceFactory implements PropertySourceFactory {
+
+    @Override
+    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
+        Map readValue = new ObjectMapper().readValue(resource.getInputStream(), Map.class);
+        return new MapPropertySource("json-property", readValue);
+    }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/resources/configprops.json b/spring-boot-modules/spring-boot-properties-2/src/main/resources/configprops.json
new file mode 100644
index 0000000000..1602663775
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/resources/configprops.json
@@ -0,0 +1,10 @@
+{
+  "host" : "mailer@mail.com",
+  "port" : 9090,
+  "resend" : true,
+  "topics" : ["spring", "boot"],
+  "sender" : {
+    "name": "sender",
+    "address": "street"
+  }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/json/JsonPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/json/JsonPropertiesIntegrationTest.java
new file mode 100644
index 0000000000..6b00489b5c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/json/JsonPropertiesIntegrationTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.properties.json;
+
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = ConfigPropertiesDemoApplication.class, initializers = JsonPropertyContextInitializer.class)
+public class JsonPropertiesIntegrationTest {
+
+    @Autowired
+    private JsonProperties jsonProperties;
+
+    @Autowired
+    private CustomJsonProperties customJsonProperties;
+
+    @Test
+    public void whenPropertiesLoadedViaJsonPropertySource_thenLoadFlatValues() {
+        Assert.assertEquals("mailer@mail.com", jsonProperties.getHost());
+        Assert.assertEquals(9090, jsonProperties.getPort());
+        Assert.assertTrue(jsonProperties.isResend());
+    }
+
+    @Test
+    public void whenPropertiesLoadedViaJsonPropertySource_thenLoadListValues() {
+        Assert.assertThat(jsonProperties.getTopics(), Matchers.is(Arrays.asList("spring", "boot")));
+    }
+
+    @Test
+    public void whenPropertiesLoadedViaJsonPropertySource_thenNestedLoadedAsMap() {
+        Assert.assertEquals("sender", jsonProperties.getSender()
+            .get("name"));
+        Assert.assertEquals("street", jsonProperties.getSender()
+            .get("address"));
+    }
+
+    @Test
+    public void whenLoadedIntoEnvironment_thenFlatValuesPopulated() {
+        Assert.assertEquals("mailer@mail.com", customJsonProperties.getHost());
+        Assert.assertEquals(9090, customJsonProperties.getPort());
+        Assert.assertTrue(customJsonProperties.isResend());
+    }
+
+    @Test
+    public void whenLoadedIntoEnvironment_thenValuesLoadedIntoClassObject() {
+        Assert.assertNotNull(customJsonProperties.getSender());
+        Assert.assertEquals("sender", customJsonProperties.getSender()
+            .getName());
+        Assert.assertEquals("street", customJsonProperties.getSender()
+            .getAddress());
+    }
+
+}

From 8afe64de3e82fda4a9333611ae2c3b6c8366e490 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 14:37:43 +0200
Subject: [PATCH 366/404] JAVA-1526: Remove spring-boot-json-properties from
 spring-boot-properties

---
 .../spring-boot-properties-2/README.md        |  1 +
 .../spring-boot-properties/README.md          |  1 -
 .../ConfigPropertiesDemoApplication.java      |  7 +-
 .../properties/CustomJsonProperties.java      | 71 -------------------
 .../baeldung/properties/JsonProperties.java   | 64 -----------------
 .../JsonPropertyContextInitializer.java       | 68 ------------------
 .../properties/JsonPropertySourceFactory.java | 21 ------
 .../src/main/resources/configprops.json       | 10 ---
 .../JsonPropertiesIntegrationTest.java        | 59 ---------------
 .../PriorityProviderIntegrationTest.java      |  2 +-
 10 files changed, 6 insertions(+), 298 deletions(-)
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/CustomJsonProperties.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonProperties.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertyContextInitializer.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertySourceFactory.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/configprops.json
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/JsonPropertiesIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties-2/README.md b/spring-boot-modules/spring-boot-properties-2/README.md
index 01e2970e89..326e652af3 100644
--- a/spring-boot-modules/spring-boot-properties-2/README.md
+++ b/spring-boot-modules/spring-boot-properties-2/README.md
@@ -3,3 +3,4 @@
 This module contains articles about Properties in Spring Boot.
 
 ### Relevant Articles:
+- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/README.md b/spring-boot-modules/spring-boot-properties/README.md
index f861a01d10..addfe01438 100644
--- a/spring-boot-modules/spring-boot-properties/README.md
+++ b/spring-boot-modules/spring-boot-properties/README.md
@@ -5,7 +5,6 @@ This module contains articles about Properties in Spring Boot.
 ### Relevant Articles:
 - [Reloading Properties Files in Spring](https://www.baeldung.com/spring-reloading-properties)
 - [Guide to @ConfigurationProperties in Spring Boot](https://www.baeldung.com/configuration-properties-in-spring-boot)
-- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
 - [Guide to @EnableConfigurationProperties](https://www.baeldung.com/spring-enable-config-properties)
 - [Properties with Spring and Spring Boot](https://www.baeldung.com/properties-with-spring) - checkout the `com.baeldung.properties` package for all scenarios of properties injection and usage
 - [A Quick Guide to Spring @Value](https://www.baeldung.com/spring-value-annotation)
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
index e280bbd79f..88e6f47e51 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
@@ -1,5 +1,7 @@
 package com.baeldung.properties;
 
+import com.baeldung.buildproperties.Application;
+import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.context.annotation.ComponentScan;
@@ -7,11 +9,10 @@ import org.springframework.context.annotation.ComponentScan;
 import com.baeldung.configurationproperties.ConfigProperties;
 
 @SpringBootApplication
-@ComponentScan(basePackageClasses = { ConfigProperties.class, JsonProperties.class, CustomJsonProperties.class})
+@ComponentScan(basePackageClasses = ConfigProperties.class)
 public class ConfigPropertiesDemoApplication {
     public static void main(String[] args) {
-        new SpringApplicationBuilder(ConfigPropertiesDemoApplication.class).initializers(new JsonPropertyContextInitializer())
-            .run();
+        SpringApplication.run(ConfigPropertiesDemoApplication.class, args);
     }
 
 }
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/CustomJsonProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/CustomJsonProperties.java
deleted file mode 100644
index 084138ec6f..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/CustomJsonProperties.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.baeldung.properties;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-@Component
-@ConfigurationProperties(prefix = "custom")
-public class CustomJsonProperties {
-
-    private String host;
-
-    private int port;
-
-    private boolean resend;
-
-    private Person sender;
-
-    public static class Person {
-
-        private String name;
-        private String address;
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public String getAddress() {
-            return address;
-        }
-
-        public void setAddress(String address) {
-            this.address = address;
-        }
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public boolean isResend() {
-        return resend;
-    }
-
-    public void setResend(boolean resend) {
-        this.resend = resend;
-    }
-
-    public Person getSender() {
-        return sender;
-    }
-
-    public void setSender(Person sender) {
-        this.sender = sender;
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonProperties.java
deleted file mode 100644
index 31b3be14b4..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonProperties.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.baeldung.properties;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.stereotype.Component;
-
-@Component
-@PropertySource(value = "classpath:configprops.json", factory = JsonPropertySourceFactory.class)
-@ConfigurationProperties
-public class JsonProperties {
-
-    private String host;
-
-    private int port;
-
-    private boolean resend;
-
-    private List<String> topics;
-
-    private LinkedHashMap<String, ?> sender;
-
-    public LinkedHashMap<String, ?> getSender() {
-        return sender;
-    }
-
-    public void setSender(LinkedHashMap<String, ?> sender) {
-        this.sender = sender;
-    }
-
-    public List<String> getTopics() {
-        return topics;
-    }
-
-    public void setTopics(List<String> topics) {
-        this.topics = topics;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public boolean isResend() {
-        return resend;
-    }
-
-    public void setResend(boolean resend) {
-        this.resend = resend;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertyContextInitializer.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertyContextInitializer.java
deleted file mode 100644
index 0aee149123..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertyContextInitializer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.baeldung.properties;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.springframework.context.ApplicationContextInitializer;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.core.env.MapPropertySource;
-import org.springframework.core.env.PropertySource;
-import org.springframework.core.io.Resource;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class JsonPropertyContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
-
-    private final static String CUSTOM_PREFIX = "custom.";
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
-        try {
-            Resource resource = configurableApplicationContext.getResource("classpath:configprops.json");
-            Map readValue = new ObjectMapper().readValue(resource.getInputStream(), Map.class);
-            Set<Map.Entry> set = readValue.entrySet();
-            List<MapPropertySource> propertySources = convertEntrySet(set, Optional.empty());
-            for (PropertySource propertySource : propertySources) {
-                configurableApplicationContext.getEnvironment()
-                    .getPropertySources()
-                    .addFirst(propertySource);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static List<MapPropertySource> convertEntrySet(Set<Map.Entry> entrySet, Optional<String> parentKey) {
-        return entrySet.stream()
-            .map((Map.Entry e) -> convertToPropertySourceList(e, parentKey))
-            .flatMap(Collection::stream)
-            .collect(Collectors.toList());
-    }
-
-    private static List<MapPropertySource> convertToPropertySourceList(Map.Entry e, Optional<String> parentKey) {
-        String key = parentKey.map(s -> s + ".")
-            .orElse("") + (String) e.getKey();
-        Object value = e.getValue();
-        return covertToPropertySourceList(key, value);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static List<MapPropertySource> covertToPropertySourceList(String key, Object value) {
-        if (value instanceof LinkedHashMap) {
-            LinkedHashMap map = (LinkedHashMap) value;
-            Set<Map.Entry> entrySet = map.entrySet();
-            return convertEntrySet(entrySet, Optional.ofNullable(key));
-        }
-        String finalKey = CUSTOM_PREFIX + key;
-        return Collections.singletonList(new MapPropertySource(finalKey, Collections.singletonMap(finalKey, value)));
-    }
-
-}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertySourceFactory.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertySourceFactory.java
deleted file mode 100644
index c14d3faea5..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/JsonPropertySourceFactory.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.properties;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.springframework.core.env.MapPropertySource;
-import org.springframework.core.env.PropertySource;
-import org.springframework.core.io.support.EncodedResource;
-import org.springframework.core.io.support.PropertySourceFactory;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class JsonPropertySourceFactory implements PropertySourceFactory {
-
-    @Override
-    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
-        Map readValue = new ObjectMapper().readValue(resource.getInputStream(), Map.class);
-        return new MapPropertySource("json-property", readValue);
-    }
-
-}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configprops.json b/spring-boot-modules/spring-boot-properties/src/main/resources/configprops.json
deleted file mode 100644
index 1602663775..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/configprops.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "host" : "mailer@mail.com",
-  "port" : 9090,
-  "resend" : true,
-  "topics" : ["spring", "boot"],
-  "sender" : {
-    "name": "sender",
-    "address": "street"
-  }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/JsonPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/JsonPropertiesIntegrationTest.java
deleted file mode 100644
index 2f0e5ae408..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/JsonPropertiesIntegrationTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.baeldung.properties;
-
-import java.util.Arrays;
-
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@ContextConfiguration(classes = ConfigPropertiesDemoApplication.class, initializers = JsonPropertyContextInitializer.class)
-public class JsonPropertiesIntegrationTest {
-
-    @Autowired
-    private JsonProperties jsonProperties;
-
-    @Autowired
-    private CustomJsonProperties customJsonProperties;
-
-    @Test
-    public void whenPropertiesLoadedViaJsonPropertySource_thenLoadFlatValues() {
-        Assert.assertEquals("mailer@mail.com", jsonProperties.getHost());
-        Assert.assertEquals(9090, jsonProperties.getPort());
-        Assert.assertTrue(jsonProperties.isResend());
-    }
-
-    @Test
-    public void whenPropertiesLoadedViaJsonPropertySource_thenLoadListValues() {
-        Assert.assertThat(jsonProperties.getTopics(), Matchers.is(Arrays.asList("spring", "boot")));
-    }
-
-    @Test
-    public void whenPropertiesLoadedViaJsonPropertySource_thenNestedLoadedAsMap() {
-        Assert.assertEquals("sender", jsonProperties.getSender()
-            .get("name"));
-        Assert.assertEquals("street", jsonProperties.getSender()
-            .get("address"));
-    }
-
-    @Test
-    public void whenLoadedIntoEnvironment_thenFlatValuesPopulated() {
-        Assert.assertEquals("mailer@mail.com", customJsonProperties.getHost());
-        Assert.assertEquals(9090, customJsonProperties.getPort());
-        Assert.assertTrue(customJsonProperties.isResend());
-    }
-
-    @Test
-    public void whenLoadedIntoEnvironment_thenValuesLoadedIntoClassObject() {
-        Assert.assertNotNull(customJsonProperties.getSender());
-        Assert.assertEquals("sender", customJsonProperties.getSender()
-            .getName());
-        Assert.assertEquals("street", customJsonProperties.getSender()
-            .getAddress());
-    }
-
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
index 19b5a36ff5..aa365a4b6a 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
@@ -17,6 +17,6 @@ public class PriorityProviderIntegrationTest {
 
     @Test
     public void givenPropertyFileWhenConstructorInjectionUsedThenValueInjected() {
-        assertThat(priorityProvider.getPriority()).isEqualTo("Properties file");
+        assertThat(priorityProvider.getPriority()).isEqualTo("high");
     }
 }
\ No newline at end of file

From c4101d7df754baa839dc6433804198197ad7e4cc Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 14:50:33 +0200
Subject: [PATCH 367/404] JAVA-1526: Fix test configuration

---
 .../baeldung/properties/ConfigPropertiesDemoApplication.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
index 88e6f47e51..1e5e88921a 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java
@@ -9,7 +9,7 @@ import org.springframework.context.annotation.ComponentScan;
 import com.baeldung.configurationproperties.ConfigProperties;
 
 @SpringBootApplication
-@ComponentScan(basePackageClasses = ConfigProperties.class)
+@ComponentScan(basePackageClasses = {ConfigProperties.class, AdditionalProperties.class})
 public class ConfigPropertiesDemoApplication {
     public static void main(String[] args) {
         SpringApplication.run(ConfigPropertiesDemoApplication.class, args);

From 304a6fb6ccfb37a63b18b0f2534acb90cbd5b7d9 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 15:51:11 +0200
Subject: [PATCH 368/404] JAVA-1526: Copy three @Value related articles to
 spring-boot-properties-2

---
 .../spring-boot-properties-2/README.md        |   5 +-
 .../value/ClassNotManagedBySpring.java        |  28 +++++
 .../properties/value/CollectionProvider.java  |  27 +++++
 .../properties/value/InitializerBean.java     |  21 ++++
 .../properties/value/PriorityProvider.java    |  22 ++++
 .../baeldung/properties/value/SomeBean.java   |  17 +++
 .../baeldung/properties/value/ValuesApp.java  | 101 ++++++++++++++++++
 .../value/defaults/ValuesWithDefaultsApp.java |  71 ++++++++++++
 .../src/main/resources/values.properties      |   4 +
 .../resources/valueswithdefaults.properties   |   0
 ...lassNotManagedBySpringIntegrationTest.java |  40 +++++++
 .../CollectionProviderIntegrationTest.java    |  22 ++++
 .../PriorityProviderIntegrationTest.java      |  22 ++++
 .../spring-boot-properties/README.md          |   3 -
 14 files changed, 379 insertions(+), 4 deletions(-)
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ClassNotManagedBySpring.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/CollectionProvider.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/InitializerBean.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityProvider.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/SomeBean.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/resources/values.properties
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/resources/valueswithdefaults.properties
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/ClassNotManagedBySpringIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/CollectionProviderIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties-2/README.md b/spring-boot-modules/spring-boot-properties-2/README.md
index 326e652af3..7373932e4f 100644
--- a/spring-boot-modules/spring-boot-properties-2/README.md
+++ b/spring-boot-modules/spring-boot-properties-2/README.md
@@ -3,4 +3,7 @@
 This module contains articles about Properties in Spring Boot.
 
 ### Relevant Articles:
-- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
\ No newline at end of file
+- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
+- [A Quick Guide to Spring @Value](https://www.baeldung.com/spring-value-annotation)
+- [Using Spring @Value with Defaults](https://www.baeldung.com/spring-value-defaults)
+- [How to Inject a Property Value Into a Class Not Managed by Spring?](https://www.baeldung.com/inject-properties-value-non-spring-class)
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ClassNotManagedBySpring.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ClassNotManagedBySpring.java
new file mode 100644
index 0000000000..59ee73a07b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ClassNotManagedBySpring.java
@@ -0,0 +1,28 @@
+package com.baeldung.properties.value;
+
+public class ClassNotManagedBySpring {
+
+    private String customVariable;
+    private String anotherCustomVariable;
+
+    public ClassNotManagedBySpring(String someInitialValue, String anotherManagedValue) {
+        this.customVariable = someInitialValue;
+        this.anotherCustomVariable = anotherManagedValue;
+    }
+
+    public String getCustomVariable() {
+        return customVariable;
+    }
+
+    public void setCustomVariable(String customVariable) {
+        this.customVariable = customVariable;
+    }
+
+    public String getAnotherCustomVariable() {
+        return anotherCustomVariable;
+    }
+
+    public void setAnotherCustomVariable(String anotherCustomVariable) {
+        this.anotherCustomVariable = anotherCustomVariable;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/CollectionProvider.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/CollectionProvider.java
new file mode 100644
index 0000000000..6327e688e8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/CollectionProvider.java
@@ -0,0 +1,27 @@
+package com.baeldung.properties.value;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+@Component
+@PropertySource("classpath:values.properties")
+public class CollectionProvider {
+
+    private final List<String> values = new ArrayList<>();
+
+    public Collection<String> getValues() {
+        return Collections.unmodifiableCollection(values);
+    }
+
+    @Autowired
+    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
+        this.values.addAll(values);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/InitializerBean.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/InitializerBean.java
new file mode 100644
index 0000000000..b06cfa12ea
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/InitializerBean.java
@@ -0,0 +1,21 @@
+package com.baeldung.properties.value;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class InitializerBean {
+
+    private String someInitialValue;
+    private String anotherManagedValue;
+
+    public InitializerBean(@Value("someInitialValue") String someInitialValue, @Value("anotherValue") String anotherManagedValue) {
+        this.someInitialValue = someInitialValue;
+        this.anotherManagedValue = anotherManagedValue;
+    }
+
+    public ClassNotManagedBySpring initClass() {
+        return new ClassNotManagedBySpring(this.someInitialValue, this.anotherManagedValue);
+    }
+
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityProvider.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityProvider.java
new file mode 100644
index 0000000000..892118eb06
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityProvider.java
@@ -0,0 +1,22 @@
+package com.baeldung.properties.value;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+@Component
+@PropertySource("classpath:values.properties")
+public class PriorityProvider {
+
+    private final String priority;
+
+    @Autowired
+    public PriorityProvider(@Value("${priority:normal}") String priority) {
+        this.priority = priority;
+    }
+
+    public String getPriority() {
+        return priority;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/SomeBean.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/SomeBean.java
new file mode 100644
index 0000000000..b3346a96dd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/SomeBean.java
@@ -0,0 +1,17 @@
+package com.baeldung.properties.value;
+
+public class SomeBean {
+    private int someValue;
+
+    public SomeBean(int someValue) {
+        this.someValue = someValue;
+    }
+
+    public int getSomeValue() {
+        return someValue;
+    }
+
+    public void setSomeValue(int someValue) {
+        this.someValue = someValue;
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java
new file mode 100644
index 0000000000..67547199a6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java
@@ -0,0 +1,101 @@
+package com.baeldung.properties.value;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import javax.annotation.PostConstruct;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Configuration
+@PropertySource(name = "myProperties", value = "values.properties")
+public class ValuesApp {
+
+    @Value("string value")
+    private String stringValue;
+
+    @Value("${value.from.file}")
+    private String valueFromFile;
+
+    @Value("${systemValue}")
+    private String systemValue;
+
+    @Value("${unknown_param:some default}")
+    private String someDefault;
+
+    @Value("${priority}")
+    private String prioritySystemProperty;
+
+    @Value("${listOfValues}")
+    private String[] valuesArray;
+
+    @Value("#{systemProperties['priority']}")
+    private String spelValue;
+
+    @Value("#{systemProperties['unknown'] ?: 'some default'}")
+    private String spelSomeDefault;
+
+    @Value("#{someBean.someValue}")
+    private Integer someBeanValue;
+
+    @Value("#{'${listOfValues}'.split(',')}")
+    private List<String> valuesList;
+	
+    @Value("#{${valuesMap}}")
+    private Map<String, Integer> valuesMap;
+
+    @Value("#{${valuesMap}.key1}")
+    private Integer valuesMapKey1;
+
+    @Value("#{${valuesMap}['unknownKey']}")
+    private Integer unknownMapKey;
+
+    @Value("#{${unknownMap : {key1:'1', key2 : '2'}}}")
+    private Map<String, Integer> unknownMap;
+
+    @Value("#{${valuesMap}['unknownKey'] ?: 5}")
+    private Integer unknownMapKeyWithDefaultValue;
+
+    @Value("#{${valuesMap}.?[value>'1']}")
+    private Map<String, Integer> valuesMapFiltered;
+
+    @Value("#{systemProperties}")
+    private Map<String, String> systemPropertiesMap;
+
+    public static void main(String[] args) {
+        System.setProperty("systemValue", "Some system parameter value");
+        System.setProperty("priority", "System property");
+        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValuesApp.class);
+    }
+
+    @Bean
+    public SomeBean someBean() {
+        return new SomeBean(10);
+    }
+
+    @PostConstruct
+    public void afterInitialize() {
+        System.out.println(stringValue);
+        System.out.println(valueFromFile);
+        System.out.println(systemValue);
+        System.out.println(someDefault);
+        System.out.println(prioritySystemProperty);
+        System.out.println(Arrays.toString(valuesArray));
+        System.out.println(spelValue);
+        System.out.println(spelSomeDefault);
+        System.out.println(someBeanValue);
+        System.out.println(valuesList);
+        System.out.println(valuesMap);
+        System.out.println(valuesMapKey1);
+        System.out.println(unknownMapKey);
+        System.out.println(unknownMap);
+        System.out.println(unknownMapKeyWithDefaultValue);
+        System.out.println(valuesMapFiltered);
+        System.out.println(systemPropertiesMap);
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java
new file mode 100644
index 0000000000..72fa0e03c0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java
@@ -0,0 +1,71 @@
+package com.baeldung.properties.value.defaults;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.util.Assert;
+
+import javax.annotation.PostConstruct;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Demonstrates setting defaults for @Value annotation.  Note that there are no properties 
+ * defined in the specified property source.  We also assume that the user here
+ * does not have a system property named some.key.
+ *
+ */
+@Configuration
+@PropertySource(name = "myProperties", value = "valueswithdefaults.properties")
+public class ValuesWithDefaultsApp {
+
+    @Value("${some.key:my default value}")
+    private String stringWithDefaultValue;
+
+    @Value("${some.key:}")
+    private String stringWithBlankDefaultValue;
+
+    @Value("${some.key:true}")
+    private boolean booleanWithDefaultValue;
+    
+    @Value("${some.key:42}")
+    private int intWithDefaultValue;  
+
+    @Value("${some.key:one,two,three}")
+    private String[] stringArrayWithDefaults;
+
+    @Value("${some.key:1,2,3}")
+    private int[] intArrayWithDefaults;
+
+    @Value("#{systemProperties['some.key'] ?: 'my default system property value'}")
+    private String spelWithDefaultValue;
+    
+
+    public static void main(String[] args) {
+        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValuesWithDefaultsApp.class);
+    }
+
+    @PostConstruct
+    public void afterInitialize() {
+    	// strings
+    	Assert.isTrue(stringWithDefaultValue.equals("my default value"));
+    	Assert.isTrue(stringWithBlankDefaultValue.equals(""));
+    	
+    	// other primitives
+    	Assert.isTrue(booleanWithDefaultValue);
+    	Assert.isTrue(intWithDefaultValue == 42);
+    	
+    	// arrays
+        List<String> stringListValues = Arrays.asList("one", "two", "three");
+    	Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues));
+
+        List<Integer> intListValues = Arrays.asList(1, 2, 3);
+    	Assert.isTrue(Arrays.asList(ArrayUtils.toObject(intArrayWithDefaults)).containsAll(intListValues));
+
+    	// SpEL
+    	Assert.isTrue(spelWithDefaultValue.equals("my default system property value"));
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/resources/values.properties b/spring-boot-modules/spring-boot-properties-2/src/main/resources/values.properties
new file mode 100644
index 0000000000..9c85893d5f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/main/resources/values.properties
@@ -0,0 +1,4 @@
+value.from.file=Value got from the file
+priority=high
+listOfValues=A,B,C
+valuesMap={key1:'1', key2 : '2', key3 : '3'}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/resources/valueswithdefaults.properties b/spring-boot-modules/spring-boot-properties-2/src/main/resources/valueswithdefaults.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/ClassNotManagedBySpringIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/ClassNotManagedBySpringIntegrationTest.java
new file mode 100644
index 0000000000..271242d4e8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/ClassNotManagedBySpringIntegrationTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.properties.value;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.mockito.Mockito.when;
+
+@RunWith(SpringRunner.class)
+public class ClassNotManagedBySpringIntegrationTest {
+
+    @MockBean
+    private InitializerBean initializerBean;
+
+    @Before
+    public void init() {
+        when(initializerBean.initClass())
+          .thenReturn(new ClassNotManagedBySpring("This is only sample value", "Another configured value"));
+    }
+
+    @Test
+    public void givenInitializerBean_whenInvokedInitClass_shouldInitialize() throws Exception {
+
+        //given
+        ClassNotManagedBySpring classNotManagedBySpring = initializerBean.initClass();
+
+        //when
+        String initializedValue = classNotManagedBySpring.getCustomVariable();
+        String anotherCustomVariable = classNotManagedBySpring.getAnotherCustomVariable();
+
+        //then
+        assertEquals("This is only sample value", initializedValue);
+        assertEquals("Another configured value", anotherCustomVariable);
+
+    }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/CollectionProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/CollectionProviderIntegrationTest.java
new file mode 100644
index 0000000000..b045786a29
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/CollectionProviderIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.properties.value;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = CollectionProvider.class)
+public class CollectionProviderIntegrationTest {
+
+    @Autowired
+    private CollectionProvider collectionProvider;
+
+    @Test
+    public void givenPropertyFileWhenSetterInjectionUsedThenValueInjected() {
+        assertThat(collectionProvider.getValues()).contains("A", "B", "C");
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java
new file mode 100644
index 0000000000..d7d1e7d78b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.properties.value;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = PriorityProvider.class)
+public class PriorityProviderIntegrationTest {
+
+    @Autowired
+    private PriorityProvider priorityProvider;
+
+    @Test
+    public void givenPropertyFileWhenConstructorInjectionUsedThenValueInjected() {
+        assertThat(priorityProvider.getPriority()).isEqualTo("high");
+    }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/README.md b/spring-boot-modules/spring-boot-properties/README.md
index addfe01438..bea3d6a293 100644
--- a/spring-boot-modules/spring-boot-properties/README.md
+++ b/spring-boot-modules/spring-boot-properties/README.md
@@ -7,9 +7,6 @@ This module contains articles about Properties in Spring Boot.
 - [Guide to @ConfigurationProperties in Spring Boot](https://www.baeldung.com/configuration-properties-in-spring-boot)
 - [Guide to @EnableConfigurationProperties](https://www.baeldung.com/spring-enable-config-properties)
 - [Properties with Spring and Spring Boot](https://www.baeldung.com/properties-with-spring) - checkout the `com.baeldung.properties` package for all scenarios of properties injection and usage
-- [A Quick Guide to Spring @Value](https://www.baeldung.com/spring-value-annotation)
 - [Spring YAML Configuration](https://www.baeldung.com/spring-yaml)
-- [Using Spring @Value with Defaults](https://www.baeldung.com/spring-value-defaults)
-- [How to Inject a Property Value Into a Class Not Managed by Spring?](https://www.baeldung.com/inject-properties-value-non-spring-class)
 - [Add Build Properties to a Spring Boot Application](https://www.baeldung.com/spring-boot-build-properties)
 - [IntelliJ – Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties)

From 7c0fa2dbcf183bcec2dace829746f874a47e527e Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 15:58:43 +0200
Subject: [PATCH 369/404] JAVA-1526: Delete moved articles from
 spring-boot-properties

---
 .../value/ClassNotManagedBySpring.java        |  28 -----
 .../baeldung/value/CollectionProvider.java    |  27 -----
 .../com/baeldung/value/InitializerBean.java   |  21 ----
 .../com/baeldung/value/PriorityProvider.java  |  22 ----
 .../java/com/baeldung/value/SomeBean.java     |  17 ---
 .../java/com/baeldung/value/ValuesApp.java    | 102 ------------------
 .../ValuesWithDefaultsApp.java                |  75 -------------
 .../src/main/resources/values.properties      |   4 -
 .../resources/valueswithdefaults.properties   |   0
 ...lassNotManagedBySpringIntegrationTest.java |  40 -------
 .../CollectionProviderIntegrationTest.java    |  22 ----
 .../PriorityProviderIntegrationTest.java      |  22 ----
 12 files changed, 380 deletions(-)
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ClassNotManagedBySpring.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/InitializerBean.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/SomeBean.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ValuesApp.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/values.properties
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/main/resources/valueswithdefaults.properties
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/ClassNotManagedBySpringIntegrationTest.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java
 delete mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ClassNotManagedBySpring.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ClassNotManagedBySpring.java
deleted file mode 100644
index 0329769d3c..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ClassNotManagedBySpring.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.value;
-
-public class ClassNotManagedBySpring {
-
-    private String customVariable;
-    private String anotherCustomVariable;
-
-    public ClassNotManagedBySpring(String someInitialValue, String anotherManagedValue) {
-        this.customVariable = someInitialValue;
-        this.anotherCustomVariable = anotherManagedValue;
-    }
-
-    public String getCustomVariable() {
-        return customVariable;
-    }
-
-    public void setCustomVariable(String customVariable) {
-        this.customVariable = customVariable;
-    }
-
-    public String getAnotherCustomVariable() {
-        return anotherCustomVariable;
-    }
-
-    public void setAnotherCustomVariable(String anotherCustomVariable) {
-        this.anotherCustomVariable = anotherCustomVariable;
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java
deleted file mode 100644
index fdc1f8ee03..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/CollectionProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.baeldung.value;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-@Component
-@PropertySource("classpath:values.properties")
-public class CollectionProvider {
-
-    private final List<String> values = new ArrayList<>();
-
-    public Collection<String> getValues() {
-        return Collections.unmodifiableCollection(values);
-    }
-
-    @Autowired
-    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
-        this.values.addAll(values);
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/InitializerBean.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/InitializerBean.java
deleted file mode 100644
index 8c8634c767..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/InitializerBean.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.value;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-@Component
-public class InitializerBean {
-
-    private String someInitialValue;
-    private String anotherManagedValue;
-
-    public InitializerBean(@Value("someInitialValue") String someInitialValue, @Value("anotherValue") String anotherManagedValue) {
-        this.someInitialValue = someInitialValue;
-        this.anotherManagedValue = anotherManagedValue;
-    }
-
-    public ClassNotManagedBySpring initClass() {
-        return new ClassNotManagedBySpring(this.someInitialValue, this.anotherManagedValue);
-    }
-
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java
deleted file mode 100644
index 9d4b105afa..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/PriorityProvider.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.value;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.stereotype.Component;
-
-@Component
-@PropertySource("classpath:values.properties")
-public class PriorityProvider {
-
-    private final String priority;
-
-    @Autowired
-    public PriorityProvider(@Value("${priority:normal}") String priority) {
-        this.priority = priority;
-    }
-
-    public String getPriority() {
-        return priority;
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/SomeBean.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/SomeBean.java
deleted file mode 100644
index 39d5245049..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/SomeBean.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.baeldung.value;
-
-public class SomeBean {
-    private int someValue;
-
-    public SomeBean(int someValue) {
-        this.someValue = someValue;
-    }
-
-    public int getSomeValue() {
-        return someValue;
-    }
-
-    public void setSomeValue(int someValue) {
-        this.someValue = someValue;
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ValuesApp.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ValuesApp.java
deleted file mode 100644
index 80893c1adf..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/value/ValuesApp.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.baeldung.value;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.PostConstruct;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
-
-@Configuration
-@PropertySource(name = "myProperties", value = "values.properties")
-public class ValuesApp {
-
-    @Value("string value")
-    private String stringValue;
-
-    @Value("${value.from.file}")
-    private String valueFromFile;
-
-    @Value("${systemValue}")
-    private String systemValue;
-
-    @Value("${unknown_param:some default}")
-    private String someDefault;
-
-    @Value("${priority}")
-    private String prioritySystemProperty;
-
-    @Value("${listOfValues}")
-    private String[] valuesArray;
-
-    @Value("#{systemProperties['priority']}")
-    private String spelValue;
-
-    @Value("#{systemProperties['unknown'] ?: 'some default'}")
-    private String spelSomeDefault;
-
-    @Value("#{someBean.someValue}")
-    private Integer someBeanValue;
-
-    @Value("#{'${listOfValues}'.split(',')}")
-    private List<String> valuesList;
-	
-    @Value("#{${valuesMap}}")
-    private Map<String, Integer> valuesMap;
-
-    @Value("#{${valuesMap}.key1}")
-    private Integer valuesMapKey1;
-
-    @Value("#{${valuesMap}['unknownKey']}")
-    private Integer unknownMapKey;
-
-    @Value("#{${unknownMap : {key1:'1', key2 : '2'}}}")
-    private Map<String, Integer> unknownMap;
-
-    @Value("#{${valuesMap}['unknownKey'] ?: 5}")
-    private Integer unknownMapKeyWithDefaultValue;
-
-    @Value("#{${valuesMap}.?[value>'1']}")
-    private Map<String, Integer> valuesMapFiltered;
-
-    @Value("#{systemProperties}")
-    private Map<String, String> systemPropertiesMap;
-
-    public static void main(String[] args) {
-        System.setProperty("systemValue", "Some system parameter value");
-        System.setProperty("priority", "System property");
-        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValuesApp.class);
-    }
-
-    @Bean
-    public SomeBean someBean() {
-        return new SomeBean(10);
-    }
-
-    @PostConstruct
-    public void afterInitialize() {
-        System.out.println(stringValue);
-        System.out.println(valueFromFile);
-        System.out.println(systemValue);
-        System.out.println(someDefault);
-        System.out.println(prioritySystemProperty);
-        System.out.println(Arrays.toString(valuesArray));
-        System.out.println(spelValue);
-        System.out.println(spelSomeDefault);
-        System.out.println(someBeanValue);
-        System.out.println(valuesList);
-        System.out.println(valuesMap);
-        System.out.println(valuesMapKey1);
-        System.out.println(unknownMapKey);
-        System.out.println(unknownMap);
-        System.out.println(unknownMapKeyWithDefaultValue);
-        System.out.println(valuesMapFiltered);
-        System.out.println(systemPropertiesMap);
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java
deleted file mode 100644
index 589f891e6b..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/valuewithdefaults/ValuesWithDefaultsApp.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.baeldung.valuewithdefaults;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.annotation.PostConstruct;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.util.Assert;
-
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
-
-/**
- * Demonstrates setting defaults for @Value annotation.  Note that there are no properties 
- * defined in the specified property source.  We also assume that the user here
- * does not have a system property named some.key.
- *
- */
-@Configuration
-@PropertySource(name = "myProperties", value = "valueswithdefaults.properties")
-public class ValuesWithDefaultsApp {
-
-    @Value("${some.key:my default value}")
-    private String stringWithDefaultValue;
-
-    @Value("${some.key:}")
-    private String stringWithBlankDefaultValue;
-
-    @Value("${some.key:true}")
-    private boolean booleanWithDefaultValue;
-    
-    @Value("${some.key:42}")
-    private int intWithDefaultValue;  
-
-    @Value("${some.key:one,two,three}")
-    private String[] stringArrayWithDefaults;
-
-    @Value("${some.key:1,2,3}")
-    private int[] intArrayWithDefaults;
-
-    @Value("#{systemProperties['some.key'] ?: 'my default system property value'}")
-    private String spelWithDefaultValue;
-    
-
-    public static void main(String[] args) {
-        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValuesWithDefaultsApp.class);
-    }
-
-    @PostConstruct
-    public void afterInitialize() {
-    	// strings
-    	Assert.isTrue(stringWithDefaultValue.equals("my default value"));
-    	Assert.isTrue(stringWithBlankDefaultValue.equals(""));
-    	
-    	// other primitives
-    	Assert.isTrue(booleanWithDefaultValue);
-    	Assert.isTrue(intWithDefaultValue == 42);
-    	
-    	// arrays
-    	List<String> stringListValues = Lists.newArrayList("one", "two", "three");
-    	Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues));
-
-    	List<Integer> intListValues = Lists.newArrayList(1, 2, 3);
-    	Assert.isTrue(Ints.asList(intArrayWithDefaults).containsAll(intListValues));
-
-    	// SpEL
-    	Assert.isTrue(spelWithDefaultValue.equals("my default system property value"));
-    	
-    }
-}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties
deleted file mode 100644
index 9c85893d5f..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/values.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-value.from.file=Value got from the file
-priority=high
-listOfValues=A,B,C
-valuesMap={key1:'1', key2 : '2', key3 : '3'}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/valueswithdefaults.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/valueswithdefaults.properties
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/ClassNotManagedBySpringIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/ClassNotManagedBySpringIntegrationTest.java
deleted file mode 100644
index 689801bece..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/ClassNotManagedBySpringIntegrationTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.baeldung.value;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static junit.framework.TestCase.assertEquals;
-import static org.mockito.Mockito.when;
-
-@RunWith(SpringRunner.class)
-public class ClassNotManagedBySpringIntegrationTest {
-
-    @MockBean
-    private InitializerBean initializerBean;
-
-    @Before
-    public void init() {
-        when(initializerBean.initClass())
-          .thenReturn(new ClassNotManagedBySpring("This is only sample value", "Another configured value"));
-    }
-
-    @Test
-    public void givenInitializerBean_whenInvokedInitClass_shouldInitialize() throws Exception {
-
-        //given
-        ClassNotManagedBySpring classNotManagedBySpring = initializerBean.initClass();
-
-        //when
-        String initializedValue = classNotManagedBySpring.getCustomVariable();
-        String anotherCustomVariable = classNotManagedBySpring.getAnotherCustomVariable();
-
-        //then
-        assertEquals("This is only sample value", initializedValue);
-        assertEquals("Another configured value", anotherCustomVariable);
-
-    }
-
-}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java
deleted file mode 100644
index 33552f2e1a..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/CollectionProviderIntegrationTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.value;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = CollectionProvider.class)
-public class CollectionProviderIntegrationTest {
-
-    @Autowired
-    private CollectionProvider collectionProvider;
-
-    @Test
-    public void givenPropertyFileWhenSetterInjectionUsedThenValueInjected() {
-        assertThat(collectionProvider.getValues()).contains("A", "B", "C");
-    }
-}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
deleted file mode 100644
index aa365a4b6a..0000000000
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/value/PriorityProviderIntegrationTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.value;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = PriorityProvider.class)
-public class PriorityProviderIntegrationTest {
-
-    @Autowired
-    private PriorityProvider priorityProvider;
-
-    @Test
-    public void givenPropertyFileWhenConstructorInjectionUsedThenValueInjected() {
-        assertThat(priorityProvider.getPriority()).isEqualTo("high");
-    }
-}
\ No newline at end of file

From adb8dd9fe2bebd2752b626e9bd811891010d7f87 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 16:03:49 +0200
Subject: [PATCH 370/404] JAVA-1526: Add pagination to the README files

---
 spring-boot-modules/spring-boot-properties-2/README.md | 3 ++-
 spring-boot-modules/spring-boot-properties/README.md   | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-properties-2/README.md b/spring-boot-modules/spring-boot-properties-2/README.md
index 7373932e4f..cd0fd5e5ee 100644
--- a/spring-boot-modules/spring-boot-properties-2/README.md
+++ b/spring-boot-modules/spring-boot-properties-2/README.md
@@ -6,4 +6,5 @@ This module contains articles about Properties in Spring Boot.
 - [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
 - [A Quick Guide to Spring @Value](https://www.baeldung.com/spring-value-annotation)
 - [Using Spring @Value with Defaults](https://www.baeldung.com/spring-value-defaults)
-- [How to Inject a Property Value Into a Class Not Managed by Spring?](https://www.baeldung.com/inject-properties-value-non-spring-class)
\ No newline at end of file
+- [How to Inject a Property Value Into a Class Not Managed by Spring?](https://www.baeldung.com/inject-properties-value-non-spring-class)
+- More articles: [[<-- prev]](../spring-boot-properties)
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/README.md b/spring-boot-modules/spring-boot-properties/README.md
index bea3d6a293..b6685c7587 100644
--- a/spring-boot-modules/spring-boot-properties/README.md
+++ b/spring-boot-modules/spring-boot-properties/README.md
@@ -10,3 +10,4 @@ This module contains articles about Properties in Spring Boot.
 - [Spring YAML Configuration](https://www.baeldung.com/spring-yaml)
 - [Add Build Properties to a Spring Boot Application](https://www.baeldung.com/spring-boot-build-properties)
 - [IntelliJ – Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties)
+- More articles: [[more -->]](../spring-boot-properties-2)
\ No newline at end of file

From 8b156e0289316112ed4a6b9610664bc5630617e5 Mon Sep 17 00:00:00 2001
From: Sampada <46674082+sampada07@users.noreply.github.com>
Date: Wed, 20 May 2020 20:51:55 +0530
Subject: [PATCH 371/404] BAEL-3493: sectioned off new properties specific to
 this article (#9325)

---
 .../src/main/resources/application.properties                 | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
index 4191d8ba25..7debdc6503 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
@@ -7,5 +7,7 @@ springdoc.api-docs.path=/api-docs
 # H2 Related Configurations
 spring.datasource.url=jdbc:h2:mem:springdoc
 
+## for com.baeldung.restdocopenapi ##
 springdoc.version=@springdoc.version@
-spring.jpa.hibernate.ddl-auto=none
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto=none
+######################################
\ No newline at end of file

From 5f8f1873ae94951580c0c0769fd97f5f555ac3ef Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Wed, 20 May 2020 23:21:40 +0530
Subject: [PATCH 372/404] JAVA-941: Migrate spring-jinq to parent-boot-2

---
 spring-jinq/pom.xml                                   | 9 ++++++++-
 spring-jinq/src/main/resources/application.properties | 2 +-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/spring-jinq/pom.xml b/spring-jinq/pom.xml
index 96cff4b886..073808823c 100644
--- a/spring-jinq/pom.xml
+++ b/spring-jinq/pom.xml
@@ -36,6 +36,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
+        
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy-dep</artifactId>
+            <version>${bytebuddy.version}</version>
+        </dependency>
 
         <!-- Spring -->
         <dependency>
@@ -66,7 +72,8 @@
     </build>
 
     <properties>
-        <jinq.version>1.8.22</jinq.version>
+        <jinq.version>1.8.29</jinq.version>
+        <bytebuddy.version>1.10.10</bytebuddy.version>
     </properties>
 
 </project>
diff --git a/spring-jinq/src/main/resources/application.properties b/spring-jinq/src/main/resources/application.properties
index dc73bed0c5..c9440b3b45 100644
--- a/spring-jinq/src/main/resources/application.properties
+++ b/spring-jinq/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.datasource.url=jdbc:h2:~/jinq
+spring.datasource.url=jdbc:h2:~/jinq;;DB_CLOSE_ON_EXIT=FALSE
 spring.datasource.username=sa
 spring.datasource.password=
 

From 8e941329df2caddf76253d3c1a22ff27a3406b17 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 20 May 2020 21:22:30 +0200
Subject: [PATCH 373/404] JAVA-1637: Remove overriden spring-boot.version
 property

---
 ddd/pom.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/ddd/pom.xml b/ddd/pom.xml
index 7f3c417b71..1253f2ac48 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -96,7 +96,6 @@
 
     <properties>
         <joda-money.version>1.0.1</joda-money.version>
-        <spring-boot.version>2.0.6.RELEASE</spring-boot.version>
     </properties>
 
 </project>

From dbdb32da463d8a59c92f31c30fb02336d184bb28 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Wed, 29 Apr 2020 10:05:02 +0200
Subject: [PATCH 374/404] [BAEL-3981] Code for article

* Equality operators

* Object#equals method

* Objects#equals static method

* Comparable interface

* Comparator interface

* Apache Commons features

* Guava features
---
 core-java-modules/core-java-lang-2/pom.xml    |   9 +-
 .../java/com/baeldung/comparing/Person.java   | 217 ++++++++++++++++++
 .../ApacheCommonsObjectUtilsUnitTest.java     |  59 +++++
 .../ComparableInterfaceUnitTest.java          | 107 +++++++++
 .../ComparatorInterfaceUnitTest.java          |  81 +++++++
 .../comparing/EqualityOperatorUnitTest.java   | 116 ++++++++++
 .../comparing/EqualsMethodUnitTest.java       |  73 ++++++
 .../com/baeldung/comparing/GuavaUnitTest.java |  80 +++++++
 .../ObjectsEqualsStaticMethodUnitTest.java    |  50 ++++
 9 files changed, 791 insertions(+), 1 deletion(-)
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ApacheCommonsObjectUtilsUnitTest.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualityOperatorUnitTest.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java

diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
index 5aa80ce3df..449b700560 100644
--- a/core-java-modules/core-java-lang-2/pom.xml
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -20,7 +20,12 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>3.9</version>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
         </dependency>
         <dependency>
             <groupId>commons-beanutils</groupId>
@@ -65,6 +70,8 @@
         <jmh-generator.version>1.19</jmh-generator.version>
         <assertj.version>3.12.2</assertj.version>
         <commons.beanutils.version>1.9.4</commons.beanutils.version>
+        <commons-lang3.version>3.9</commons-lang3.version>
+        <guava.version>29.0-jre</guava.version>
     </properties>
 
 </project>
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java
new file mode 100644
index 0000000000..7c7088a0c7
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java
@@ -0,0 +1,217 @@
+package com.baeldung.comparing;
+
+import java.time.LocalDate;
+import java.util.Comparator;
+import java.util.Objects;
+
+public class Person {
+    public static class PersonWithoutEquals {
+        private String firstName;
+        private String lastName;
+
+        public PersonWithoutEquals(String firstName, String lastName) {
+            this.firstName = firstName;
+            this.lastName = lastName;
+        }
+    }
+
+    public static class PersonWithEquals {
+        private String firstName;
+        private String lastName;
+        private LocalDate birthDate;
+
+        public PersonWithEquals(String firstName, String lastName) {
+            if (firstName == null || lastName == null) {
+                throw new NullPointerException("Names can't be null");
+            }
+            this.firstName = firstName;
+            this.lastName = lastName;
+        }
+
+        public PersonWithEquals(String firstName, String lastName, LocalDate birthDate) {
+            this(firstName, lastName);
+
+            this.birthDate = birthDate;
+        }
+
+        public String firstName() {
+            return firstName;
+        }
+
+        public String lastName() {
+            return lastName;
+        }
+
+        public LocalDate birthDate() {
+            return birthDate;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PersonWithEquals that = (PersonWithEquals) o;
+            return firstName.equals(that.firstName) &&
+              lastName.equals(that.lastName) &&
+              Objects.equals(birthDate, that.birthDate);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(firstName, lastName);
+        }
+    }
+
+    public static class PersonWithEqualsAndWrongComparable implements Comparable<PersonWithEqualsAndWrongComparable> {
+        private String firstName;
+        private String lastName;
+        private LocalDate birthDate;
+
+        public PersonWithEqualsAndWrongComparable(String firstName, String lastName) {
+            if (firstName == null || lastName == null) {
+                throw new NullPointerException("Names can't be null");
+            }
+            this.firstName = firstName;
+            this.lastName = lastName;
+        }
+
+        public PersonWithEqualsAndWrongComparable(String firstName, String lastName, LocalDate birthDate) {
+            this(firstName, lastName);
+
+            this.birthDate = birthDate;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PersonWithEqualsAndWrongComparable that = (PersonWithEqualsAndWrongComparable) o;
+            return firstName.equals(that.firstName) &&
+              lastName.equals(that.lastName) &&
+              Objects.equals(birthDate, that.birthDate);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(firstName, lastName);
+        }
+
+        @Override
+        public int compareTo(PersonWithEqualsAndWrongComparable o) {
+            return this.lastName.compareTo(o.lastName);
+        }
+    }
+
+    public static class PersonWithEqualsAndComparable implements Comparable<PersonWithEqualsAndComparable> {
+        private String firstName;
+        private String lastName;
+        private LocalDate birthDate;
+
+        public PersonWithEqualsAndComparable(String firstName, String lastName) {
+            if (firstName == null || lastName == null) {
+                throw new NullPointerException("Names can't be null");
+            }
+            this.firstName = firstName;
+            this.lastName = lastName;
+        }
+
+        public PersonWithEqualsAndComparable(String firstName, String lastName, LocalDate birthDate) {
+            this(firstName, lastName);
+
+            this.birthDate = birthDate;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PersonWithEqualsAndComparable that = (PersonWithEqualsAndComparable) o;
+            return firstName.equals(that.firstName) &&
+              lastName.equals(that.lastName) &&
+              Objects.equals(birthDate, that.birthDate);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(firstName, lastName);
+        }
+
+        @Override
+        public int compareTo(PersonWithEqualsAndComparable o) {
+            int lastNamesComparison = this.lastName.compareTo(o.lastName);
+            if (lastNamesComparison == 0) {
+                int firstNamesComparison = this.firstName.compareTo(o.firstName);
+                if (firstNamesComparison == 0) {
+                    if (this.birthDate != null && o.birthDate != null) {
+                        return this.birthDate.compareTo(o.birthDate);
+                    } else if (this.birthDate != null) {
+                      return 1;
+                    } else if (o.birthDate != null) {
+                        return -1;
+                    } else {
+                        return 0;
+                    }
+                } else {
+                    return firstNamesComparison;
+                }
+            } else {
+                return lastNamesComparison;
+            }
+        }
+    }
+
+    public static class PersonWithEqualsAndComparableUsingComparator implements Comparable<PersonWithEqualsAndComparableUsingComparator> {
+        private String firstName;
+        private String lastName;
+        private LocalDate birthDate;
+
+        public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName) {
+            if (firstName == null || lastName == null) {
+                throw new NullPointerException("Names can't be null");
+            }
+            this.firstName = firstName;
+            this.lastName = lastName;
+        }
+
+        public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName, LocalDate birthDate) {
+            this(firstName, lastName);
+
+            this.birthDate = birthDate;
+        }
+
+        public String firstName() {
+            return firstName;
+        }
+
+        public String lastName() {
+            return lastName;
+        }
+
+        public LocalDate birthDate() {
+            return birthDate;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PersonWithEqualsAndComparableUsingComparator that = (PersonWithEqualsAndComparableUsingComparator) o;
+            return firstName.equals(that.firstName) &&
+              lastName.equals(that.lastName) &&
+              Objects.equals(birthDate, that.birthDate);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(firstName, lastName);
+        }
+
+        @Override
+        public int compareTo(PersonWithEqualsAndComparableUsingComparator o) {
+            return Comparator.comparing(PersonWithEqualsAndComparableUsingComparator::lastName)
+              .thenComparing(PersonWithEqualsAndComparableUsingComparator::firstName)
+              .thenComparing(PersonWithEqualsAndComparableUsingComparator::birthDate, Comparator.nullsLast(Comparator.naturalOrder()))
+              .compare(this, o);
+        }
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ApacheCommonsObjectUtilsUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ApacheCommonsObjectUtilsUnitTest.java
new file mode 100644
index 0000000000..33b8dcb3fc
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ApacheCommonsObjectUtilsUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.comparing;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ApacheCommonsObjectUtilsUnitTest {
+
+    @Test
+    void givenTwoStringsWithSameValues_whenApacheCommonsEqualityMethods_thenEqualsTrueNotEqualsFalse() {
+        String a = new String("Hello!");
+        String b = new String("Hello!");
+
+        assertThat(ObjectUtils.equals(a, b)).isTrue();
+        assertThat(ObjectUtils.notEqual(a, b)).isFalse();
+    }
+
+    @Test
+    void givenTwoStringsWithDifferentValues_whenApacheCommonsEqualityMethods_thenEqualsFalseNotEqualsTrue() {
+        String a = new String("Hello!");
+        String b = new String("Hello World!");
+
+        assertThat(ObjectUtils.equals(a, b)).isFalse();
+        assertThat(ObjectUtils.notEqual(a, b)).isTrue();
+    }
+
+    @Test
+    void givenTwoStringsWithConsecutiveValues_whenApacheCommonsCompare_thenNegative() {
+        String first = new String("Hello!");
+        String second = new String("How are you?");
+
+        assertThat(ObjectUtils.compare(first, second)).isNegative();
+    }
+
+    @Test
+    void givenTwoStringsWithSameValues_whenApacheCommonsEqualityMethods_thenEqualsFalseNotEqualsTrue() {
+        String first = new String("Hello!");
+        String second = new String("Hello!");
+
+        assertThat(ObjectUtils.compare(first, second)).isZero();
+    }
+
+    @Test
+    void givenTwoStringsWithConsecutiveValues_whenApacheCommonsCompareReversed_thenPositive() {
+        String first = new String("Hello!");
+        String second = new String("How are you?");
+
+        assertThat(ObjectUtils.compare(second, first)).isPositive();
+    }
+
+    @Test
+    void givenTwoStringsOneNull_whenApacheCommonsCompare_thenPositive() {
+        String first = new String("Hello!");
+        String second = null;
+
+        assertThat(ObjectUtils.compare(first, second, false)).isPositive();
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java
new file mode 100644
index 0000000000..6e10188852
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java
@@ -0,0 +1,107 @@
+package com.baeldung.comparing;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ComparableInterfaceUnitTest {
+
+    @Test
+    void givenTwoConsecutiveStrings_whenCompareTo_thenNegative() {
+        String first = "Google";
+        String second = "Microsoft";
+
+        assertThat(first.compareTo(second)).isNegative();
+    }
+
+    @Test
+    void givenTwoEqualsStrings_whenCompareTo_thenZero() {
+        String first = "Google";
+        String second = "Google";
+
+        assertThat(first.compareTo(second)).isZero();
+    }
+
+    @Test
+    void givenTwoConsecutiveStrings_whenReversedCompareTo_thenPositive() {
+        String first = "Google";
+        String second = "Microsoft";
+
+        assertThat(second.compareTo(first)).isPositive();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndWrongComparableAndConsecutiveLastNames_whenCompareTo_thenNegative() {
+        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndWrongComparable joe = new Person.PersonWithEqualsAndWrongComparable("Joe", "Portman");
+
+        assertThat(richard.compareTo(joe)).isNegative();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndWrongComparableAndSameLastNames_whenReversedCompareTo_thenZero() {
+        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndWrongComparable mike = new Person.PersonWithEqualsAndWrongComparable("Mike", "Jefferson");
+
+        assertThat(richard.compareTo(mike)).isZero();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndWrongComparableAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() {
+        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndWrongComparable joe = new Person.PersonWithEqualsAndWrongComparable("Joe", "Portman");
+
+        assertThat(joe.compareTo(richard)).isPositive();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndWrongComparableAndSameLastNames_whenSortedSet_thenProblem() {
+        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndWrongComparable mike = new Person.PersonWithEqualsAndWrongComparable("Mike", "Jefferson");
+
+        SortedSet<Person.PersonWithEqualsAndWrongComparable> people = new TreeSet<>();
+        people.add(richard);
+        people.add(mike);
+
+        assertThat(people).containsExactly(richard);
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableAndConsecutiveLastNames_whenCompareTo_thenNegative() {
+        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparable joe = new Person.PersonWithEqualsAndComparable("Joe", "Portman");
+
+        assertThat(richard.compareTo(joe)).isNegative();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableAndSameLastNames_whenReversedCompareTo_thenZero() {
+        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparable mike = new Person.PersonWithEqualsAndComparable("Mike", "Jefferson");
+
+        assertThat(richard.compareTo(mike)).isPositive();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() {
+        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparable joe = new Person.PersonWithEqualsAndComparable("Joe", "Portman");
+
+        assertThat(joe.compareTo(richard)).isPositive();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableAndSameLastNames_whenSortedSet_thenProblem() {
+        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparable mike = new Person.PersonWithEqualsAndComparable("Mike", "Jefferson");
+
+        SortedSet<Person.PersonWithEqualsAndComparable> people = new TreeSet<>();
+        people.add(richard);
+        people.add(mike);
+
+        assertThat(people).containsExactly(mike, richard);
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java
new file mode 100644
index 0000000000..a406b12752
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java
@@ -0,0 +1,81 @@
+package com.baeldung.comparing;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ComparatorInterfaceUnitTest {
+
+    @Test
+    void givenListOfTwoPersonWithEqualsAndComparatorByFirstName_whenSort_thenSortedByFirstNames() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals allan = new Person.PersonWithEquals("Allan", "Dale");
+
+        List<Person.PersonWithEquals> people = new ArrayList<>();
+        people.add(joe);
+        people.add(allan);
+
+        Comparator<Person.PersonWithEquals> compareByFirstNames = new Comparator<Person.PersonWithEquals>() {
+            @Override
+            public int compare(Person.PersonWithEquals o1, Person.PersonWithEquals o2) {
+                return o1.firstName().compareTo(o2.firstName());
+            }
+        };
+        people.sort(compareByFirstNames);
+
+        assertThat(people).containsExactly(allan, joe);
+    }
+
+    @Test
+    void givenListOfTwoPersonWithEqualsAndComparatorByFirstNameFunctionalStyle_whenSort_thenSortedByFirstNames() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals allan = new Person.PersonWithEquals("Allan", "Dale");
+
+        List<Person.PersonWithEquals> people = new ArrayList<>();
+        people.add(joe);
+        people.add(allan);
+
+        Comparator<Person.PersonWithEquals> compareByFirstNames = Comparator.comparing(Person.PersonWithEquals::firstName);
+        people.sort(compareByFirstNames);
+
+        assertThat(people).containsExactly(allan, joe);
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableUsingComparatorAndConsecutiveLastNames_whenCompareTo_thenNegative() {
+        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparableUsingComparator joe = new Person.PersonWithEqualsAndComparableUsingComparator("Joe", "Portman");
+
+        assertThat(richard.compareTo(joe)).isNegative();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableUsingComparatorAndSameLastNames_whenReversedCompareTo_thenZero() {
+        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparableUsingComparator mike = new Person.PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson");
+
+        assertThat(richard.compareTo(mike)).isPositive();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableUsingComparatorAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() {
+        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparableUsingComparator joe = new Person.PersonWithEqualsAndComparableUsingComparator("Joe", "Portman");
+
+        assertThat(joe.compareTo(richard)).isPositive();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsAndComparableUsingComparatorAndSameLastNames_whenSortedSet_thenProblem() {
+        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        Person.PersonWithEqualsAndComparableUsingComparator mike = new Person.PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson");
+
+        SortedSet<Person.PersonWithEqualsAndComparableUsingComparator> people = new TreeSet<>();
+        people.add(richard);
+        people.add(mike);
+
+        assertThat(people).containsExactly(mike, richard);
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualityOperatorUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualityOperatorUnitTest.java
new file mode 100644
index 0000000000..ebcf83ef5b
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualityOperatorUnitTest.java
@@ -0,0 +1,116 @@
+package com.baeldung.comparing;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class EqualityOperatorUnitTest {
+
+    @Test
+    void givenTwoIntsWithSameValues_whenEqualityOperators_thenConsideredSame() {
+        int a = 1;
+        int b = 1;
+
+        assertThat(a == b).isTrue();
+        assertThat(a != b).isFalse();
+    }
+
+    @Test
+    void givenTwoIntsWithDifferentValues_whenEqualityOperators_thenNotConsideredSame() {
+        int a = 1;
+        int b = 2;
+
+        assertThat(a == b).isFalse();
+        assertThat(a != b).isTrue();
+    }
+
+    @Test
+    void givenTwoIntsWithSameValuesOneWrapped_whenEqualityOperators_thenConsideredSame() {
+        int a = 1;
+        Integer b = new Integer(1);
+
+        assertThat(a == b).isTrue();
+        assertThat(a != b).isFalse();
+    }
+
+    @Test
+    void givenTwoIntsWithDifferentValuesOneWrapped_whenEqualityOperators_thenNotConsideredSame() {
+        int a = 1;
+        Integer b = new Integer(2);
+
+        assertThat(a == b).isFalse();
+        assertThat(a != b).isTrue();
+    }
+
+    @Test
+    void givenTwoIntegersWithSameValues_whenEqualityOperators_thenNotConsideredSame() {
+        Integer a = new Integer(1);
+        Integer b = new Integer(1);
+
+        assertThat(a == b).isFalse();
+        assertThat(a != b).isTrue();
+    }
+
+    @Test
+    void givenTwoIntegersWithDifferentValues_whenEqualityOperators_thenNotConsideredSame() {
+        Integer a = new Integer(1);
+        Integer b = new Integer(2);
+
+        assertThat(a == b).isFalse();
+        assertThat(a != b).isTrue();
+    }
+
+    @Test
+    void givenTwoIntegersWithSameReference_whenEqualityOperators_thenConsideredSame() {
+        Integer a = new Integer(1);
+        Integer b = a;
+
+        assertThat(a == b).isTrue();
+        assertThat(a != b).isFalse();
+    }
+
+    @Test
+    void givenTwoIntegersFromValueOfWithSameValues_whenEqualityOperators_thenConsideredSame() {
+        Integer a = Integer.valueOf(1);
+        Integer b = Integer.valueOf(1);
+
+        assertThat(a == b).isTrue();
+        assertThat(a != b).isFalse();
+    }
+
+    @Test
+    void givenTwoStringsWithSameValues_whenEqualityOperators_thenNotConsideredSame() {
+        String a = new String("Hello!");
+        String b = new String("Hello!");
+
+        assertThat(a == b).isFalse();
+        assertThat(a != b).isTrue();
+    }
+
+    @Test
+    void givenTwoStringsFromLiteralsWithSameValues_whenEqualityOperators_thenConsideredSame() {
+        String a = "Hello!";
+        String b = "Hello!";
+
+        assertThat(a == b).isTrue();
+        assertThat(a != b).isFalse();
+    }
+
+    @Test
+    void givenTwoNullObjects_whenEqualityOperators_thenConsideredSame() {
+        Object a = null;
+        Object b = null;
+
+        assertThat(a == b).isTrue();
+        assertThat(a != b).isFalse();
+    }
+
+    @Test
+    void givenTwoObjectsOneNull_whenEqualityOperators_thenNotConsideredSame() {
+        Object a = null;
+        Object b = "Hello!";
+
+        assertThat(a == b).isFalse();
+        assertThat(a != b).isTrue();
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
new file mode 100644
index 0000000000..4775bc3de1
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.comparing;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class EqualsMethodUnitTest {
+
+    @Test
+    void givenTwoIntegersWithSameValue_whenEquals_thenTrue() {
+        Integer a = new Integer(1);
+        Integer b = new Integer(1);
+
+        assertThat(a.equals(b)).isTrue();
+    }
+
+    @Test
+    void givenTwoStringsWithSameValue_whenEquals_thenTrue() {
+        String a = new String("Hello!");
+        String b = new String("Hello!");
+
+        assertThat(a.equals(b)).isTrue();
+    }
+
+    @Test
+    void givenTwoStringsWithDifferentValue_whenEquals_thenFalse() {
+        String a = new String("Hello!");
+        String b = new String("Hello World!");
+
+        assertThat(a.equals(b)).isFalse();
+    }
+
+    @Test
+    void givenTwoObjectsFirstNull_whenEquals_thenNullPointerExceptionThrown() {
+        Object a = null;
+        Object b = new String("Hello!");
+
+        assertThrows(NullPointerException.class, () -> a.equals(b));
+    }
+
+    @Test
+    void givenTwoObjectsSecondNull_whenEquals_thenFalse() {
+        Object a = new String("Hello!");
+        Object b = null;
+
+        assertThat(a.equals(b)).isFalse();
+    }
+
+    @Test
+    void givenTwoPersonWithoutEqualsWithSameNames_whenEquals_thenFalse() {
+        Person.PersonWithoutEquals joe = new Person.PersonWithoutEquals("Joe", "Portman");
+        Person.PersonWithoutEquals joeAgain = new Person.PersonWithoutEquals("Joe", "Portman");
+
+        assertThat(joe.equals(joeAgain)).isFalse();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsWithSameNames_whenEquals_thenTrue() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals joeAgain = new Person.PersonWithEquals("Joe", "Portman");
+
+        assertThat(joe.equals(joeAgain)).isTrue();
+    }
+
+    @Test
+    void givenTwoPersonWittEqualsWithDifferentNames_whenEquals_thenFalse() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals nathalie = new Person.PersonWithEquals("Nathalie", "Portman");
+
+        assertThat(joe.equals(nathalie)).isFalse();
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
new file mode 100644
index 0000000000..0a4d0dd8d3
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.comparing;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.primitives.Booleans;
+import com.google.common.primitives.Bytes;
+import com.google.common.primitives.Ints;
+import com.google.common.primitives.Shorts;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class GuavaUnitTest {
+
+    @Nested
+    class ObjectsEqualMethod {
+        @Test
+        void givenTwoStringsWithSameValues_whenObjectsEqualMethods_thenTrue() {
+            String a = new String("Hello!");
+            String b = new String("Hello!");
+
+            assertThat(Objects.equal(a, b)).isTrue();
+        }
+
+        @Test
+        void givenTwoStringsWithDifferentValues_whenObjectsEqualMethods_thenFalse() {
+            String a = new String("Hello!");
+            String b = new String("Hello World!");
+
+            assertThat(Objects.equal(a, b)).isFalse();
+        }
+    }
+
+    @Nested
+    class ComparisonMethods {
+        @Test
+        void givenTwoIntsWithConsecutiveValues_whenIntsCompareMethods_thenNegative() {
+            int first = 1;
+            int second = 2;
+            assertThat(Ints.compare(first, second)).isNegative();
+        }
+
+        @Test
+        void givenTwoIntsWithSameValues_whenIntsCompareMethods_thenZero() {
+            int first = 1;
+            int second = 1;
+
+            assertThat(Ints.compare(first, second)).isZero();
+        }
+
+        @Test
+        void givenTwoIntsWithConsecutiveValues_whenIntsCompareMethodsReversed_thenNegative() {
+            int first = 1;
+            int second = 2;
+
+            assertThat(Ints.compare(second, first)).isPositive();
+        }
+    }
+
+    @Nested
+    class ComparisonChainClass {
+        @Test
+        void givenTwoPersonWithEquals_whenComparisonChainByLastNameThenFirstName_thenSortedJoeFirstAndNathalieSecond() {
+            Person.PersonWithEquals nathalie = new Person.PersonWithEquals("Nathalie", "Portman");
+            Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+
+            int comparisonResult = ComparisonChain.start()
+              .compare(nathalie.lastName(), joe.lastName())
+              .compare(nathalie.firstName(), joe.firstName())
+              .result();
+
+            assertThat(comparisonResult).isPositive();
+        }
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
new file mode 100644
index 0000000000..c26cb4e08c
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.comparing;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Objects;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ObjectsEqualsStaticMethodUnitTest {
+
+    @Test
+    void givenTwoPersonWithEqualsWithSameNames_whenObjectsEquals_thenTrue() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals joeAgain = new Person.PersonWithEquals("Joe", "Portman");
+
+        assertThat(Objects.equals(joe, joeAgain)).isTrue();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsWithDifferentNames_whenObjectsEquals_thenFalse() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals nathalie = new Person.PersonWithEquals("Nathalie", "Portman");
+
+        assertThat(Objects.equals(joe, nathalie)).isFalse();
+    }
+
+    @Test
+    void givenTwoPersonWithEqualsFirstNull_whenObjectsEquals_thenFalse() {
+        Person.PersonWithEquals nobody = null;
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+
+        assertThat(Objects.equals(nobody, joe)).isFalse();
+    }
+
+    @Test
+    void givenTwoObjectsSecondtNull_whenObjectsEquals_thenFalse() {
+        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        Person.PersonWithEquals nobody = null;
+
+        assertThat(Objects.equals(joe, nobody)).isFalse();
+    }
+
+    @Test
+    void givenTwoObjectsNull_whenObjectsEquals_thenTrue() {
+        Person.PersonWithEquals nobody = null;
+        Person.PersonWithEquals nobodyAgain = null;
+
+        assertThat(Objects.equals(nobody, nobodyAgain)).isTrue();
+    }
+}

From 24a88c11ac6eb27cb12249a5e7be574894e1168b Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Wed, 13 May 2020 19:17:02 +0200
Subject: [PATCH 375/404] [BAEL-3981] Moved inner classes to upper level

---
 .../java/com/baeldung/comparing/Person.java   | 217 ------------------
 .../baeldung/comparing/PersonWithEquals.java  |  51 ++++
 .../PersonWithEqualsAndComparable.java        |  62 +++++
 ...ithEqualsAndComparableUsingComparator.java |  60 +++++
 .../PersonWithEqualsAndWrongComparable.java   |  44 ++++
 .../comparing/PersonWithoutEquals.java        |  11 +
 .../ComparableInterfaceUnitTest.java          |  36 +--
 .../ComparatorInterfaceUnitTest.java          |  36 +--
 .../comparing/EqualsMethodUnitTest.java       |  12 +-
 .../com/baeldung/comparing/GuavaUnitTest.java |  11 +-
 .../ObjectsEqualsStaticMethodUnitTest.java    |  20 +-
 11 files changed, 282 insertions(+), 278 deletions(-)
 delete mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEquals.java
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparable.java
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparableUsingComparator.java
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndWrongComparable.java
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithoutEquals.java

diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java
deleted file mode 100644
index 7c7088a0c7..0000000000
--- a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/Person.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package com.baeldung.comparing;
-
-import java.time.LocalDate;
-import java.util.Comparator;
-import java.util.Objects;
-
-public class Person {
-    public static class PersonWithoutEquals {
-        private String firstName;
-        private String lastName;
-
-        public PersonWithoutEquals(String firstName, String lastName) {
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-    }
-
-    public static class PersonWithEquals {
-        private String firstName;
-        private String lastName;
-        private LocalDate birthDate;
-
-        public PersonWithEquals(String firstName, String lastName) {
-            if (firstName == null || lastName == null) {
-                throw new NullPointerException("Names can't be null");
-            }
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-
-        public PersonWithEquals(String firstName, String lastName, LocalDate birthDate) {
-            this(firstName, lastName);
-
-            this.birthDate = birthDate;
-        }
-
-        public String firstName() {
-            return firstName;
-        }
-
-        public String lastName() {
-            return lastName;
-        }
-
-        public LocalDate birthDate() {
-            return birthDate;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            PersonWithEquals that = (PersonWithEquals) o;
-            return firstName.equals(that.firstName) &&
-              lastName.equals(that.lastName) &&
-              Objects.equals(birthDate, that.birthDate);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(firstName, lastName);
-        }
-    }
-
-    public static class PersonWithEqualsAndWrongComparable implements Comparable<PersonWithEqualsAndWrongComparable> {
-        private String firstName;
-        private String lastName;
-        private LocalDate birthDate;
-
-        public PersonWithEqualsAndWrongComparable(String firstName, String lastName) {
-            if (firstName == null || lastName == null) {
-                throw new NullPointerException("Names can't be null");
-            }
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-
-        public PersonWithEqualsAndWrongComparable(String firstName, String lastName, LocalDate birthDate) {
-            this(firstName, lastName);
-
-            this.birthDate = birthDate;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            PersonWithEqualsAndWrongComparable that = (PersonWithEqualsAndWrongComparable) o;
-            return firstName.equals(that.firstName) &&
-              lastName.equals(that.lastName) &&
-              Objects.equals(birthDate, that.birthDate);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(firstName, lastName);
-        }
-
-        @Override
-        public int compareTo(PersonWithEqualsAndWrongComparable o) {
-            return this.lastName.compareTo(o.lastName);
-        }
-    }
-
-    public static class PersonWithEqualsAndComparable implements Comparable<PersonWithEqualsAndComparable> {
-        private String firstName;
-        private String lastName;
-        private LocalDate birthDate;
-
-        public PersonWithEqualsAndComparable(String firstName, String lastName) {
-            if (firstName == null || lastName == null) {
-                throw new NullPointerException("Names can't be null");
-            }
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-
-        public PersonWithEqualsAndComparable(String firstName, String lastName, LocalDate birthDate) {
-            this(firstName, lastName);
-
-            this.birthDate = birthDate;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            PersonWithEqualsAndComparable that = (PersonWithEqualsAndComparable) o;
-            return firstName.equals(that.firstName) &&
-              lastName.equals(that.lastName) &&
-              Objects.equals(birthDate, that.birthDate);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(firstName, lastName);
-        }
-
-        @Override
-        public int compareTo(PersonWithEqualsAndComparable o) {
-            int lastNamesComparison = this.lastName.compareTo(o.lastName);
-            if (lastNamesComparison == 0) {
-                int firstNamesComparison = this.firstName.compareTo(o.firstName);
-                if (firstNamesComparison == 0) {
-                    if (this.birthDate != null && o.birthDate != null) {
-                        return this.birthDate.compareTo(o.birthDate);
-                    } else if (this.birthDate != null) {
-                      return 1;
-                    } else if (o.birthDate != null) {
-                        return -1;
-                    } else {
-                        return 0;
-                    }
-                } else {
-                    return firstNamesComparison;
-                }
-            } else {
-                return lastNamesComparison;
-            }
-        }
-    }
-
-    public static class PersonWithEqualsAndComparableUsingComparator implements Comparable<PersonWithEqualsAndComparableUsingComparator> {
-        private String firstName;
-        private String lastName;
-        private LocalDate birthDate;
-
-        public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName) {
-            if (firstName == null || lastName == null) {
-                throw new NullPointerException("Names can't be null");
-            }
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-
-        public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName, LocalDate birthDate) {
-            this(firstName, lastName);
-
-            this.birthDate = birthDate;
-        }
-
-        public String firstName() {
-            return firstName;
-        }
-
-        public String lastName() {
-            return lastName;
-        }
-
-        public LocalDate birthDate() {
-            return birthDate;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            PersonWithEqualsAndComparableUsingComparator that = (PersonWithEqualsAndComparableUsingComparator) o;
-            return firstName.equals(that.firstName) &&
-              lastName.equals(that.lastName) &&
-              Objects.equals(birthDate, that.birthDate);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(firstName, lastName);
-        }
-
-        @Override
-        public int compareTo(PersonWithEqualsAndComparableUsingComparator o) {
-            return Comparator.comparing(PersonWithEqualsAndComparableUsingComparator::lastName)
-              .thenComparing(PersonWithEqualsAndComparableUsingComparator::firstName)
-              .thenComparing(PersonWithEqualsAndComparableUsingComparator::birthDate, Comparator.nullsLast(Comparator.naturalOrder()))
-              .compare(this, o);
-        }
-    }
-}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEquals.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEquals.java
new file mode 100644
index 0000000000..e3a61fc05a
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEquals.java
@@ -0,0 +1,51 @@
+package com.baeldung.comparing;
+
+import java.time.LocalDate;
+import java.util.Objects;
+
+public class PersonWithEquals {
+    private String firstName;
+    private String lastName;
+    private LocalDate birthDate;
+
+    public PersonWithEquals(String firstName, String lastName) {
+        if (firstName == null || lastName == null) {
+            throw new NullPointerException("Names can't be null");
+        }
+        this.firstName = firstName;
+        this.lastName = lastName;
+    }
+
+    public PersonWithEquals(String firstName, String lastName, LocalDate birthDate) {
+        this(firstName, lastName);
+
+        this.birthDate = birthDate;
+    }
+
+    public String firstName() {
+        return firstName;
+    }
+
+    public String lastName() {
+        return lastName;
+    }
+
+    public LocalDate birthDate() {
+        return birthDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PersonWithEquals that = (PersonWithEquals) o;
+        return firstName.equals(that.firstName) &&
+          lastName.equals(that.lastName) &&
+          Objects.equals(birthDate, that.birthDate);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(firstName, lastName);
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparable.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparable.java
new file mode 100644
index 0000000000..5611ce8a09
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparable.java
@@ -0,0 +1,62 @@
+package com.baeldung.comparing;
+
+import java.time.LocalDate;
+import java.util.Objects;
+
+public class PersonWithEqualsAndComparable implements Comparable<PersonWithEqualsAndComparable> {
+    private String firstName;
+    private String lastName;
+    private LocalDate birthDate;
+
+    public PersonWithEqualsAndComparable(String firstName, String lastName) {
+        if (firstName == null || lastName == null) {
+            throw new NullPointerException("Names can't be null");
+        }
+        this.firstName = firstName;
+        this.lastName = lastName;
+    }
+
+    public PersonWithEqualsAndComparable(String firstName, String lastName, LocalDate birthDate) {
+        this(firstName, lastName);
+
+        this.birthDate = birthDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PersonWithEqualsAndComparable that = (PersonWithEqualsAndComparable) o;
+        return firstName.equals(that.firstName) &&
+          lastName.equals(that.lastName) &&
+          Objects.equals(birthDate, that.birthDate);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(firstName, lastName);
+    }
+
+    @Override
+    public int compareTo(PersonWithEqualsAndComparable o) {
+        int lastNamesComparison = this.lastName.compareTo(o.lastName);
+        if (lastNamesComparison == 0) {
+            int firstNamesComparison = this.firstName.compareTo(o.firstName);
+            if (firstNamesComparison == 0) {
+                if (this.birthDate != null && o.birthDate != null) {
+                    return this.birthDate.compareTo(o.birthDate);
+                } else if (this.birthDate != null) {
+                  return 1;
+                } else if (o.birthDate != null) {
+                    return -1;
+                } else {
+                    return 0;
+                }
+            } else {
+                return firstNamesComparison;
+            }
+        } else {
+            return lastNamesComparison;
+        }
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparableUsingComparator.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparableUsingComparator.java
new file mode 100644
index 0000000000..ed322cb353
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndComparableUsingComparator.java
@@ -0,0 +1,60 @@
+package com.baeldung.comparing;
+
+import java.time.LocalDate;
+import java.util.Comparator;
+import java.util.Objects;
+
+public class PersonWithEqualsAndComparableUsingComparator implements Comparable<PersonWithEqualsAndComparableUsingComparator> {
+    private String firstName;
+    private String lastName;
+    private LocalDate birthDate;
+
+    public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName) {
+        if (firstName == null || lastName == null) {
+            throw new NullPointerException("Names can't be null");
+        }
+        this.firstName = firstName;
+        this.lastName = lastName;
+    }
+
+    public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName, LocalDate birthDate) {
+        this(firstName, lastName);
+
+        this.birthDate = birthDate;
+    }
+
+    public String firstName() {
+        return firstName;
+    }
+
+    public String lastName() {
+        return lastName;
+    }
+
+    public LocalDate birthDate() {
+        return birthDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PersonWithEqualsAndComparableUsingComparator that = (PersonWithEqualsAndComparableUsingComparator) o;
+        return firstName.equals(that.firstName) &&
+          lastName.equals(that.lastName) &&
+          Objects.equals(birthDate, that.birthDate);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(firstName, lastName);
+    }
+
+    @Override
+    public int compareTo(PersonWithEqualsAndComparableUsingComparator o) {
+        return Comparator.comparing(PersonWithEqualsAndComparableUsingComparator::lastName)
+          .thenComparing(PersonWithEqualsAndComparableUsingComparator::firstName)
+          .thenComparing(PersonWithEqualsAndComparableUsingComparator::birthDate, Comparator.nullsLast(Comparator.naturalOrder()))
+          .compare(this, o);
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndWrongComparable.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndWrongComparable.java
new file mode 100644
index 0000000000..e0bdaa413a
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithEqualsAndWrongComparable.java
@@ -0,0 +1,44 @@
+package com.baeldung.comparing;
+
+import java.time.LocalDate;
+import java.util.Objects;
+
+public class PersonWithEqualsAndWrongComparable implements Comparable<PersonWithEqualsAndWrongComparable> {
+    private String firstName;
+    private String lastName;
+    private LocalDate birthDate;
+
+    public PersonWithEqualsAndWrongComparable(String firstName, String lastName) {
+        if (firstName == null || lastName == null) {
+            throw new NullPointerException("Names can't be null");
+        }
+        this.firstName = firstName;
+        this.lastName = lastName;
+    }
+
+    public PersonWithEqualsAndWrongComparable(String firstName, String lastName, LocalDate birthDate) {
+        this(firstName, lastName);
+
+        this.birthDate = birthDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PersonWithEqualsAndWrongComparable that = (PersonWithEqualsAndWrongComparable) o;
+        return firstName.equals(that.firstName) &&
+          lastName.equals(that.lastName) &&
+          Objects.equals(birthDate, that.birthDate);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(firstName, lastName);
+    }
+
+    @Override
+    public int compareTo(PersonWithEqualsAndWrongComparable o) {
+        return this.lastName.compareTo(o.lastName);
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithoutEquals.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithoutEquals.java
new file mode 100644
index 0000000000..bb4c6b958b
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/comparing/PersonWithoutEquals.java
@@ -0,0 +1,11 @@
+package com.baeldung.comparing;
+
+public class PersonWithoutEquals {
+    private String firstName;
+    private String lastName;
+
+    public PersonWithoutEquals(String firstName, String lastName) {
+        this.firstName = firstName;
+        this.lastName = lastName;
+    }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java
index 6e10188852..281c4a0201 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparableInterfaceUnitTest.java
@@ -35,34 +35,34 @@ class ComparableInterfaceUnitTest {
 
     @Test
     void givenTwoPersonWithEqualsAndWrongComparableAndConsecutiveLastNames_whenCompareTo_thenNegative() {
-        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndWrongComparable joe = new Person.PersonWithEqualsAndWrongComparable("Joe", "Portman");
+        PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        PersonWithEqualsAndWrongComparable joe = new PersonWithEqualsAndWrongComparable("Joe", "Portman");
 
         assertThat(richard.compareTo(joe)).isNegative();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndWrongComparableAndSameLastNames_whenReversedCompareTo_thenZero() {
-        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndWrongComparable mike = new Person.PersonWithEqualsAndWrongComparable("Mike", "Jefferson");
+        PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        PersonWithEqualsAndWrongComparable mike = new PersonWithEqualsAndWrongComparable("Mike", "Jefferson");
 
         assertThat(richard.compareTo(mike)).isZero();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndWrongComparableAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() {
-        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndWrongComparable joe = new Person.PersonWithEqualsAndWrongComparable("Joe", "Portman");
+        PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        PersonWithEqualsAndWrongComparable joe = new PersonWithEqualsAndWrongComparable("Joe", "Portman");
 
         assertThat(joe.compareTo(richard)).isPositive();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndWrongComparableAndSameLastNames_whenSortedSet_thenProblem() {
-        Person.PersonWithEqualsAndWrongComparable richard = new Person.PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndWrongComparable mike = new Person.PersonWithEqualsAndWrongComparable("Mike", "Jefferson");
+        PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson");
+        PersonWithEqualsAndWrongComparable mike = new PersonWithEqualsAndWrongComparable("Mike", "Jefferson");
 
-        SortedSet<Person.PersonWithEqualsAndWrongComparable> people = new TreeSet<>();
+        SortedSet<PersonWithEqualsAndWrongComparable> people = new TreeSet<>();
         people.add(richard);
         people.add(mike);
 
@@ -71,34 +71,34 @@ class ComparableInterfaceUnitTest {
 
     @Test
     void givenTwoPersonWithEqualsAndComparableAndConsecutiveLastNames_whenCompareTo_thenNegative() {
-        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparable joe = new Person.PersonWithEqualsAndComparable("Joe", "Portman");
+        PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson");
+        PersonWithEqualsAndComparable joe = new PersonWithEqualsAndComparable("Joe", "Portman");
 
         assertThat(richard.compareTo(joe)).isNegative();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndComparableAndSameLastNames_whenReversedCompareTo_thenZero() {
-        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparable mike = new Person.PersonWithEqualsAndComparable("Mike", "Jefferson");
+        PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson");
+        PersonWithEqualsAndComparable mike = new PersonWithEqualsAndComparable("Mike", "Jefferson");
 
         assertThat(richard.compareTo(mike)).isPositive();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndComparableAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() {
-        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparable joe = new Person.PersonWithEqualsAndComparable("Joe", "Portman");
+        PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson");
+        PersonWithEqualsAndComparable joe = new PersonWithEqualsAndComparable("Joe", "Portman");
 
         assertThat(joe.compareTo(richard)).isPositive();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndComparableAndSameLastNames_whenSortedSet_thenProblem() {
-        Person.PersonWithEqualsAndComparable richard = new Person.PersonWithEqualsAndComparable("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparable mike = new Person.PersonWithEqualsAndComparable("Mike", "Jefferson");
+        PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson");
+        PersonWithEqualsAndComparable mike = new PersonWithEqualsAndComparable("Mike", "Jefferson");
 
-        SortedSet<Person.PersonWithEqualsAndComparable> people = new TreeSet<>();
+        SortedSet<PersonWithEqualsAndComparable> people = new TreeSet<>();
         people.add(richard);
         people.add(mike);
 
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java
index a406b12752..769ae60bed 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ComparatorInterfaceUnitTest.java
@@ -10,16 +10,16 @@ class ComparatorInterfaceUnitTest {
 
     @Test
     void givenListOfTwoPersonWithEqualsAndComparatorByFirstName_whenSort_thenSortedByFirstNames() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals allan = new Person.PersonWithEquals("Allan", "Dale");
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals allan = new PersonWithEquals("Allan", "Dale");
 
-        List<Person.PersonWithEquals> people = new ArrayList<>();
+        List<PersonWithEquals> people = new ArrayList<>();
         people.add(joe);
         people.add(allan);
 
-        Comparator<Person.PersonWithEquals> compareByFirstNames = new Comparator<Person.PersonWithEquals>() {
+        Comparator<PersonWithEquals> compareByFirstNames = new Comparator<PersonWithEquals>() {
             @Override
-            public int compare(Person.PersonWithEquals o1, Person.PersonWithEquals o2) {
+            public int compare(PersonWithEquals o1, PersonWithEquals o2) {
                 return o1.firstName().compareTo(o2.firstName());
             }
         };
@@ -30,14 +30,14 @@ class ComparatorInterfaceUnitTest {
 
     @Test
     void givenListOfTwoPersonWithEqualsAndComparatorByFirstNameFunctionalStyle_whenSort_thenSortedByFirstNames() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals allan = new Person.PersonWithEquals("Allan", "Dale");
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals allan = new PersonWithEquals("Allan", "Dale");
 
-        List<Person.PersonWithEquals> people = new ArrayList<>();
+        List<PersonWithEquals> people = new ArrayList<>();
         people.add(joe);
         people.add(allan);
 
-        Comparator<Person.PersonWithEquals> compareByFirstNames = Comparator.comparing(Person.PersonWithEquals::firstName);
+        Comparator<PersonWithEquals> compareByFirstNames = Comparator.comparing(PersonWithEquals::firstName);
         people.sort(compareByFirstNames);
 
         assertThat(people).containsExactly(allan, joe);
@@ -45,34 +45,34 @@ class ComparatorInterfaceUnitTest {
 
     @Test
     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndConsecutiveLastNames_whenCompareTo_thenNegative() {
-        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparableUsingComparator joe = new Person.PersonWithEqualsAndComparableUsingComparator("Joe", "Portman");
+        PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        PersonWithEqualsAndComparableUsingComparator joe = new PersonWithEqualsAndComparableUsingComparator("Joe", "Portman");
 
         assertThat(richard.compareTo(joe)).isNegative();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndSameLastNames_whenReversedCompareTo_thenZero() {
-        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparableUsingComparator mike = new Person.PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson");
+        PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        PersonWithEqualsAndComparableUsingComparator mike = new PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson");
 
         assertThat(richard.compareTo(mike)).isPositive();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() {
-        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparableUsingComparator joe = new Person.PersonWithEqualsAndComparableUsingComparator("Joe", "Portman");
+        PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        PersonWithEqualsAndComparableUsingComparator joe = new PersonWithEqualsAndComparableUsingComparator("Joe", "Portman");
 
         assertThat(joe.compareTo(richard)).isPositive();
     }
 
     @Test
     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndSameLastNames_whenSortedSet_thenProblem() {
-        Person.PersonWithEqualsAndComparableUsingComparator richard = new Person.PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
-        Person.PersonWithEqualsAndComparableUsingComparator mike = new Person.PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson");
+        PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson");
+        PersonWithEqualsAndComparableUsingComparator mike = new PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson");
 
-        SortedSet<Person.PersonWithEqualsAndComparableUsingComparator> people = new TreeSet<>();
+        SortedSet<PersonWithEqualsAndComparableUsingComparator> people = new TreeSet<>();
         people.add(richard);
         people.add(mike);
 
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
index 4775bc3de1..6ae243c0ff 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
@@ -49,24 +49,24 @@ class EqualsMethodUnitTest {
 
     @Test
     void givenTwoPersonWithoutEqualsWithSameNames_whenEquals_thenFalse() {
-        Person.PersonWithoutEquals joe = new Person.PersonWithoutEquals("Joe", "Portman");
-        Person.PersonWithoutEquals joeAgain = new Person.PersonWithoutEquals("Joe", "Portman");
+        PersonWithoutEquals joe = new PersonWithoutEquals("Joe", "Portman");
+        PersonWithoutEquals joeAgain = new PersonWithoutEquals("Joe", "Portman");
 
         assertThat(joe.equals(joeAgain)).isFalse();
     }
 
     @Test
     void givenTwoPersonWithEqualsWithSameNames_whenEquals_thenTrue() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals joeAgain = new Person.PersonWithEquals("Joe", "Portman");
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals joeAgain = new PersonWithEquals("Joe", "Portman");
 
         assertThat(joe.equals(joeAgain)).isTrue();
     }
 
     @Test
     void givenTwoPersonWittEqualsWithDifferentNames_whenEquals_thenFalse() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals nathalie = new Person.PersonWithEquals("Nathalie", "Portman");
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals nathalie = new PersonWithEquals("Nathalie", "Portman");
 
         assertThat(joe.equals(nathalie)).isFalse();
     }
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
index 0a4d0dd8d3..42d3a606a0 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
@@ -1,18 +1,11 @@
 package com.baeldung.comparing;
 
 import com.google.common.base.Objects;
-import com.google.common.base.Strings;
 import com.google.common.collect.ComparisonChain;
-import com.google.common.primitives.Booleans;
-import com.google.common.primitives.Bytes;
 import com.google.common.primitives.Ints;
-import com.google.common.primitives.Shorts;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static org.assertj.core.api.Assertions.assertThat;
 
 class GuavaUnitTest {
@@ -66,8 +59,8 @@ class GuavaUnitTest {
     class ComparisonChainClass {
         @Test
         void givenTwoPersonWithEquals_whenComparisonChainByLastNameThenFirstName_thenSortedJoeFirstAndNathalieSecond() {
-            Person.PersonWithEquals nathalie = new Person.PersonWithEquals("Nathalie", "Portman");
-            Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+            PersonWithEquals nathalie = new PersonWithEquals("Nathalie", "Portman");
+            PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
 
             int comparisonResult = ComparisonChain.start()
               .compare(nathalie.lastName(), joe.lastName())
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
index c26cb4e08c..0e24305d87 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
@@ -10,40 +10,40 @@ class ObjectsEqualsStaticMethodUnitTest {
 
     @Test
     void givenTwoPersonWithEqualsWithSameNames_whenObjectsEquals_thenTrue() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals joeAgain = new Person.PersonWithEquals("Joe", "Portman");
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals joeAgain = new PersonWithEquals("Joe", "Portman");
 
         assertThat(Objects.equals(joe, joeAgain)).isTrue();
     }
 
     @Test
     void givenTwoPersonWithEqualsWithDifferentNames_whenObjectsEquals_thenFalse() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals nathalie = new Person.PersonWithEquals("Nathalie", "Portman");
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals nathalie = new PersonWithEquals("Nathalie", "Portman");
 
         assertThat(Objects.equals(joe, nathalie)).isFalse();
     }
 
     @Test
     void givenTwoPersonWithEqualsFirstNull_whenObjectsEquals_thenFalse() {
-        Person.PersonWithEquals nobody = null;
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
+        PersonWithEquals nobody = null;
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
 
         assertThat(Objects.equals(nobody, joe)).isFalse();
     }
 
     @Test
     void givenTwoObjectsSecondtNull_whenObjectsEquals_thenFalse() {
-        Person.PersonWithEquals joe = new Person.PersonWithEquals("Joe", "Portman");
-        Person.PersonWithEquals nobody = null;
+        PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
+        PersonWithEquals nobody = null;
 
         assertThat(Objects.equals(joe, nobody)).isFalse();
     }
 
     @Test
     void givenTwoObjectsNull_whenObjectsEquals_thenTrue() {
-        Person.PersonWithEquals nobody = null;
-        Person.PersonWithEquals nobodyAgain = null;
+        PersonWithEquals nobody = null;
+        PersonWithEquals nobodyAgain = null;
 
         assertThat(Objects.equals(nobody, nobodyAgain)).isTrue();
     }

From a990d574074ca020cd1cbb1ae97668e5bfb76537 Mon Sep 17 00:00:00 2001
From: dupirefr <dupire.francois+pro@gmail.com>
Date: Wed, 20 May 2020 23:33:04 +0200
Subject: [PATCH 376/404] [BAEL-3981] Fixes from Josh's review

* Upgraded Apache Commons to 3.10

* Replaced Nathalie by Natalie
---
 core-java-modules/core-java-lang-2/pom.xml                | 2 +-
 .../java/com/baeldung/comparing/EqualsMethodUnitTest.java | 4 ++--
 .../test/java/com/baeldung/comparing/GuavaUnitTest.java   | 8 ++++----
 .../comparing/ObjectsEqualsStaticMethodUnitTest.java      | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
index 449b700560..21a63d8091 100644
--- a/core-java-modules/core-java-lang-2/pom.xml
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -70,7 +70,7 @@
         <jmh-generator.version>1.19</jmh-generator.version>
         <assertj.version>3.12.2</assertj.version>
         <commons.beanutils.version>1.9.4</commons.beanutils.version>
-        <commons-lang3.version>3.9</commons-lang3.version>
+        <commons-lang3.version>3.10</commons-lang3.version>
         <guava.version>29.0-jre</guava.version>
     </properties>
 
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
index 6ae243c0ff..a69ac38916 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/EqualsMethodUnitTest.java
@@ -66,8 +66,8 @@ class EqualsMethodUnitTest {
     @Test
     void givenTwoPersonWittEqualsWithDifferentNames_whenEquals_thenFalse() {
         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
-        PersonWithEquals nathalie = new PersonWithEquals("Nathalie", "Portman");
+        PersonWithEquals natalie = new PersonWithEquals("Natalie", "Portman");
 
-        assertThat(joe.equals(nathalie)).isFalse();
+        assertThat(joe.equals(natalie)).isFalse();
     }
 }
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
index 42d3a606a0..5c8591e134 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/GuavaUnitTest.java
@@ -58,13 +58,13 @@ class GuavaUnitTest {
     @Nested
     class ComparisonChainClass {
         @Test
-        void givenTwoPersonWithEquals_whenComparisonChainByLastNameThenFirstName_thenSortedJoeFirstAndNathalieSecond() {
-            PersonWithEquals nathalie = new PersonWithEquals("Nathalie", "Portman");
+        void givenTwoPersonWithEquals_whenComparisonChainByLastNameThenFirstName_thenSortedJoeFirstAndNatalieSecond() {
+            PersonWithEquals natalie = new PersonWithEquals("Natalie", "Portman");
             PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
 
             int comparisonResult = ComparisonChain.start()
-              .compare(nathalie.lastName(), joe.lastName())
-              .compare(nathalie.firstName(), joe.firstName())
+              .compare(natalie.lastName(), joe.lastName())
+              .compare(natalie.firstName(), joe.firstName())
               .result();
 
             assertThat(comparisonResult).isPositive();
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
index 0e24305d87..5ac89da2be 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparing/ObjectsEqualsStaticMethodUnitTest.java
@@ -19,9 +19,9 @@ class ObjectsEqualsStaticMethodUnitTest {
     @Test
     void givenTwoPersonWithEqualsWithDifferentNames_whenObjectsEquals_thenFalse() {
         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman");
-        PersonWithEquals nathalie = new PersonWithEquals("Nathalie", "Portman");
+        PersonWithEquals natalie = new PersonWithEquals("Natalie", "Portman");
 
-        assertThat(Objects.equals(joe, nathalie)).isFalse();
+        assertThat(Objects.equals(joe, natalie)).isFalse();
     }
 
     @Test

From 6eaf9840a0305d524822928753df6415ed2b441f Mon Sep 17 00:00:00 2001
From: mikr <michael.krimgen@ximedes.com>
Date: Thu, 21 May 2020 12:08:11 +0200
Subject: [PATCH 377/404] BAEL-1524 Change http into https

---
 persistence-modules/spring-boot-persistence-2/README.md | 2 +-
 persistence-modules/spring-boot-persistence/README.MD   | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md
index e0479ffe10..392218d2bf 100644
--- a/persistence-modules/spring-boot-persistence-2/README.md
+++ b/persistence-modules/spring-boot-persistence-2/README.md
@@ -3,6 +3,6 @@
 - [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi)
 - [Configuring a Tomcat Connection Pool in Spring Boot](https://www.baeldung.com/spring-boot-tomcat-connection-pool)
 - [Integrating Spring Boot with HSQLDB](https://www.baeldung.com/spring-boot-hsqldb)
-- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases)
+- [List of In-Memory Databases](https://www.baeldung.com/java-in-memory-databases)
 - [Oracle Connection Pooling With Spring](https://www.baeldung.com/spring-oracle-connection-pooling)
 - More articles: [[<-- prev]](../spring-boot-persistence)
diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD
index d6ef239448..5b9fbf7b79 100644
--- a/persistence-modules/spring-boot-persistence/README.MD
+++ b/persistence-modules/spring-boot-persistence/README.MD
@@ -1,8 +1,8 @@
 ### Relevant Articles:
 
-- [Spring Boot with Multiple SQL Import Files](http://www.baeldung.com/spring-boot-sql-import-files)
-- [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source)
-- [Quick Guide on Loading Initial Data with Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql)
+- [Spring Boot with Multiple SQL Import Files](https://www.baeldung.com/spring-boot-sql-import-files)
+- [Configuring Separate Spring DataSource for Tests](https://www.baeldung.com/spring-testing-separate-data-source)
+- [Quick Guide on Loading Initial Data with Spring Boot](https://www.baeldung.com/spring-boot-data-sql-and-schema-sql)
 - [Configuring a DataSource Programmatically in Spring Boot](https://www.baeldung.com/spring-boot-configure-data-source-programmatic)
 - [Resolving “Failed to Configure a DataSource” Error](https://www.baeldung.com/spring-boot-failed-to-configure-data-source)
 - [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot)

From dd0a8e2d11ff2d80acb22c4848c86d6f0cae247b Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Thu, 21 May 2020 17:36:25 +0530
Subject: [PATCH 378/404] add tests

---
 .../interceptor/RateLimitInterceptor.java     |  6 +-
 .../bucket4japp/service/PricingPlan.java      | 42 ++++++-------
 ...4jBootStarterRateLimitIntegrationTest.java | 63 +++++++++++++++++++
 .../Bucket4jRateLimitIntegrationTest.java     | 62 ++++++++++++++++++
 .../bucket4japp}/Bucket4jUsageUnitTest.java   |  2 +-
 .../PricingPlanServiceUnitTest.java           | 36 +++++++++++
 6 files changed, 184 insertions(+), 27 deletions(-)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jBootStarterRateLimitIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java
 rename spring-boot-modules/spring-boot-libraries/src/test/java/com/{baledung/ratelimiting/bucket4j => baeldung/ratelimiting/bucket4japp}/Bucket4jUsageUnitTest.java (98%)
 create mode 100644 spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/PricingPlanServiceUnitTest.java

diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
index d919214983..8a18d6c2b5 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/interceptor/RateLimitInterceptor.java
@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 
@@ -44,10 +45,11 @@ public class RateLimitInterceptor implements HandlerInterceptor {
 
         } else {
 
-            long waitForRefill = probe.getNanosToWaitForRefill() % 1_000_000_000;
+            long waitForRefill = probe.getNanosToWaitForRefill() / 1_000_000_000;
 
-            response.sendError(HttpStatus.TOO_MANY_REQUESTS.value(), "You have exhausted your API Request Quota"); // 429
+            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
             response.addHeader(HEADER_RETRY_AFTER, String.valueOf(waitForRefill));
+            response.sendError(HttpStatus.TOO_MANY_REQUESTS.value(), "You have exhausted your API Request Quota"); // 429
 
             return false;
         }
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
index e8b5513e8b..2f225a83aa 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
@@ -5,34 +5,28 @@ import java.time.Duration;
 import io.github.bucket4j.Bandwidth;
 import io.github.bucket4j.Refill;
 
-enum PricingPlan {
+public enum PricingPlan {
 
-    FREE {
+    FREE(20),
 
-        @Override
-        Bandwidth getLimit() {
-            return Bandwidth.classic(20, Refill.intervally(20, Duration.ofHours(1)));
-        }
-    },
+    BASIC(40),
 
-    BASIC {
-
-        @Override
-        Bandwidth getLimit() {
-            return Bandwidth.classic(40, Refill.intervally(40, Duration.ofHours(1)));
-        }
-    },
-
-    PROFESSIONAL {
-
-        @Override
-        Bandwidth getLimit() {
-            return Bandwidth.classic(100, Refill.intervally(100, Duration.ofHours(1)));
-        }
-    };
-
-    abstract Bandwidth getLimit();
+    PROFESSIONAL(100);;
 
+    private int bucketCapacity;
+    
+    private PricingPlan(int bucketCapacity) {
+        this.bucketCapacity = bucketCapacity;
+    }
+    
+    Bandwidth getLimit() {
+        return Bandwidth.classic(bucketCapacity, Refill.intervally(bucketCapacity, Duration.ofHours(1)));
+    }
+    
+    public int bucketCapacity() {
+        return bucketCapacity;
+    }
+    
     static PricingPlan resolvePlanFromApiKey(String apiKey) {
         if (apiKey == null || apiKey.isEmpty()) {
             return FREE;
diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jBootStarterRateLimitIntegrationTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jBootStarterRateLimitIntegrationTest.java
new file mode 100644
index 0000000000..d93e61988b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bootstarterapp/Bucket4jBootStarterRateLimitIntegrationTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.ratelimiting.bootstarterapp;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.RequestBuilder;
+
+import com.baeldung.ratelimiting.bucket4japp.service.PricingPlan;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Bucket4jRateLimitApp.class)
+@TestPropertySource(properties = "spring.config.location=classpath:ratelimiting/application-bucket4j-starter.yml")
+@AutoConfigureMockMvc
+public class Bucket4jBootStarterRateLimitIntegrationTest {
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Test
+    public void givenTriangleAreaCalculator_whenRequestsWithinRateLimit_thenAccepted() throws Exception {
+
+        RequestBuilder request = post("/api/v1/area/triangle").contentType(MediaType.APPLICATION_JSON_VALUE)
+            .content("{ \"height\": 8, \"base\": 10 }")
+            .header("X-api-key", "FX001-UBSZ5YRYQ");
+
+        for (int i = 1; i <= PricingPlan.FREE.bucketCapacity(); i++) {
+            mockMvc.perform(request)
+                .andExpect(status().isOk())
+                .andExpect(header().exists("X-Rate-Limit-Remaining"))
+                .andExpect(jsonPath("$.shape", equalTo("triangle")))
+                .andExpect(jsonPath("$.area", equalTo(40d)));
+        }
+    }
+
+    @Test
+    public void givenTriangleAreaCalculator_whenRequestRateLimitTriggered_thenRejected() throws Exception {
+
+        RequestBuilder request = post("/api/v1/area/triangle").contentType(MediaType.APPLICATION_JSON_VALUE)
+            .content("{ \"height\": 8, \"base\": 10 }")
+            .header("X-api-key", "FX001-ZBSY6YSLP");
+
+        for (int i = 1; i <= PricingPlan.FREE.bucketCapacity(); i++) {
+            mockMvc.perform(request); // exhaust limit
+        }
+
+        mockMvc.perform(request)
+            .andExpect(status().isTooManyRequests())
+            .andExpect(jsonPath("$.message", equalTo("You have exhausted your API Request Quota")))
+            .andExpect(header().exists("X-Rate-Limit-Retry-After-Seconds"));
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java
new file mode 100644
index 0000000000..b410b7b2c5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.ratelimiting.bucket4japp;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.RequestBuilder;
+
+import com.baeldung.ratelimiting.bucket4japp.service.PricingPlan;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Bucket4jRateLimitApp.class)
+@AutoConfigureMockMvc
+public class Bucket4jRateLimitIntegrationTest {
+
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Test
+    public void givenRectangleAreaCalculator_whenRequestsWithinRateLimit_thenAccepted() throws Exception {
+
+        RequestBuilder request = post("/api/v1/area/rectangle").contentType(MediaType.APPLICATION_JSON_VALUE)
+            .content("{ \"length\": 12, \"width\": 10 }")
+            .header("X-api-key", "FX001-UBSZ5YRYQ");
+
+        for (int i = 1; i <= PricingPlan.FREE.bucketCapacity(); i++) {
+            mockMvc.perform(request)
+                .andExpect(status().isOk())
+                .andExpect(header().exists("X-Rate-Limit-Remaining"))
+                .andExpect(jsonPath("$.shape", equalTo("rectangle")))
+                .andExpect(jsonPath("$.area", equalTo(120d)));
+        }
+    }
+
+    @Test
+    public void givenReactangleAreaCalculator_whenRequestRateLimitTriggered_thenRejected() throws Exception {
+
+        RequestBuilder request = post("/api/v1/area/rectangle").contentType(MediaType.APPLICATION_JSON_VALUE)
+            .content("{ \"length\": 12, \"width\": 10 }")
+            .header("X-api-key", "FX001-ZBSY6YSLP");
+
+        for (int i = 1; i <= PricingPlan.FREE.bucketCapacity(); i++) {
+            mockMvc.perform(request); // exhaust limit
+        }
+
+        mockMvc.perform(request)
+            .andExpect(status().isTooManyRequests())
+            .andExpect(status().reason("You have exhausted your API Request Quota"))
+            .andExpect(header().exists("X-Rate-Limit-Retry-After-Seconds"));
+    }
+}
diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageUnitTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java
similarity index 98%
rename from spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageUnitTest.java
rename to spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java
index e6b774034e..fbf63ba403 100644
--- a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baledung/ratelimiting/bucket4j/Bucket4jUsageUnitTest.java
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java
@@ -1,4 +1,4 @@
-package com.baledung.ratelimiting.bucket4j;
+package com.baeldung.ratelimiting.bucket4japp;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/PricingPlanServiceUnitTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/PricingPlanServiceUnitTest.java
new file mode 100644
index 0000000000..325b898779
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/PricingPlanServiceUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.ratelimiting.bucket4japp;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.ratelimiting.bucket4japp.service.PricingPlan;
+import com.baeldung.ratelimiting.bucket4japp.service.PricingPlanService;
+
+import io.github.bucket4j.Bucket;
+
+public class PricingPlanServiceUnitTest {
+
+    private PricingPlanService service = new PricingPlanService();
+
+    @Test
+    public void givenAPIKey_whenFreePlan_thenReturnFreePlanBucket() {
+        Bucket bucket = service.resolveBucket("FX001-UBSZ5YRYQ");
+
+        assertEquals(PricingPlan.FREE.bucketCapacity(), bucket.getAvailableTokens());
+    }
+
+    @Test
+    public void givenAPIKey_whenBasiclan_thenReturnBasicPlanBucket() {
+        Bucket bucket = service.resolveBucket("BX001-MBSZ5YRYP");
+
+        assertEquals(PricingPlan.BASIC.bucketCapacity(), bucket.getAvailableTokens());
+    }
+
+    @Test
+    public void givenAPIKey_whenProfessionalPlan_thenReturnProfessionalPlanBucket() {
+        Bucket bucket = service.resolveBucket("PX001-NBSZ5YRYY");
+
+        assertEquals(PricingPlan.PROFESSIONAL.bucketCapacity(), bucket.getAvailableTokens());
+    }
+}

From 92c446ce4cc444f865ef4bd53b8876344647ba68 Mon Sep 17 00:00:00 2001
From: Ali Dehghani <ali.dehghani.g@gmail.com>
Date: Thu, 21 May 2020 21:25:37 +0430
Subject: [PATCH 379/404] Adding Super Type Token

---
 .../com/baeldung/supertype/TypeReference.java | 18 ++++++++++++++
 .../supertype/TypeReferenceUnitTest.java      | 24 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/supertype/TypeReference.java
 create mode 100644 core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/supertype/TypeReferenceUnitTest.java

diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/supertype/TypeReference.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/supertype/TypeReference.java
new file mode 100644
index 0000000000..2021f42239
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/supertype/TypeReference.java
@@ -0,0 +1,18 @@
+package com.baeldung.supertype;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+public abstract class TypeReference<T> {
+
+    private final Type type;
+
+    public TypeReference() {
+        Type superclass = getClass().getGenericSuperclass();
+        type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
+    }
+
+    public Type getType() {
+        return type;
+    }
+}
diff --git a/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/supertype/TypeReferenceUnitTest.java b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/supertype/TypeReferenceUnitTest.java
new file mode 100644
index 0000000000..24e3b698e2
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/supertype/TypeReferenceUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.supertype;
+
+import org.junit.Test;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class TypeReferenceUnitTest {
+
+    @Test
+    public void givenGenericToken_whenUsingSuperTypeToken_thenPreservesTheTypeInfo() {
+        TypeReference<Map<String, Integer>> token = new TypeReference<Map<String, Integer>>() {};
+        Type type = token.getType();
+
+        assertEquals("java.util.Map<java.lang.String, java.lang.Integer>", type.getTypeName());
+
+        Type[] typeArguments = ((ParameterizedType) type).getActualTypeArguments();
+        assertEquals("java.lang.String", typeArguments[0].getTypeName());
+        assertEquals("java.lang.Integer", typeArguments[1].getTypeName());
+    }
+}

From 8ecf039b6b539ae626c93e8e4aa7b30b13b55e98 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Thu, 21 May 2020 22:53:20 +0530
Subject: [PATCH 380/404] remove unused import

---
 .../bucket4japp/Bucket4jRateLimitIntegrationTest.java            | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java
index b410b7b2c5..20f57a7021 100644
--- a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jRateLimitIntegrationTest.java
@@ -11,7 +11,6 @@ import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 import org.springframework.http.MediaType;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;

From e8531ef7c289ac94d92861bedfdd35d663bb1a7b Mon Sep 17 00:00:00 2001
From: sampadawagde <sampada.wagde@gmail.com>
Date: Fri, 22 May 2020 12:08:56 +0530
Subject: [PATCH 381/404] JAVA-939: Migrate spring-data-rest-querydsl to
 parent-boot-2

---
 spring-data-rest-querydsl/pom.xml                             | 4 ++--
 .../com/baeldung/controller/repository/AddressRepository.java | 4 ++--
 .../com/baeldung/controller/repository/UserRepository.java    | 4 ++--
 .../com/baeldung/springdatarestquerydsl/IntegrationTest.java  | 4 +---
 .../springdatarestquerydsl/QuerydslIntegrationTest.java       | 4 +---
 5 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/spring-data-rest-querydsl/pom.xml b/spring-data-rest-querydsl/pom.xml
index c0ad43fe0b..5e47f4979e 100644
--- a/spring-data-rest-querydsl/pom.xml
+++ b/spring-data-rest-querydsl/pom.xml
@@ -9,9 +9,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../parent-boot-1</relativePath>
+        <relativePath>../parent-boot-2</relativePath>
     </parent>
 
     <dependencies>
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java
index 2e88820c98..476a11ea6b 100644
--- a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/AddressRepository.java
@@ -5,13 +5,13 @@ import com.baeldung.entity.QAddress;
 import com.querydsl.core.types.dsl.StringExpression;
 import com.querydsl.core.types.dsl.StringPath;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.querydsl.QueryDslPredicateExecutor;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
 import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
 import org.springframework.data.querydsl.binding.QuerydslBindings;
 import org.springframework.data.querydsl.binding.SingleValueBinding;
 
 public interface AddressRepository
-        extends JpaRepository<Address, Long>, QueryDslPredicateExecutor<Address>, QuerydslBinderCustomizer<QAddress> {
+        extends JpaRepository<Address, Long>, QuerydslPredicateExecutor<Address>, QuerydslBinderCustomizer<QAddress> {
     @Override
     default void customize(final QuerydslBindings bindings, final QAddress root) {
         bindings.bind(String.class).first((SingleValueBinding<StringPath, String>) StringExpression::eq);
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java
index 98ff2ac5e3..b5f32b3624 100644
--- a/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java
+++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/controller/repository/UserRepository.java
@@ -5,13 +5,13 @@ import com.baeldung.entity.User;
 import com.querydsl.core.types.dsl.StringExpression;
 import com.querydsl.core.types.dsl.StringPath;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.querydsl.QueryDslPredicateExecutor;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
 import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
 import org.springframework.data.querydsl.binding.QuerydslBindings;
 import org.springframework.data.querydsl.binding.SingleValueBinding;
 
 public interface UserRepository
-        extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User>, QuerydslBinderCustomizer<QUser> {
+        extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User>, QuerydslBinderCustomizer<QUser> {
     @Override
     default void customize(final QuerydslBindings bindings, final QUser root) {
         bindings.bind(String.class).first((SingleValueBinding<StringPath, String>) StringExpression::eq);
diff --git a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java b/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java
index 2d3dbc4c74..ad19c441b6 100644
--- a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java
+++ b/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/IntegrationTest.java
@@ -13,8 +13,6 @@ import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 
-import java.nio.charset.Charset;
-
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -24,7 +22,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 public class IntegrationTest {
 
     final MediaType contentType =
-            new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
+            new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype());
 
     @Autowired private WebApplicationContext webApplicationContext;
 
diff --git a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java b/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java
index 11e5ffca05..768d28347b 100644
--- a/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java
+++ b/spring-data-rest-querydsl/src/test/java/com/baeldung/springdatarestquerydsl/QuerydslIntegrationTest.java
@@ -13,8 +13,6 @@ import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 
-import java.nio.charset.Charset;
-
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -26,7 +24,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 public class QuerydslIntegrationTest {
 
     final MediaType contentType =
-            new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
+            new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype());
 
     @Autowired
     private WebApplicationContext webApplicationContext;

From 7bc1633c7283930e3ee981db534e4c78347ce407 Mon Sep 17 00:00:00 2001
From: Josh Cummings <josh.cummings@gmail.com>
Date: Fri, 22 May 2020 07:40:59 -0600
Subject: [PATCH 382/404] Create README.md

Issue BAEL-4009
---
 patterns/cqrs-es/README.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 patterns/cqrs-es/README.md

diff --git a/patterns/cqrs-es/README.md b/patterns/cqrs-es/README.md
new file mode 100644
index 0000000000..92570280ab
--- /dev/null
+++ b/patterns/cqrs-es/README.md
@@ -0,0 +1,5 @@
+This module contains articles about composing together CQRS and Event Sourcing
+
+## Relevant Articles
+
+- [CQRS and Event Sourcing in Java](https://www.baeldung.com/cqrs-event-sourcing-java)

From d5a03e4c032360082d8ea5c0ba4425dceb362741 Mon Sep 17 00:00:00 2001
From: Josh Cummings <josh.cummings@gmail.com>
Date: Sat, 23 May 2020 08:26:13 -0600
Subject: [PATCH 383/404] Update README.md

Issue CS-144
---
 core-java-modules/core-java-concurrency-advanced-3/README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/core-java-modules/core-java-concurrency-advanced-3/README.md b/core-java-modules/core-java-concurrency-advanced-3/README.md
index dfd264116c..e33b6ab692 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/README.md
+++ b/core-java-modules/core-java-concurrency-advanced-3/README.md
@@ -12,4 +12,5 @@ This module contains articles about advanced topics about multithreading with co
 - [Asynchronous Programming in Java](https://www.baeldung.com/java-asynchronous-programming)
 - [Java Thread Deadlock and Livelock](https://www.baeldung.com/java-deadlock-livelock)
 - [Guide to AtomicStampedReference in Java](https://www.baeldung.com/java-atomicstampedreference)
+- [The ABA Problem in Concurrency](https://www.baeldung.com/cs/aba-concurrency)
 - [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2)

From f48582cfe1b929a16039dca62090b2ac0a872f69 Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Sat, 23 May 2020 19:55:53 +0200
Subject: [PATCH 384/404] BAEL-4079: Add Oracle dependencies (#9338)

---
 .../spring-boot-persistence-2/pom.xml         | 34 +++++++++----------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index 33b33d7160..f36d8fc43f 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -120,6 +120,22 @@
             <groupId>org.hsqldb</groupId>
             <artifactId>hsqldb</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+            <version>${oracle-database.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.oracle.database.ha</groupId>
+            <artifactId>ons</artifactId>
+            <version>${oracle-database.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ucp</artifactId>
+            <version>${oracle-database.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -128,23 +144,6 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
-            <!-- Please note that ojdbc8.jar, ucp.jar and ons.jar dependencies 
-                are needed for OracleConfiguration.java, OracleUCPConfiguration.java, SpringOraclePoolingApplicationOracleLiveTest.java 
-                and SpringOraclePoolingApplicationOracleUCPLiveTest.java -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java</exclude>
-                        <exclude>com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java</exclude>
-                    </excludes>
-                    <testExcludes>
-                        <testExclude>com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleLiveTest.java</testExclude>
-                        <testExclude>com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java</testExclude>
-                    </testExcludes>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
 
@@ -152,6 +151,7 @@
         <jdbi.version>3.9.1</jdbi.version>
         <spring.boot.dependencies>2.1.8.RELEASE</spring.boot.dependencies>
         <c3p0.version>0.9.5.2</c3p0.version>
+        <oracle-database.version>19.6.0.0</oracle-database.version>
     </properties>
 
 </project>

From d76966dab73c71c540d56262c9d0b58a60748ab5 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Sun, 24 May 2020 16:53:24 +0530
Subject: [PATCH 385/404] review comments - indentation in pom

---
 .../spring-boot-libraries/pom.xml             | 244 +++++++++---------
 .../bucket4japp/service/PricingPlan.java      |   2 +-
 2 files changed, 123 insertions(+), 123 deletions(-)

diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml
index 36b9ec17c9..da4e979c17 100644
--- a/spring-boot-modules/spring-boot-libraries/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries/pom.xml
@@ -88,34 +88,34 @@
             <version>${zxing.version}</version>
         </dependency>
 		<!-- Bucket4j -->
-		<dependency>
-			<groupId>com.github.vladimir-bukhtoyarov</groupId>
-			<artifactId>bucket4j-core</artifactId>
-			<version>${bucket4j.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>com.giffing.bucket4j.spring.boot.starter</groupId>
-			<artifactId>bucket4j-spring-boot-starter</artifactId>
-			<version>${bucket4j-spring-boot-starter.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-cache</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>javax.cache</groupId>
-			<artifactId>cache-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.ben-manes.caffeine</groupId>
-			<artifactId>caffeine</artifactId>
-			<version>${caffeine.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>com.github.ben-manes.caffeine</groupId>
-			<artifactId>jcache</artifactId>
-			<version>${caffeine.version}</version>
-		</dependency>
+        <dependency>
+            <groupId>com.github.vladimir-bukhtoyarov</groupId>
+            <artifactId>bucket4j-core</artifactId>
+            <version>${bucket4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.giffing.bucket4j.spring.boot.starter</groupId>
+            <artifactId>bucket4j-spring-boot-starter</artifactId>
+            <version>${bucket4j-spring-boot-starter.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+            </dependency>
+        <dependency>
+            <groupId>javax.cache</groupId>
+            <artifactId>cache-api</artifactId>
+            </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>${caffeine.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>jcache</artifactId>
+            <version>${caffeine.version}</version>
+        </dependency>
     </dependencies>
 
     <repositories>
@@ -125,112 +125,112 @@
         </repository>
     </repositories>
 
-	<build>
-		<finalName>spring-boot-libraries</finalName>
-		<resources>
-			<resource>
-				<directory>src/main/resources</directory>
-				<filtering>true</filtering>
-			</resource>
-		</resources>
+    <build>
+        <finalName>spring-boot-libraries</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
 
-		<plugins>
+        <plugins>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-war-plugin</artifactId>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+            </plugin>
 
-			<plugin>
-				<groupId>pl.project13.maven</groupId>
-				<artifactId>git-commit-id-plugin</artifactId>
-				<version>${git-commit-id-plugin.version}</version>
-				<executions>
-					<execution>
-						<id>get-the-git-infos</id>
-						<goals>
-							<goal>revision</goal>
-						</goals>
-						<phase>initialize</phase>
-					</execution>
-					<execution>
-						<id>validate-the-git-infos</id>
-						<goals>
-							<goal>validateRevision</goal>
-						</goals>
-						<phase>package</phase>
-					</execution>
-				</executions>
-				<configuration>
-					<generateGitPropertiesFile>true</generateGitPropertiesFile>
-					<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
-				</configuration>
-			</plugin>
+            <plugin>
+                <groupId>pl.project13.maven</groupId>
+                <artifactId>git-commit-id-plugin</artifactId>
+                <version>${git-commit-id-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <id>get-the-git-infos</id>
+                        <goals>
+                            <goal>revision</goal>
+                        </goals>
+                        <phase>initialize</phase>
+                    </execution>
+                    <execution>
+                        <id>validate-the-git-infos</id>
+                        <goals>
+                            <goal>validateRevision</goal>
+                        </goals>
+                        <phase>package</phase>
+                    </execution>
+                </executions>
+                <configuration>
+                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
+                    <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
+                </configuration>
+            </plugin>
 
         </plugins>
 
     </build>
 
-	<profiles>
-		<profile>
-			<id>autoconfiguration</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-surefire-plugin</artifactId>
-						<executions>
-							<execution>
-								<phase>integration-test</phase>
-								<goals>
-									<goal>test</goal>
-								</goals>
-								<configuration>
-									<excludes>
-										<exclude>**/*LiveTest.java</exclude>
-										<exclude>**/*IntegrationTest.java</exclude>
-										<exclude>**/*IntTest.java</exclude>
-									</excludes>
-									<includes>
-										<include>**/AutoconfigurationTest.java</include>
-									</includes>
-								</configuration>
-							</execution>
-						</executions>
-						<configuration>
-							<systemPropertyVariables>
-								<test.mime>json</test.mime>
-							</systemPropertyVariables>
-						</configuration>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
+    <profiles>
+        <profile>
+            <id>autoconfiguration</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <excludes>
+                                        <exclude>**/*LiveTest.java</exclude>
+                                        <exclude>**/*IntegrationTest.java</exclude>
+                                        <exclude>**/*IntTest.java</exclude>
+                                    </excludes>
+                                    <includes>
+                                        <include>**/AutoconfigurationTest.java</include>
+                                    </includes>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <systemPropertyVariables>
+                                <test.mime>json</test.mime>
+                            </systemPropertyVariables>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 
-	<properties>
-		<!-- The main class to start by executing java -jar -->
+    <properties>
+        <!-- The main class to start by executing java -jar -->
         <start-class>com.baeldung.intro.App</start-class>
         <tomee-servlet-api.version>8.5.11</tomee-servlet-api.version>
         <togglz.version>2.4.1.Final</togglz.version>
         <rome.version>1.9.0</rome.version>
         <chaos.monkey.version>2.0.0</chaos.monkey.version>
-		<graphql-spring-boot-starter.version>5.0.2</graphql-spring-boot-starter.version>
-		<graphiql-spring-boot-starter.version>5.0.2</graphiql-spring-boot-starter.version>
-		<graphql-java-tools.version>5.2.4</graphql-java-tools.version>
-		<guava.version>18.0</guava.version>
-		<git-commit-id-plugin.version>2.2.4</git-commit-id-plugin.version>
-		<modelmapper.version>2.3.2</modelmapper.version>
-		<problem-spring-web.version>0.23.0</problem-spring-web.version>
-		<h2.version>1.4.200</h2.version>
-		<shedlock.version>2.1.0</shedlock.version>
-		<barbecue.version>1.5-beta1</barbecue.version>
-		<barcode4j.version>2.1</barcode4j.version>
-		<qrgen.version>2.6.0</qrgen.version>
-		<zxing.version>3.3.0</zxing.version>
-		<bucket4j.version>4.10.0</bucket4j.version>
-		<bucket4j-spring-boot-starter.version>0.2.0</bucket4j-spring-boot-starter.version>
-		<caffeine.version>2.8.2</caffeine.version>
-	</properties>
+        <graphql-spring-boot-starter.version>5.0.2</graphql-spring-boot-starter.version>
+        <graphiql-spring-boot-starter.version>5.0.2</graphiql-spring-boot-starter.version>
+        <graphql-java-tools.version>5.2.4</graphql-java-tools.version>
+        <guava.version>18.0</guava.version>
+        <git-commit-id-plugin.version>2.2.4</git-commit-id-plugin.version>
+        <modelmapper.version>2.3.2</modelmapper.version>
+        <problem-spring-web.version>0.23.0</problem-spring-web.version>
+        <h2.version>1.4.200</h2.version>
+        <shedlock.version>2.1.0</shedlock.version>
+        <barbecue.version>1.5-beta1</barbecue.version>
+        <barcode4j.version>2.1</barcode4j.version>
+        <qrgen.version>2.6.0</qrgen.version>
+        <zxing.version>3.3.0</zxing.version>
+        <bucket4j.version>4.10.0</bucket4j.version>
+        <bucket4j-spring-boot-starter.version>0.2.0</bucket4j-spring-boot-starter.version>
+        <caffeine.version>2.8.2</caffeine.version>
+    </properties>
 
-</project>
+</project>
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
index 2f225a83aa..27c30ba3a0 100644
--- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
+++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlan.java
@@ -11,7 +11,7 @@ public enum PricingPlan {
 
     BASIC(40),
 
-    PROFESSIONAL(100);;
+    PROFESSIONAL(100);
 
     private int bucketCapacity;
     

From b7c9e649825fee3377c07cf9cdbbec77e591e84c Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Sun, 24 May 2020 16:55:06 +0530
Subject: [PATCH 386/404] review comments - indentation in pom

---
 spring-boot-modules/spring-boot-libraries/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml
index da4e979c17..4e7fd205d5 100644
--- a/spring-boot-modules/spring-boot-libraries/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries/pom.xml
@@ -233,4 +233,4 @@
         <caffeine.version>2.8.2</caffeine.version>
     </properties>
 
-</project>
\ No newline at end of file
+</project>

From e839798f0da0d2e598f64c5d20bba6973428ba41 Mon Sep 17 00:00:00 2001
From: priyank-sriv <priyank.srivastava@appdirect.com>
Date: Sun, 24 May 2020 16:56:57 +0530
Subject: [PATCH 387/404] review comments - indentation in pom

---
 spring-boot-modules/spring-boot-libraries/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml
index 4e7fd205d5..189eb4cf1a 100644
--- a/spring-boot-modules/spring-boot-libraries/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries/pom.xml
@@ -87,7 +87,7 @@
             <artifactId>javase</artifactId>
             <version>${zxing.version}</version>
         </dependency>
-		<!-- Bucket4j -->
+        <!-- Bucket4j -->
         <dependency>
             <groupId>com.github.vladimir-bukhtoyarov</groupId>
             <artifactId>bucket4j-core</artifactId>

From 21d03e3e74691ee27092cc2c127e9c5c9c26a579 Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 24 May 2020 17:41:17 +0530
Subject: [PATCH 388/404] updated keyclock to latest version

---
 spring-boot-modules/spring-boot-keycloak/pom.xml | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml
index c29c1a738b..14bd1e4112 100644
--- a/spring-boot-modules/spring-boot-keycloak/pom.xml
+++ b/spring-boot-modules/spring-boot-keycloak/pom.xml
@@ -11,9 +11,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-boot-1</artifactId>
+        <artifactId>parent-boot-2</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-boot-1</relativePath>
+        <relativePath>../../parent-boot-2</relativePath>
     </parent>
 
     <dependencyManagement>
@@ -41,6 +41,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -50,6 +54,7 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
+            <version>2.3.0.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -76,7 +81,7 @@
     </build>
 
     <properties>
-        <keycloak-adapter-bom.version>3.3.0.Final</keycloak-adapter-bom.version>
+        <keycloak-adapter-bom.version>10.0.1</keycloak-adapter-bom.version>
     </properties>
 
 </project>

From 0a478423f6021159b881e499de50888448a85aab Mon Sep 17 00:00:00 2001
From: "amit.pandey" <amit.pandey2103@gmail.com>
Date: Sun, 24 May 2020 20:04:31 +0530
Subject: [PATCH 389/404] removed version from spring security

---
 spring-boot-modules/spring-boot-keycloak/pom.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml
index 14bd1e4112..8e917df2b7 100644
--- a/spring-boot-modules/spring-boot-keycloak/pom.xml
+++ b/spring-boot-modules/spring-boot-keycloak/pom.xml
@@ -54,7 +54,6 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
-            <version>2.3.0.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>

From 1fe51ed7c0d42041daac198ffe41d294a6d1b08a Mon Sep 17 00:00:00 2001
From: Sampada <46674082+sampada07@users.noreply.github.com>
Date: Sun, 24 May 2020 23:25:06 +0530
Subject: [PATCH 390/404] BAEL-3609: Improve article Documenting a Spring REST
 API Using OpenAPI (#9334)

3.0
---
 .../spring-boot-springdoc/pom.xml             | 52 +++++++++++++++++++
 .../springdoc/controller/BookController.java  | 16 +++++-
 .../java/com/baeldung/springdoc/kotlin/Foo.kt | 17 ++++++
 .../springdoc/kotlin/FooController.kt         | 30 +++++++++++
 .../src/main/resources/application.properties |  1 +
 5 files changed, 115 insertions(+), 1 deletion(-)
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt
 create mode 100644 spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt

diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml
index 1c1f27b5a5..4bede8c796 100644
--- a/spring-boot-modules/spring-boot-springdoc/pom.xml
+++ b/spring-boot-modules/spring-boot-springdoc/pom.xml
@@ -66,6 +66,22 @@
             <artifactId>spring-restdocs-restassured</artifactId>
             <scope>test</scope>
         </dependency> 
+        
+        <!--kotlin dependencies -->
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-kotlin</artifactId>
+            <version>${springdoc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-stdlib-jre8</artifactId>
+            <version>${kotlin.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-reflect</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
@@ -97,6 +113,41 @@
                     </execution>
                 </executions>
             </plugin>
+        <!-- kotlin -->
+         <plugin>
+                <artifactId>kotlin-maven-plugin</artifactId>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <version>${kotlin.version}</version>
+                <configuration>
+                    <compilerPlugins>
+                        <plugin>spring</plugin>
+                    </compilerPlugins>
+                    <jvmTarget>${java.version}</jvmTarget>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>compile</id>
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>compile</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>test-compile</id>
+                        <phase>test-compile</phase>
+                        <goals>
+                            <goal>test-compile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.jetbrains.kotlin</groupId>
+                        <artifactId>kotlin-maven-allopen</artifactId>
+                        <version>${kotlin.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
         </plugins>
         <resources>
             <resource>
@@ -116,6 +167,7 @@
         <hibernate.version>5.2.10.Final</hibernate.version>
         <springdoc.version>1.2.32</springdoc.version>
         <asciidoctor-plugin.version>1.5.6</asciidoctor-plugin.version>
+        <kotlin.version>1.2.71</kotlin.version>
         <snippetsDirectory>${project.build.directory}/generated-snippets</snippetsDirectory>
     </properties>
 
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java
index 05f8c5a946..326a97149b 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java
@@ -25,6 +25,13 @@ import com.baeldung.springdoc.exception.BookNotFoundException;
 import com.baeldung.springdoc.model.Book;
 import com.baeldung.springdoc.repository.BookRepository;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+
 @RestController
 @RequestMapping("/api/book")
 public class BookController {
@@ -32,8 +39,15 @@ public class BookController {
     @Autowired
     private BookRepository repository;
 
+    // @formatter:off
+    @Operation(summary = "Get a book by its id")
+    @ApiResponses(value = { 
+            @ApiResponse(responseCode = "200", description = "Found the book", 
+                content = { @Content(mediaType = "application/json", schema = @Schema(implementation = Book.class)) }),
+            @ApiResponse(responseCode = "400", description = "Invalid id supplied", content = @Content), 
+            @ApiResponse(responseCode = "404", description = "Book not found", content = @Content) }) // @formatter:on
     @GetMapping("/{id}")
-    public Book findById(@PathVariable long id) {
+    public Book findById(@Parameter(description = "id of book to be searched") @PathVariable long id) {
         return repository.findById(id)
             .orElseThrow(() -> new BookNotFoundException());
     }
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt
new file mode 100644
index 0000000000..3bc3c8fe61
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt
@@ -0,0 +1,17 @@
+package com.baeldung.springdoc.kotlin
+
+import javax.persistence.Entity
+import javax.persistence.GeneratedValue
+import javax.persistence.Id
+import javax.validation.constraints.NotBlank
+import javax.validation.constraints.Size
+
+@Entity
+data class Foo(
+    @Id
+    val id: Long = 0,
+		
+    @NotBlank
+    @Size(min = 0, max = 50)
+    val name: String = ""
+)
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt
new file mode 100644
index 0000000000..d3ecd6a6ba
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt
@@ -0,0 +1,30 @@
+package com.baeldung.springdoc.kotlin
+
+import io.swagger.v3.oas.annotations.Operation
+import io.swagger.v3.oas.annotations.media.ArraySchema
+import io.swagger.v3.oas.annotations.media.Content
+import io.swagger.v3.oas.annotations.media.Schema
+import io.swagger.v3.oas.annotations.responses.ApiResponse
+import io.swagger.v3.oas.annotations.responses.ApiResponses
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping("/")
+class FooController() {
+    val fooList: List<Foo> = listOf(Foo(1, "one"), Foo(2, "two"))
+
+    @Operation(summary = "Get all foos")
+    @ApiResponses(value = [
+	ApiResponse(responseCode = "200", description = "Found Foos", content = [
+	    (Content(mediaType = "application/json", array = (
+		ArraySchema(schema = Schema(implementation = Foo::class)))))]),
+	ApiResponse(responseCode = "400", description = "Bad request", content = [Content()]),
+	ApiResponse(responseCode = "404", description = "Did not find any Foos", content = [Content()])]
+    )
+    @GetMapping("/foo")
+    fun getAllFoos(): List<Foo> = fooList
+}
+
+
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
index 7debdc6503..0eecfbb1c4 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
@@ -1,5 +1,6 @@
 # custom path for swagger-ui
 springdoc.swagger-ui.path=/swagger-ui-custom.html
+springdoc.swagger-ui.operationsSorter=method
 
 # custom path for api docs
 springdoc.api-docs.path=/api-docs

From bddea5222bb03cdb266db1ba55ca91d8b4ba4de3 Mon Sep 17 00:00:00 2001
From: Bogdan Feraru <bogdan.feraru@iquestgroup.com>
Date: Sun, 10 May 2020 22:30:54 +0300
Subject: [PATCH 391/404] [BAEL-3890] Using Kafka MockConsumer

---
 libraries-data-2/pom.xml                      |   6 ++
 .../kafka/consumer/CountryPopulation.java     |  28 +++++
 .../consumer/CountryPopulationConsumer.java   |  60 +++++++++++
 .../CountryPopulationConsumerUnitTest.java    | 100 ++++++++++++++++++
 4 files changed, 194 insertions(+)
 create mode 100644 libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulation.java
 create mode 100644 libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulationConsumer.java
 create mode 100644 libraries-data-2/src/test/java/com/baeldung/kafka/consumer/CountryPopulationConsumerUnitTest.java

diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml
index cbb24edd3f..bdfb2c5ed6 100644
--- a/libraries-data-2/pom.xml
+++ b/libraries-data-2/pom.xml
@@ -121,6 +121,11 @@
             <artifactId>univocity-parsers</artifactId>
             <version>${univocity.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+            <version>${kafka.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.awaitility</groupId>
             <artifactId>awaitility</artifactId>
@@ -184,6 +189,7 @@
         <renjin.version>RELEASE</renjin.version>
         <rcaller.version>3.0</rcaller.version>
         <rserve.version>1.8.1</rserve.version>
+        <kafka.version>2.5.0</kafka.version>
     </properties>
 
     <build>
diff --git a/libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulation.java b/libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulation.java
new file mode 100644
index 0000000000..8c1351642f
--- /dev/null
+++ b/libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulation.java
@@ -0,0 +1,28 @@
+package com.baeldung.kafka.consumer;
+
+class CountryPopulation {
+
+    private String country;
+    private Integer population;
+
+    public CountryPopulation(String country, Integer population) {
+        this.country = country;
+        this.population = population;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    public Integer getPopulation() {
+        return population;
+    }
+
+    public void setPopulation(Integer population) {
+        this.population = population;
+    }
+}
\ No newline at end of file
diff --git a/libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulationConsumer.java b/libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulationConsumer.java
new file mode 100644
index 0000000000..ba4dfe6f3b
--- /dev/null
+++ b/libraries-data-2/src/main/java/com/baeldung/kafka/consumer/CountryPopulationConsumer.java
@@ -0,0 +1,60 @@
+package com.baeldung.kafka.consumer;
+
+import java.time.Duration;
+import java.util.Collections;
+import java.util.stream.StreamSupport;
+
+import org.apache.kafka.clients.consumer.Consumer;
+import org.apache.kafka.clients.consumer.ConsumerRecords;
+import org.apache.kafka.common.TopicPartition;
+import org.apache.kafka.common.errors.WakeupException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CountryPopulationConsumer {
+
+    private static Logger logger = LoggerFactory.getLogger(CountryPopulationConsumer.class);
+
+    private Consumer<String, Integer> consumer;
+    private java.util.function.Consumer<Throwable> exceptionConsumer;
+    private java.util.function.Consumer<CountryPopulation> countryPopulationConsumer;
+
+    public CountryPopulationConsumer(
+            Consumer<String, Integer> consumer, java.util.function.Consumer<Throwable> exceptionConsumer,
+            java.util.function.Consumer<CountryPopulation> countryPopulationConsumer) {
+        this.consumer = consumer;
+        this.exceptionConsumer = exceptionConsumer;
+        this.countryPopulationConsumer = countryPopulationConsumer;
+    }
+
+    void startBySubscribing(String topic) {
+        consume(() -> consumer.subscribe(Collections.singleton(topic)));
+    }
+
+    void startByAssigning(String topic, int partition) {
+        consume(() -> consumer.assign(Collections.singleton(new TopicPartition(topic, partition))));
+    }
+
+    private void consume(Runnable beforePollingTask) {
+        try {
+            beforePollingTask.run();
+            while (true) {
+                ConsumerRecords<String, Integer> records = consumer.poll(Duration.ofMillis(1000));
+                StreamSupport.stream(records.spliterator(), false)
+                    .map(record -> new CountryPopulation(record.key(), record.value()))
+                    .forEach(countryPopulationConsumer);
+                consumer.commitSync();
+            }
+        } catch (WakeupException e) {
+            logger.info("Shutting down...");
+        } catch (RuntimeException ex) {
+            exceptionConsumer.accept(ex);
+        } finally {
+            consumer.close();
+        }
+    }
+
+    public void stop() {
+        consumer.wakeup();
+    }
+}
\ No newline at end of file
diff --git a/libraries-data-2/src/test/java/com/baeldung/kafka/consumer/CountryPopulationConsumerUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/kafka/consumer/CountryPopulationConsumerUnitTest.java
new file mode 100644
index 0000000000..1b49c71716
--- /dev/null
+++ b/libraries-data-2/src/test/java/com/baeldung/kafka/consumer/CountryPopulationConsumerUnitTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.kafka.consumer;
+
+import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.clients.consumer.MockConsumer;
+import org.apache.kafka.clients.consumer.OffsetResetStrategy;
+import org.apache.kafka.common.KafkaException;
+import org.apache.kafka.common.TopicPartition;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class CountryPopulationConsumerUnitTest {
+
+    private static final String TOPIC = "topic";
+    private static final int PARTITION = 0;
+
+    private CountryPopulationConsumer countryPopulationConsumer;
+
+    private List<CountryPopulation> updates;
+    private Throwable pollException;
+
+    private MockConsumer<String, Integer> consumer;
+
+    @BeforeEach
+    void setUp() {
+        consumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
+        updates = new ArrayList<>();
+        countryPopulationConsumer = new CountryPopulationConsumer(consumer, ex -> this.pollException = ex, updates::add);
+    }
+
+    @Test
+    void whenStartingByAssigningTopicPartition_thenExpectUpdatesAreConsumedCorrectly() {
+        // GIVEN
+        consumer.schedulePollTask(() -> consumer.addRecord(record(TOPIC, PARTITION, "Romania", 19_410_000)));
+        consumer.schedulePollTask(() -> countryPopulationConsumer.stop());
+
+        HashMap<TopicPartition, Long> startOffsets = new HashMap<>();
+        TopicPartition tp = new TopicPartition(TOPIC, PARTITION);
+        startOffsets.put(tp, 0L);
+        consumer.updateBeginningOffsets(startOffsets);
+
+        // WHEN
+        countryPopulationConsumer.startByAssigning(TOPIC, PARTITION);
+
+        // THEN
+        assertThat(updates).hasSize(1);
+        assertThat(consumer.closed()).isTrue();
+    }
+
+    @Test
+    void whenStartingBySubscribingToTopic_thenExpectUpdatesAreConsumedCorrectly() {
+        // GIVEN
+        consumer.schedulePollTask(() -> {
+            consumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC, 0)));
+            consumer.addRecord(record(TOPIC, PARTITION, "Romania", 19_410_000));
+        });
+        consumer.schedulePollTask(() -> countryPopulationConsumer.stop());
+
+        HashMap<TopicPartition, Long> startOffsets = new HashMap<>();
+        TopicPartition tp = new TopicPartition(TOPIC, PARTITION);
+        startOffsets.put(tp, 0L);
+        consumer.updateBeginningOffsets(startOffsets);
+
+        // WHEN
+        countryPopulationConsumer.startBySubscribing(TOPIC);
+
+        // THEN
+        assertThat(updates).hasSize(1);
+        assertThat(consumer.closed()).isTrue();
+    }
+
+    @Test
+    void whenStartingBySubscribingToTopicAndExceptionOccurs_thenExpectExceptionIsHandledCorrectly() {
+        // GIVEN
+        consumer.schedulePollTask(() -> consumer.setPollException(new KafkaException("poll exception")));
+        consumer.schedulePollTask(() -> countryPopulationConsumer.stop());
+
+        HashMap<TopicPartition, Long> startOffsets = new HashMap<>();
+        TopicPartition tp = new TopicPartition(TOPIC, 0);
+        startOffsets.put(tp, 0L);
+        consumer.updateBeginningOffsets(startOffsets);
+
+        // WHEN
+        countryPopulationConsumer.startBySubscribing(TOPIC);
+
+        // THEN
+        assertThat(pollException).isInstanceOf(KafkaException.class).hasMessage("poll exception");
+        assertThat(consumer.closed()).isTrue();
+    }
+
+    private ConsumerRecord<String, Integer> record(String topic, int partition, String country, int population) {
+        return new ConsumerRecord<>(topic, partition, 0, country, population);
+    }
+}
\ No newline at end of file

From 3c455c5c56e13f3905834785d9a89c8cdf09dcc8 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Mon, 25 May 2020 13:03:25 +0200
Subject: [PATCH 392/404] JAVA-1635: Remove unnecessary dependencies and
 overridden spring-boot.version

---
 .../spring-boot-persistence-h2/pom.xml               | 12 +++++-------
 .../src/main/resources/application.properties        |  3 +--
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/persistence-modules/spring-boot-persistence-h2/pom.xml b/persistence-modules/spring-boot-persistence-h2/pom.xml
index 777bc6cb2d..7070b5e674 100644
--- a/persistence-modules/spring-boot-persistence-h2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-h2/pom.xml
@@ -35,23 +35,21 @@
             <version>${lombok.version}</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>org.hibernate</groupId>
-            <artifactId>hibernate-core</artifactId>
-            <version>${hibernate.version}</version>
-        </dependency>
         <dependency>
             <groupId>com.vladmihalcea</groupId>
             <artifactId>db-util</artifactId>
             <version>${db-util.version}</version>
         </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+            <version>${byte-buddy.version}</version>
+        </dependency>
     </dependencies>
 
     <properties>
         <!-- The main class to start by executing java -jar -->
         <start-class>com.baeldung.h2db.demo.server.SpringBootApp</start-class>
-        <spring-boot.version>2.0.4.RELEASE</spring-boot.version>
-        <hibernate.version>5.3.11.Final</hibernate.version>
         <db-util.version>1.0.4</db-util.version>
     </properties>
 
diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.properties
index ed1ffc63c3..0466eaac79 100644
--- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.properties
+++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.properties
@@ -8,5 +8,4 @@ spring.jpa.properties.hibernate.format_sql=true
 spring.jpa.properties.hibernate.validator.apply_to_ddl=false
 #spring.jpa.properties.hibernate.check_nullability=true
 spring.h2.console.enabled=true
-spring.h2.console.path=/h2-console
-debug=true
\ No newline at end of file
+spring.h2.console.path=/h2-console
\ No newline at end of file

From 2bdba48843234b58fe3086a28f6f008b6a7930cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Dupire?= <dupire.francois+pro@gmail.com>
Date: Mon, 25 May 2020 16:15:48 +0200
Subject: [PATCH 393/404] [JAVA-1657] Junit and Maven Surefire Plugin upgrade
 in core-java-modules (#9301)

* [JAVA-1657] core-java-modules JUnit and Maven Surefire Plugin upgrade

* [JAVA-1657] Changed sub modules parents to core-java-modules and core-java-modules to parent-java

* [JAVA-1657] Upgraded JUnit Jupiter version

* [JAVA-1657] Get JUnit 4 dependency transitively
---
 core-java-modules/core-java-8-2/pom.xml       |  7 ++--
 .../core-java-8-datetime-2/pom.xml            |  7 ++--
 .../core-java-8-datetime/pom.xml              |  7 ++--
 core-java-modules/core-java-8/pom.xml         |  7 ++--
 core-java-modules/core-java-9-streams/pom.xml |  7 ++--
 .../core-java-annotations/pom.xml             |  6 +--
 .../core-java-arrays-convert/pom.xml          |  2 +-
 .../core-java-arrays-guides/pom.xml           |  2 +-
 .../core-java-arrays-multidimensional/pom.xml |  2 +-
 .../pom.xml                                   |  2 +-
 .../core-java-arrays-operations-basic/pom.xml |  2 +-
 .../core-java-arrays-sorting/pom.xml          |  4 +-
 .../core-java-collections-2/pom.xml           |  7 ++--
 .../core-java-collections-3/pom.xml           |  7 ++--
 .../core-java-collections-array-list/pom.xml  |  7 ++--
 .../core-java-collections-list-2/pom.xml      |  7 ++--
 .../core-java-collections-list-3/pom.xml      |  7 ++--
 .../core-java-collections-list/pom.xml        |  7 ++--
 .../core-java-collections-maps-2/pom.xml      |  7 ++--
 .../core-java-collections-maps-3/pom.xml      |  7 ++--
 .../core-java-collections-maps/pom.xml        |  9 ++---
 .../core-java-collections-set/pom.xml         |  7 ++--
 .../core-java-collections/pom.xml             |  7 ++--
 .../core-java-concurrency-2/pom.xml           |  7 ++--
 .../core-java-concurrency-advanced-2/pom.xml  |  7 ++--
 .../core-java-concurrency-advanced-3/pom.xml  |  7 ++--
 .../core-java-concurrency-advanced/pom.xml    |  7 ++--
 .../core-java-concurrency-basic-2/pom.xml     |  7 ++--
 .../core-java-concurrency-basic/pom.xml       |  7 ++--
 .../core-java-concurrency-collections/pom.xml |  7 ++--
 .../core-java-date-operations-1/pom.xml       |  7 ++--
 .../core-java-date-operations-2/pom.xml       |  7 ++--
 .../core-java-datetime-conversion/pom.xml     |  7 ++--
 .../core-java-datetime-string/pom.xml         |  7 ++--
 .../core-java-exceptions-2/pom.xml            |  7 ++--
 .../core-java-exceptions/pom.xml              |  7 ++--
 core-java-modules/core-java-function/pom.xml  |  7 ++--
 core-java-modules/core-java-io-2/pom.xml      |  7 ++--
 core-java-modules/core-java-io-apis/pom.xml   |  7 ++--
 .../core-java-io-conversions-2/pom.xml        |  7 ++--
 .../core-java-io-conversions/pom.xml          |  7 ++--
 core-java-modules/core-java-io/pom.xml        |  7 ++--
 core-java-modules/core-java-jar/pom.xml       |  7 ++--
 core-java-modules/core-java-jndi/pom.xml      |  2 +-
 core-java-modules/core-java-jpms/pom.xml      |  2 +-
 core-java-modules/core-java-jvm/pom.xml       |  8 ++--
 core-java-modules/core-java-lambdas/pom.xml   |  7 ++--
 core-java-modules/core-java-lang-2/pom.xml    |  7 ++--
 .../core-java-lang-math-2/pom.xml             |  7 ++--
 core-java-modules/core-java-lang-math/pom.xml |  7 ++--
 .../core-java-lang-oop-constructors/pom.xml   |  2 +-
 .../core-java-lang-oop-generics/pom.xml       |  2 +-
 .../core-java-lang-oop-inheritance/pom.xml    |  2 +-
 .../core-java-lang-oop-methods/pom.xml        |  2 +-
 .../core-java-lang-oop-modifiers/pom.xml      |  2 +-
 .../core-java-lang-oop-others/pom.xml         |  2 +-
 .../core-java-lang-oop-patterns/pom.xml       |  2 +-
 .../core-java-lang-oop-types/pom.xml          |  2 +-
 .../core-java-lang-operators/pom.xml          |  7 ++--
 .../core-java-lang-syntax-2/pom.xml           |  7 ++--
 .../core-java-lang-syntax/pom.xml             |  7 ++--
 core-java-modules/core-java-lang/pom.xml      |  7 ++--
 .../core-java-networking-2/pom.xml            |  7 ++--
 .../core-java-networking/pom.xml              |  7 ++--
 core-java-modules/core-java-nio-2/pom.xml     |  7 ++--
 core-java-modules/core-java-nio/pom.xml       |  7 ++--
 core-java-modules/core-java-optional/pom.xml  |  2 +-
 core-java-modules/core-java-os/pom.xml        |  7 ++--
 core-java-modules/core-java-perf/pom.xml      |  7 ++--
 .../core-java-reflection/pom.xml              |  7 ++--
 core-java-modules/core-java-regex/pom.xml     |  7 ++--
 .../core-java-security-2/pom.xml              |  7 ++--
 core-java-modules/core-java-security/pom.xml  |  7 ++--
 core-java-modules/core-java-streams-2/pom.xml |  7 ++--
 core-java-modules/core-java-streams-3/pom.xml |  7 ++--
 core-java-modules/core-java-streams/pom.xml   |  7 ++--
 .../core-java-string-algorithms-2/pom.xml     |  7 ++--
 .../core-java-string-algorithms-3/pom.xml     | 11 ++----
 .../core-java-string-algorithms/pom.xml       |  7 ++--
 .../core-java-string-apis/pom.xml             |  7 ++--
 .../core-java-string-conversions-2/pom.xml    |  7 ++--
 .../core-java-string-conversions/pom.xml      |  7 ++--
 .../core-java-string-operations-2/pom.xml     |  7 ++--
 .../core-java-string-operations/pom.xml       |  7 ++--
 core-java-modules/core-java-strings/pom.xml   |  7 ++--
 core-java-modules/core-java-sun/pom.xml       |  7 ++--
 .../core-java-time-measurements/pom.xml       |  7 ++--
 core-java-modules/core-java/pom.xml           |  7 ++--
 core-java-modules/pom.xml                     | 38 ++++++++++++++++++-
 core-java-modules/pre-jpms/pom.xml            |  8 ++--
 90 files changed, 274 insertions(+), 311 deletions(-)

diff --git a/core-java-modules/core-java-8-2/pom.xml b/core-java-modules/core-java-8-2/pom.xml
index 00579c49b2..48474a5eef 100644
--- a/core-java-modules/core-java-8-2/pom.xml
+++ b/core-java-modules/core-java-8-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-8-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-8-datetime-2/pom.xml b/core-java-modules/core-java-8-datetime-2/pom.xml
index ce98b72781..629ce5234d 100644
--- a/core-java-modules/core-java-8-datetime-2/pom.xml
+++ b/core-java-modules/core-java-8-datetime-2/pom.xml
@@ -8,12 +8,11 @@
     <version>${project.parent.version}</version>
     <name>core-java-8-datetime</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-8-datetime/pom.xml b/core-java-modules/core-java-8-datetime/pom.xml
index ce98b72781..629ce5234d 100644
--- a/core-java-modules/core-java-8-datetime/pom.xml
+++ b/core-java-modules/core-java-8-datetime/pom.xml
@@ -8,12 +8,11 @@
     <version>${project.parent.version}</version>
     <name>core-java-8-datetime</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
index a434be028d..557f9e0dce 100644
--- a/core-java-modules/core-java-8/pom.xml
+++ b/core-java-modules/core-java-8/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-8</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-9-streams/pom.xml b/core-java-modules/core-java-9-streams/pom.xml
index 7865b336a7..8c1af89b24 100644
--- a/core-java-modules/core-java-9-streams/pom.xml
+++ b/core-java-modules/core-java-9-streams/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-9-streams</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <build>
diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml
index 8fc4c15cde..92ba4991bb 100644
--- a/core-java-modules/core-java-annotations/pom.xml
+++ b/core-java-modules/core-java-annotations/pom.xml
@@ -10,10 +10,10 @@
     <packaging>jar</packaging>
 
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <build>
diff --git a/core-java-modules/core-java-arrays-convert/pom.xml b/core-java-modules/core-java-arrays-convert/pom.xml
index bd50289f47..67dc645936 100644
--- a/core-java-modules/core-java-arrays-convert/pom.xml
+++ b/core-java-modules/core-java-arrays-convert/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-arrays-guides/pom.xml b/core-java-modules/core-java-arrays-guides/pom.xml
index ef718d5117..df8639820d 100644
--- a/core-java-modules/core-java-arrays-guides/pom.xml
+++ b/core-java-modules/core-java-arrays-guides/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-arrays-multidimensional/pom.xml b/core-java-modules/core-java-arrays-multidimensional/pom.xml
index 6e49a20521..d90853678c 100644
--- a/core-java-modules/core-java-arrays-multidimensional/pom.xml
+++ b/core-java-modules/core-java-arrays-multidimensional/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
index 8989e91189..d73fdcee28 100644
--- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-arrays-operations-basic/pom.xml b/core-java-modules/core-java-arrays-operations-basic/pom.xml
index 4480c14bb2..73588d662a 100644
--- a/core-java-modules/core-java-arrays-operations-basic/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-basic/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-arrays-sorting/pom.xml b/core-java-modules/core-java-arrays-sorting/pom.xml
index 127d921b2a..d5e2beaac4 100644
--- a/core-java-modules/core-java-arrays-sorting/pom.xml
+++ b/core-java-modules/core-java-arrays-sorting/pom.xml
@@ -5,8 +5,8 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-collections-2/pom.xml b/core-java-modules/core-java-collections-2/pom.xml
index 3a7c70b1a2..d163aabdbc 100644
--- a/core-java-modules/core-java-collections-2/pom.xml
+++ b/core-java-modules/core-java-collections-2/pom.xml
@@ -7,12 +7,11 @@
     <artifactId>core-java-collections-2</artifactId>
     <name>core-java-collections-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml
index 1e1695c8bc..bd991bfefa 100644
--- a/core-java-modules/core-java-collections-3/pom.xml
+++ b/core-java-modules/core-java-collections-3/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-3</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-array-list/pom.xml b/core-java-modules/core-java-collections-array-list/pom.xml
index 74a6513cac..81ee4eff55 100644
--- a/core-java-modules/core-java-collections-array-list/pom.xml
+++ b/core-java-modules/core-java-collections-array-list/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-array-list</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-list-2/pom.xml b/core-java-modules/core-java-collections-list-2/pom.xml
index 3184da1294..230787d14d 100644
--- a/core-java-modules/core-java-collections-list-2/pom.xml
+++ b/core-java-modules/core-java-collections-list-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-list-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml
index 090e756ac6..373190a130 100644
--- a/core-java-modules/core-java-collections-list-3/pom.xml
+++ b/core-java-modules/core-java-collections-list-3/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-list-3</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-list/pom.xml b/core-java-modules/core-java-collections-list/pom.xml
index e6dce5a0db..509f58ea61 100644
--- a/core-java-modules/core-java-collections-list/pom.xml
+++ b/core-java-modules/core-java-collections-list/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-list</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml
index a08a4ac072..a64a11c6ea 100644
--- a/core-java-modules/core-java-collections-maps-2/pom.xml
+++ b/core-java-modules/core-java-collections-maps-2/pom.xml
@@ -7,12 +7,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-maps-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-maps-3/pom.xml b/core-java-modules/core-java-collections-maps-3/pom.xml
index 95414c12c2..f547968b22 100644
--- a/core-java-modules/core-java-collections-maps-3/pom.xml
+++ b/core-java-modules/core-java-collections-maps-3/pom.xml
@@ -7,12 +7,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-maps-3</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml
index c0dd705c1c..742e264504 100644
--- a/core-java-modules/core-java-collections-maps/pom.xml
+++ b/core-java-modules/core-java-collections-maps/pom.xml
@@ -6,12 +6,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-maps</name>
     <packaging>jar</packaging>
-
-   <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+    <parent>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections-set/pom.xml b/core-java-modules/core-java-collections-set/pom.xml
index c89ba0c091..7c55f2ff2a 100644
--- a/core-java-modules/core-java-collections-set/pom.xml
+++ b/core-java-modules/core-java-collections-set/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections-set</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-collections/pom.xml b/core-java-modules/core-java-collections/pom.xml
index 515d19d7fb..e1219c4713 100644
--- a/core-java-modules/core-java-collections/pom.xml
+++ b/core-java-modules/core-java-collections/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-collections</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml
index dfb5674c8e..75fd3890b3 100644
--- a/core-java-modules/core-java-concurrency-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 	
 	<dependencies>
diff --git a/core-java-modules/core-java-concurrency-advanced-2/pom.xml b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
index 8752e7b7db..2f374bffac 100644
--- a/core-java-modules/core-java-concurrency-advanced-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-advanced-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-concurrency-advanced-3/pom.xml b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
index cf81214125..32267fb800 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
@@ -9,12 +9,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-advanced-3</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-concurrency-advanced/pom.xml b/core-java-modules/core-java-concurrency-advanced/pom.xml
index d39712468f..67db486121 100644
--- a/core-java-modules/core-java-concurrency-advanced/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-advanced</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-concurrency-basic-2/pom.xml b/core-java-modules/core-java-concurrency-basic-2/pom.xml
index 8c9bbef54c..adc4fd33e3 100644
--- a/core-java-modules/core-java-concurrency-basic-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-basic-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-basic-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <build>
diff --git a/core-java-modules/core-java-concurrency-basic/pom.xml b/core-java-modules/core-java-concurrency-basic/pom.xml
index c15200da1f..29d393805b 100644
--- a/core-java-modules/core-java-concurrency-basic/pom.xml
+++ b/core-java-modules/core-java-concurrency-basic/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-basic</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-concurrency-collections/pom.xml b/core-java-modules/core-java-concurrency-collections/pom.xml
index 5c038639a7..31f5a0fca8 100644
--- a/core-java-modules/core-java-concurrency-collections/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-concurrency-collections</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-date-operations-1/pom.xml b/core-java-modules/core-java-date-operations-1/pom.xml
index 54cbc79678..e12e4aa4ee 100644
--- a/core-java-modules/core-java-date-operations-1/pom.xml
+++ b/core-java-modules/core-java-date-operations-1/pom.xml
@@ -8,12 +8,11 @@
     <version>${project.parent.version}</version>
     <name>core-java-date-operations-1</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-date-operations-2/pom.xml b/core-java-modules/core-java-date-operations-2/pom.xml
index ea5f852b0d..5861a9ab98 100644
--- a/core-java-modules/core-java-date-operations-2/pom.xml
+++ b/core-java-modules/core-java-date-operations-2/pom.xml
@@ -8,12 +8,11 @@
     <version>${project.parent.version}</version>
     <name>core-java-date-operations-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml
index e2dd579335..79d1394576 100644
--- a/core-java-modules/core-java-datetime-conversion/pom.xml
+++ b/core-java-modules/core-java-datetime-conversion/pom.xml
@@ -8,12 +8,11 @@
     <version>${project.parent.version}</version>
     <name>core-java-datetime-conversion</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-datetime-string/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml
index ceb7641320..c1181f670a 100644
--- a/core-java-modules/core-java-datetime-string/pom.xml
+++ b/core-java-modules/core-java-datetime-string/pom.xml
@@ -8,12 +8,11 @@
     <version>${project.parent.version}</version>
     <name>core-java-datetime-string</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-exceptions-2/pom.xml b/core-java-modules/core-java-exceptions-2/pom.xml
index 915ec1da69..a53bf37b77 100644
--- a/core-java-modules/core-java-exceptions-2/pom.xml
+++ b/core-java-modules/core-java-exceptions-2/pom.xml
@@ -7,12 +7,11 @@
     <artifactId>core-java-exceptions-2</artifactId>
     <name>core-java-exceptions-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml
index 0778b6b5a3..b708aff6b9 100644
--- a/core-java-modules/core-java-exceptions/pom.xml
+++ b/core-java-modules/core-java-exceptions/pom.xml
@@ -9,12 +9,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-exceptions</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml
index 1a853d5580..0eb34bed7b 100644
--- a/core-java-modules/core-java-function/pom.xml
+++ b/core-java-modules/core-java-function/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-function</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml
index ec27c76435..bdc2ee37f5 100644
--- a/core-java-modules/core-java-io-2/pom.xml
+++ b/core-java-modules/core-java-io-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-io-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-io-apis/pom.xml b/core-java-modules/core-java-io-apis/pom.xml
index 9628027309..9350e4b527 100644
--- a/core-java-modules/core-java-io-apis/pom.xml
+++ b/core-java-modules/core-java-io-apis/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-io-apis</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-io-conversions-2/pom.xml b/core-java-modules/core-java-io-conversions-2/pom.xml
index e95d1f4b67..5312ad645d 100644
--- a/core-java-modules/core-java-io-conversions-2/pom.xml
+++ b/core-java-modules/core-java-io-conversions-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-io-conversions-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-io-conversions/pom.xml b/core-java-modules/core-java-io-conversions/pom.xml
index f5ccaa45a3..0012b02d7e 100644
--- a/core-java-modules/core-java-io-conversions/pom.xml
+++ b/core-java-modules/core-java-io-conversions/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-io-conversions</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml
index 103a809f90..ccfb57e909 100644
--- a/core-java-modules/core-java-io/pom.xml
+++ b/core-java-modules/core-java-io/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-io</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-jar/pom.xml b/core-java-modules/core-java-jar/pom.xml
index 1d87bcda5f..6e9d713d7c 100644
--- a/core-java-modules/core-java-jar/pom.xml
+++ b/core-java-modules/core-java-jar/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-jar</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-jndi/pom.xml b/core-java-modules/core-java-jndi/pom.xml
index 4a491a1a47..030a5f5d50 100644
--- a/core-java-modules/core-java-jndi/pom.xml
+++ b/core-java-modules/core-java-jndi/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>com.baeldung.core-java-modules</groupId>
         <artifactId>core-java-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-jpms/pom.xml b/core-java-modules/core-java-jpms/pom.xml
index 4610baab49..5809c0f579 100644
--- a/core-java-modules/core-java-jpms/pom.xml
+++ b/core-java-modules/core-java-jpms/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>com.baeldung.core-java-modules</groupId>
         <artifactId>core-java-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
 
     <modules>
diff --git a/core-java-modules/core-java-jvm/pom.xml b/core-java-modules/core-java-jvm/pom.xml
index edf7a4f3c5..f3e5470a61 100644
--- a/core-java-modules/core-java-jvm/pom.xml
+++ b/core-java-modules/core-java-jvm/pom.xml
@@ -10,10 +10,10 @@
     <packaging>jar</packaging>
 
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-        <relativePath>../../</relativePath>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lambdas/pom.xml b/core-java-modules/core-java-lambdas/pom.xml
index 421ca2f394..318b04fcf5 100644
--- a/core-java-modules/core-java-lambdas/pom.xml
+++ b/core-java-modules/core-java-lambdas/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lambdas</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
index 21a63d8091..5f2d4ec901 100644
--- a/core-java-modules/core-java-lang-2/pom.xml
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lang-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lang-math-2/pom.xml b/core-java-modules/core-java-lang-math-2/pom.xml
index 92ebcc6a94..e2cced4fbf 100644
--- a/core-java-modules/core-java-lang-math-2/pom.xml
+++ b/core-java-modules/core-java-lang-math-2/pom.xml
@@ -5,12 +5,11 @@
     <artifactId>core-java-lang-math-2</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>core-java-lang-math-2</name>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
index bcb5cf39d2..81ff0d43ea 100644
--- a/core-java-modules/core-java-lang-math/pom.xml
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lang-math</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lang-oop-constructors/pom.xml b/core-java-modules/core-java-lang-oop-constructors/pom.xml
index 76507103ea..e54286a822 100644
--- a/core-java-modules/core-java-lang-oop-constructors/pom.xml
+++ b/core-java-modules/core-java-lang-oop-constructors/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-generics/pom.xml b/core-java-modules/core-java-lang-oop-generics/pom.xml
index ae141ecda2..65a0aeac59 100644
--- a/core-java-modules/core-java-lang-oop-generics/pom.xml
+++ b/core-java-modules/core-java-lang-oop-generics/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-inheritance/pom.xml b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
index a48b28a289..ca828279db 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/pom.xml
+++ b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml
index 3590b85454..bcf561a6c2 100644
--- a/core-java-modules/core-java-lang-oop-methods/pom.xml
+++ b/core-java-modules/core-java-lang-oop-methods/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
index 615e20690f..5f0be4545f 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-others/pom.xml b/core-java-modules/core-java-lang-oop-others/pom.xml
index 8eab301748..ad5699d592 100644
--- a/core-java-modules/core-java-lang-oop-others/pom.xml
+++ b/core-java-modules/core-java-lang-oop-others/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-patterns/pom.xml b/core-java-modules/core-java-lang-oop-patterns/pom.xml
index 0102ef2653..0829295250 100644
--- a/core-java-modules/core-java-lang-oop-patterns/pom.xml
+++ b/core-java-modules/core-java-lang-oop-patterns/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-oop-types/pom.xml b/core-java-modules/core-java-lang-oop-types/pom.xml
index f73434a9ff..5555df4818 100644
--- a/core-java-modules/core-java-lang-oop-types/pom.xml
+++ b/core-java-modules/core-java-lang-oop-types/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>core-java-modules</artifactId>
         <groupId>com.baeldung.core-java-modules</groupId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/core-java-modules/core-java-lang-operators/pom.xml b/core-java-modules/core-java-lang-operators/pom.xml
index 09fbce4b3c..5b4c2fecaa 100644
--- a/core-java-modules/core-java-lang-operators/pom.xml
+++ b/core-java-modules/core-java-lang-operators/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lang-operators</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lang-syntax-2/pom.xml b/core-java-modules/core-java-lang-syntax-2/pom.xml
index b6da37b736..b88c86b047 100644
--- a/core-java-modules/core-java-lang-syntax-2/pom.xml
+++ b/core-java-modules/core-java-lang-syntax-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lang-syntax-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <build>
diff --git a/core-java-modules/core-java-lang-syntax/pom.xml b/core-java-modules/core-java-lang-syntax/pom.xml
index 106074bba6..c8f6524e0b 100644
--- a/core-java-modules/core-java-lang-syntax/pom.xml
+++ b/core-java-modules/core-java-lang-syntax/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lang-syntax</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-lang/pom.xml b/core-java-modules/core-java-lang/pom.xml
index 44d7812c15..807d5f34d4 100644
--- a/core-java-modules/core-java-lang/pom.xml
+++ b/core-java-modules/core-java-lang/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-lang</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <build>
diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml
index 938635b8d4..d79320eaef 100644
--- a/core-java-modules/core-java-networking-2/pom.xml
+++ b/core-java-modules/core-java-networking-2/pom.xml
@@ -7,12 +7,11 @@
     <artifactId>core-java-networking-2</artifactId>
     <name>core-java-networking-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml
index c22b62118d..b81be2751a 100644
--- a/core-java-modules/core-java-networking/pom.xml
+++ b/core-java-modules/core-java-networking/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-networking</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-nio-2/pom.xml b/core-java-modules/core-java-nio-2/pom.xml
index 2e67bff30a..0c7c079406 100644
--- a/core-java-modules/core-java-nio-2/pom.xml
+++ b/core-java-modules/core-java-nio-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-nio-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio/pom.xml b/core-java-modules/core-java-nio/pom.xml
index e7605763bb..5b8baf6a70 100644
--- a/core-java-modules/core-java-nio/pom.xml
+++ b/core-java-modules/core-java-nio/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-nio</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
 </project>
\ No newline at end of file
diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml
index 57e85109e6..575ccb0759 100644
--- a/core-java-modules/core-java-optional/pom.xml
+++ b/core-java-modules/core-java-optional/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>com.baeldung.core-java-modules</groupId>
         <artifactId>core-java-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.0.1-SNAPSHOT</version>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index d8941cb494..e17ddf9b37 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-os</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-perf/pom.xml b/core-java-modules/core-java-perf/pom.xml
index c1970346b5..3956c7e9fb 100644
--- a/core-java-modules/core-java-perf/pom.xml
+++ b/core-java-modules/core-java-perf/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-perf</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
 </project>
diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml
index dca446b268..4ae7b26745 100644
--- a/core-java-modules/core-java-reflection/pom.xml
+++ b/core-java-modules/core-java-reflection/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-reflection</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-regex/pom.xml b/core-java-modules/core-java-regex/pom.xml
index df2382a732..9e2d91d5d9 100644
--- a/core-java-modules/core-java-regex/pom.xml
+++ b/core-java-modules/core-java-regex/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-regex</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml
index 5db3b67c04..85aa3869b3 100644
--- a/core-java-modules/core-java-security-2/pom.xml
+++ b/core-java-modules/core-java-security-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-security-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index 96024a73a1..8ad120c8fc 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-security</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-streams-2/pom.xml b/core-java-modules/core-java-streams-2/pom.xml
index 1f47df63a0..2a0a4348b0 100644
--- a/core-java-modules/core-java-streams-2/pom.xml
+++ b/core-java-modules/core-java-streams-2/pom.xml
@@ -8,12 +8,11 @@
     <version>1.0</version>
     <name>core-java-streams-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-streams-3/pom.xml b/core-java-modules/core-java-streams-3/pom.xml
index ae27e28918..cbb7366a7d 100644
--- a/core-java-modules/core-java-streams-3/pom.xml
+++ b/core-java-modules/core-java-streams-3/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-streams-3</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml
index 272a2be540..f713fe7499 100644
--- a/core-java-modules/core-java-streams/pom.xml
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-streams</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-algorithms-2/pom.xml b/core-java-modules/core-java-string-algorithms-2/pom.xml
index f05674034a..a635cd8022 100644
--- a/core-java-modules/core-java-string-algorithms-2/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-algorithms-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml
index 583fa99afd..2725ba84c6 100644
--- a/core-java-modules/core-java-string-algorithms-3/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-3/pom.xml
@@ -7,12 +7,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>core-java-string-algorithms-3</name>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
@@ -31,8 +30,7 @@
 
         <dependency>
             <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-api</artifactId>
-            <version>${junit-jupiter-api.version}</version>
+            <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
@@ -64,7 +62,6 @@
         <commons-lang3.version>3.8.1</commons-lang3.version>
         <assertj.version>3.6.1</assertj.version>
         <guava.version>28.1-jre</guava.version>
-        <junit-jupiter-api.version>5.3.1</junit-jupiter-api.version>
     </properties>
 
 </project>
diff --git a/core-java-modules/core-java-string-algorithms/pom.xml b/core-java-modules/core-java-string-algorithms/pom.xml
index cb1a25c11b..85879d74e2 100644
--- a/core-java-modules/core-java-string-algorithms/pom.xml
+++ b/core-java-modules/core-java-string-algorithms/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-algorithms</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-apis/pom.xml b/core-java-modules/core-java-string-apis/pom.xml
index c1cd439386..449092bacb 100644
--- a/core-java-modules/core-java-string-apis/pom.xml
+++ b/core-java-modules/core-java-string-apis/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-apis</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-conversions-2/pom.xml b/core-java-modules/core-java-string-conversions-2/pom.xml
index 53680e4fce..cd7381d822 100644
--- a/core-java-modules/core-java-string-conversions-2/pom.xml
+++ b/core-java-modules/core-java-string-conversions-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-conversions-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-conversions/pom.xml b/core-java-modules/core-java-string-conversions/pom.xml
index 302e73e691..7d8977d2a5 100644
--- a/core-java-modules/core-java-string-conversions/pom.xml
+++ b/core-java-modules/core-java-string-conversions/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-conversions</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml
index a00ae80f13..db32bf97a1 100644
--- a/core-java-modules/core-java-string-operations-2/pom.xml
+++ b/core-java-modules/core-java-string-operations-2/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-operations-2</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-string-operations/pom.xml b/core-java-modules/core-java-string-operations/pom.xml
index a46b8ac129..c5791e929e 100644
--- a/core-java-modules/core-java-string-operations/pom.xml
+++ b/core-java-modules/core-java-string-operations/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-string-operations</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-strings/pom.xml b/core-java-modules/core-java-strings/pom.xml
index 9e9bf0748b..b09dc3f8a4 100644
--- a/core-java-modules/core-java-strings/pom.xml
+++ b/core-java-modules/core-java-strings/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-strings</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-sun/pom.xml b/core-java-modules/core-java-sun/pom.xml
index d60ab71db0..0f53407ec1 100644
--- a/core-java-modules/core-java-sun/pom.xml
+++ b/core-java-modules/core-java-sun/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java-sun</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml
index b751cc0d74..67b8d7179a 100644
--- a/core-java-modules/core-java-time-measurements/pom.xml
+++ b/core-java-modules/core-java-time-measurements/pom.xml
@@ -9,12 +9,11 @@
     <version>0.0.1-SNAPSHOT</version>
     <name>core-java-time-measurements</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml
index 9b89fffd40..b8d75058eb 100644
--- a/core-java-modules/core-java/pom.xml
+++ b/core-java-modules/core-java/pom.xml
@@ -8,12 +8,11 @@
     <version>0.1.0-SNAPSHOT</version>
     <name>core-java</name>
     <packaging>jar</packaging>
-
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-java</artifactId>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
         <version>0.0.1-SNAPSHOT</version>
-        <relativePath>../../parent-java</relativePath>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index c6cc3726e1..26c374b51d 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -11,8 +11,9 @@
 
     <parent>
         <groupId>com.baeldung</groupId>
-        <artifactId>parent-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <artifactId>parent-java</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../parent-java</relativePath>
     </parent>
 
     <modules>
@@ -132,4 +133,37 @@
         <module>pre-jpms</module>
     </modules>
 
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${maven-surefire-plugin.version}</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.junit.jupiter</groupId>
+                <artifactId>junit-jupiter</artifactId>
+                <version>${junit-jupiter.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.junit.vintage</groupId>
+                <artifactId>junit-vintage-engine</artifactId>
+                <version>${junit-jupiter.version}</version>
+                <scope>test</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <properties>
+        <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
+        <junit-jupiter.version>5.6.2</junit-jupiter.version>
+    </properties>
 </project>
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
index 18a2566e92..9032c9475b 100644
--- a/core-java-modules/pre-jpms/pom.xml
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -10,10 +10,10 @@
     <packaging>jar</packaging>
 
     <parent>
-        <groupId>com.baeldung</groupId>
-        <artifactId>parent-modules</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-        <relativePath>../../</relativePath>
+        <groupId>com.baeldung.core-java-modules</groupId>
+        <artifactId>core-java-modules</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../</relativePath>
     </parent>
 
     <dependencies>

From 7b53c3cb55b110470ae9e4528aef3a165fa1a873 Mon Sep 17 00:00:00 2001
From: Anshul Bansal <smartdiscover17@gmail.com>
Date: Tue, 26 May 2020 18:58:17 +0300
Subject: [PATCH 394/404] BAEL-3996_Spring_Security_with_Auth0 (#9300)

* BAEL-3996 - Spring Security with Auth0

* BAEL-3996 - Spring Security with Auth0 code fixes

* BAEL-3996 - Spring Security with Auth0

* BAEL-3996 - removed spaces

* BAEL-3996 - RequestMapping is updated to GetMapping
---
 spring-security-modules/pom.xml               |   1 +
 .../spring-security-auth0/pom.xml             |  75 ++++++++++++
 .../java/com/baeldung/auth0/Application.java  |  13 ++
 .../java/com/baeldung/auth0/AuthConfig.java   | 114 ++++++++++++++++++
 .../auth0/controller/AuthController.java      |  77 ++++++++++++
 .../auth0/controller/HomeController.java      |  37 ++++++
 .../auth0/controller/LogoutController.java    |  35 ++++++
 .../auth0/controller/UserController.java      |  57 +++++++++
 .../baeldung/auth0/service/ApiService.java    |  44 +++++++
 .../src/main/resources/application.properties |   7 ++
 10 files changed, 460 insertions(+)
 create mode 100644 spring-security-modules/spring-security-auth0/pom.xml
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/Application.java
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/AuthController.java
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/HomeController.java
 create mode 100755 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/LogoutController.java
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/UserController.java
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/service/ApiService.java
 create mode 100644 spring-security-modules/spring-security-auth0/src/main/resources/application.properties

diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index 7ce33dd3e3..60a662781f 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -15,6 +15,7 @@
 
     <modules>
         <module>spring-security-acl</module>
+        <module>spring-security-auth0</module>
         <module>spring-security-angular/server</module>
         <module>spring-security-cache-control</module>
         <module>spring-security-core</module>
diff --git a/spring-security-modules/spring-security-auth0/pom.xml b/spring-security-modules/spring-security-auth0/pom.xml
new file mode 100644
index 0000000000..0bd879a40b
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>spring-security-auth0</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>spring-security-auth0</name>
+    <packaging>war</packaging>
+
+    <parent>
+        <groupId>com.baeldung</groupId>
+        <artifactId>parent-boot-2</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../../parent-boot-2</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+		<dependency>
+		    <groupId>org.springframework.security</groupId>
+		    <artifactId>spring-security-core</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.springframework.security</groupId>
+		    <artifactId>spring-security-oauth2-resource-server</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>com.auth0</groupId>
+		    <artifactId>mvc-auth-commons</artifactId>
+		    <version>${mvc-auth-commons.version}</version>
+		</dependency>
+		<dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${json.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>spring-security-auth0</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <addResources>true</addResources>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <properties>
+        <json.version>20190722</json.version>
+        <mvc-auth-commons.version>1.2.0</mvc-auth-commons.version>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/Application.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/Application.java
new file mode 100644
index 0000000000..42f8d946b5
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.auth0;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java
new file mode 100644
index 0000000000..69cf8b3071
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java
@@ -0,0 +1,114 @@
+package com.baeldung.auth0;
+
+import java.io.UnsupportedEncodingException;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+
+import com.auth0.AuthenticationController;
+import com.baeldung.auth0.controller.LogoutController;
+import com.auth0.jwk.JwkProvider;
+import com.auth0.jwk.JwkProviderBuilder;
+
+@Configuration
+@EnableWebSecurity
+public class AuthConfig extends WebSecurityConfigurerAdapter {
+
+    @Value(value = "${com.auth0.domain}")
+    private String domain;
+
+    @Value(value = "${com.auth0.clientId}")
+    private String clientId;
+
+    @Value(value = "${com.auth0.clientSecret}")
+    private String clientSecret;
+
+    @Value(value = "${com.auth0.managementApi.clientId}")
+    private String managementApiClientId;
+
+    @Value(value = "${com.auth0.managementApi.clientSecret}")
+    private String managementApiClientSecret;
+
+    @Value(value = "${com.auth0.managementApi.grantType}")
+    private String grantType;
+
+    @Bean
+    public LogoutSuccessHandler logoutSuccessHandler() {
+        return new LogoutController();
+    }
+
+    @Bean
+    public AuthenticationController authenticationController() throws UnsupportedEncodingException {
+        JwkProvider jwkProvider = new JwkProviderBuilder(domain).build();
+        return AuthenticationController.newBuilder(domain, clientId, clientSecret)
+            .withJwkProvider(jwkProvider)
+            .build();
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.csrf().disable();
+        http
+        .authorizeRequests()
+        .antMatchers("/callback", "/login", "/").permitAll()
+        .anyRequest().authenticated()
+        .and()
+        .formLogin()
+        .loginPage("/login")
+        .and()
+        .logout().logoutSuccessHandler(logoutSuccessHandler()).permitAll();
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public String getClientSecret() {
+        return clientSecret;
+    }
+
+    public String getManagementApiClientId() {
+        return managementApiClientId;
+    }
+
+    public String getManagementApiClientSecret() {
+        return managementApiClientSecret;
+    }
+
+    public String getGrantType() {
+        return grantType;
+    }
+
+    public String getUserInfoUrl() {
+        return "https://" + getDomain() + "/userinfo";
+    }
+
+    public String getUsersUrl() {
+        return "https://" + getDomain() + "/api/v2/users";
+    }
+
+    public String getUsersByEmailUrl() {
+        return "https://" + getDomain() + "/api/v2/users-by-email?email=";
+    }
+
+    public String getLogoutUrl() {
+        return "https://" + getDomain() +"/v2/logout";
+    }
+
+    public String getContextPath(HttpServletRequest request) {
+        String path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
+        return path;
+    }
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/AuthController.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/AuthController.java
new file mode 100644
index 0000000000..48d09db155
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/AuthController.java
@@ -0,0 +1,77 @@
+package com.baeldung.auth0.controller;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.security.authentication.TestingAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.client.RestTemplate;
+
+import com.auth0.AuthenticationController;
+import com.auth0.IdentityVerificationException;
+import com.auth0.Tokens;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.baeldung.auth0.AuthConfig;
+
+@Controller
+public class AuthController {
+
+    @Autowired
+    private AuthenticationController authenticationController;
+
+    @Autowired
+    private AuthConfig config;
+
+    private static final String AUTH0_TOKEN_URL = "https://dev-example.auth0.com/oauth/token";
+
+    @GetMapping(value = "/login")
+    protected void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String redirectUri = config.getContextPath(request) + "/callback";
+        String authorizeUrl = authenticationController.buildAuthorizeUrl(request, response, redirectUri)
+            .withScope("openid email")
+            .build();
+        response.sendRedirect(authorizeUrl);
+    }
+
+    @GetMapping(value="/callback")
+    public void callback(HttpServletRequest request, HttpServletResponse response) throws IOException, IdentityVerificationException {
+        Tokens tokens = authenticationController.handle(request, response);
+
+        DecodedJWT jwt = JWT.decode(tokens.getIdToken());
+        TestingAuthenticationToken authToken2 = new TestingAuthenticationToken(jwt.getSubject(), jwt.getToken());
+        authToken2.setAuthenticated(true);
+
+        SecurityContextHolder.getContext().setAuthentication(authToken2);
+        response.sendRedirect(config.getContextPath(request) + "/"); 
+    }
+
+    public String getManagementApiToken() {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("client_id", config.getManagementApiClientId());
+        requestBody.put("client_secret", config.getManagementApiClientSecret());
+        requestBody.put("audience", "https://dev-example.auth0.com/api/v2/");
+        requestBody.put("grant_type", config.getGrantType()); 
+
+        HttpEntity<String> request = new HttpEntity<String>(requestBody.toString(), headers);
+
+        RestTemplate restTemplate = new RestTemplate();
+        HashMap<String, String> result = restTemplate.postForObject(AUTH0_TOKEN_URL, request, HashMap.class);
+
+        return result.get("access_token");
+    }
+
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/HomeController.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/HomeController.java
new file mode 100644
index 0000000000..8a4e650846
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/HomeController.java
@@ -0,0 +1,37 @@
+package com.baeldung.auth0.controller;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.security.authentication.TestingAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.interfaces.DecodedJWT;
+
+@Controller
+public class HomeController {
+    
+    @GetMapping(value = "/")
+    @ResponseBody
+    public String home(HttpServletRequest request, HttpServletResponse response, final Authentication authentication) throws IOException {
+        
+        if (authentication!= null && authentication instanceof TestingAuthenticationToken) {
+            TestingAuthenticationToken token = (TestingAuthenticationToken) authentication;
+            
+            DecodedJWT jwt = JWT.decode(token.getCredentials().toString());
+            String email = jwt.getClaims().get("email").asString();
+            
+            return "Welcome, " + email + "!";
+        } else {
+            response.sendRedirect("http://localhost:8080/login");
+            return null;
+        }
+    }
+
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/LogoutController.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/LogoutController.java
new file mode 100755
index 0000000000..d508fe2c44
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/LogoutController.java
@@ -0,0 +1,35 @@
+package com.baeldung.auth0.controller;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import org.springframework.stereotype.Controller;
+
+import com.baeldung.auth0.AuthConfig;
+
+@Controller
+public class LogoutController implements LogoutSuccessHandler {
+
+    @Autowired
+    private AuthConfig config;
+
+    @Override
+    public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse res, Authentication authentication) {
+        if (req.getSession() != null) {
+            req.getSession().invalidate();
+        }
+        String returnTo = config.getContextPath(req);
+        String logoutUrl = config.getLogoutUrl() + "?client_id=" + config.getClientId() + "&returnTo=" +returnTo;
+        try {
+            res.sendRedirect(logoutUrl);
+        } catch(IOException e){
+            e.printStackTrace();
+        }
+    }
+    
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/UserController.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/UserController.java
new file mode 100644
index 0000000000..86601a06d3
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/controller/UserController.java
@@ -0,0 +1,57 @@
+package com.baeldung.auth0.controller;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.auth0.IdentityVerificationException;
+import com.baeldung.auth0.AuthConfig;
+import com.baeldung.auth0.service.ApiService;
+
+@Controller
+public class UserController {
+    
+    @Autowired
+    private ApiService apiService;
+
+    @Autowired
+    private AuthConfig config;
+    
+    @GetMapping(value="/users")
+    @ResponseBody
+    public ResponseEntity<String> users(HttpServletRequest request, HttpServletResponse response) throws IOException, IdentityVerificationException {
+        ResponseEntity<String> result = apiService.getCall(config.getUsersUrl());
+        return result;
+    }
+
+    @GetMapping(value = "/userByEmail")
+    @ResponseBody
+    public ResponseEntity<String> userByEmail(HttpServletResponse response, @RequestParam String email) {
+        ResponseEntity<String> result = apiService.getCall(config.getUsersByEmailUrl()+email);
+        return result;
+    }
+    
+    @GetMapping(value = "/createUser")
+    @ResponseBody
+    public ResponseEntity<String> createUser(HttpServletResponse response) {
+        JSONObject request = new JSONObject();
+        request.put("email", "norman.lewis@email.com");
+        request.put("given_name", "Norman");
+        request.put("family_name", "Lewis");
+        request.put("connection", "Username-Password-Authentication");
+        request.put("password", "Pa33w0rd");
+        
+        ResponseEntity<String> result = apiService.postCall(config.getUsersUrl(), request.toString());
+        return result;
+    }
+    
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/service/ApiService.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/service/ApiService.java
new file mode 100644
index 0000000000..0d8263ae19
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/service/ApiService.java
@@ -0,0 +1,44 @@
+package com.baeldung.auth0.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import com.baeldung.auth0.controller.AuthController;
+
+@Service
+public class ApiService {
+    
+    @Autowired
+    private AuthController controller;
+
+    public ResponseEntity<String> getCall(String url) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Authorization", "Bearer "+controller.getManagementApiToken());
+        
+        HttpEntity<String> entity = new HttpEntity<String>(headers);
+        RestTemplate restTemplate = new RestTemplate();
+        ResponseEntity<String> result = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
+        
+        return result;
+    }
+    
+    public ResponseEntity<String> postCall(String url, String requestBody) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Authorization", "Bearer "+controller.getManagementApiToken());
+        
+        HttpEntity<String> request = new HttpEntity<String>(requestBody, headers);
+        RestTemplate restTemplate = new RestTemplate();
+        ResponseEntity<String> result = restTemplate.postForEntity(url, request, String.class);
+        
+        return result;
+    }
+    
+}
diff --git a/spring-security-modules/spring-security-auth0/src/main/resources/application.properties b/spring-security-modules/spring-security-auth0/src/main/resources/application.properties
new file mode 100644
index 0000000000..45492c5c00
--- /dev/null
+++ b/spring-security-modules/spring-security-auth0/src/main/resources/application.properties
@@ -0,0 +1,7 @@
+com.auth0.domain: dev-example.auth0.com
+com.auth0.clientId: exampleClientId
+com.auth0.clientSecret: exampleClientSecret
+
+com.auth0.managementApi.clientId: exampleManagementApiClientId
+com.auth0.managementApi.clientSecret: exampleManagementApiClientSecret
+com.auth0.managementApi.grantType: client_credentials
\ No newline at end of file

From 771b415b8708bc6282b16b71cadb9706a88a9276 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke <krzysztofwoyke@gmail.com>
Date: Wed, 27 May 2020 13:48:16 +0200
Subject: [PATCH 395/404] JAVA-1641: Remove overriden spring-boot.version
 property

---
 spring-boot-modules/spring-boot-mvc-birt/pom.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml
index f65b851f30..0e8e231a84 100644
--- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml
@@ -75,7 +75,6 @@
     </build>
 
     <properties>
-        <spring-boot.version>2.1.1.RELEASE</spring-boot.version>
         <start-class>com.baeldung.birt.engine.ReportEngineApplication</start-class>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>

From 9dc7483313d0bd04a61e755c30218f1d1aaff14e Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Wed, 27 May 2020 17:27:11 +0200
Subject: [PATCH 396/404] BAEL-3448: Downgrade logback version & fix config
 (#9354)

---
 jee-kotlin/pom.xml                                     | 3 ++-
 jee-kotlin/src/main/resources/META-INF/persistence.xml | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/jee-kotlin/pom.xml b/jee-kotlin/pom.xml
index 9191885bd4..14c47a205e 100644
--- a/jee-kotlin/pom.xml
+++ b/jee-kotlin/pom.xml
@@ -278,9 +278,10 @@
         <arquillian-drone-bom.version>2.0.1.Final</arquillian-drone-bom.version>
         <arquillian-rest-client.version>1.0.0.Alpha4</arquillian-rest-client.version>
 
+        <logback.version>1.1.7</logback.version>
+
         <resteasy.version>3.8.0.Final</resteasy.version>
         <shrinkwrap.version>3.1.3</shrinkwrap.version>
-
     </properties>
 
 </project>
diff --git a/jee-kotlin/src/main/resources/META-INF/persistence.xml b/jee-kotlin/src/main/resources/META-INF/persistence.xml
index daac86868b..0093792810 100644
--- a/jee-kotlin/src/main/resources/META-INF/persistence.xml
+++ b/jee-kotlin/src/main/resources/META-INF/persistence.xml
@@ -7,7 +7,7 @@
 
     <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
 
-    <class>com.enpy.entity.Student</class>
+    <class>com.baeldung.jeekotlin.entity.Student</class>
 
     <properties>
       <property name="hibernate.hbm2ddl.auto" value="create"/>

From 75b741954514f58b1e1359b331d58648fdd08147 Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Wed, 27 May 2020 17:33:29 +0200
Subject: [PATCH 397/404] KTLN-149: Get rid of the invalid buildString example
 (#9373)

---
 .../com/baeldung/stringcomparison/StringComparisonTest.kt     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt
index 9528f62df5..49ff798faa 100644
--- a/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt
+++ b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt
@@ -19,9 +19,9 @@ class StringComparisonUnitTest {
     fun `compare using referential equals operator`() {
         val first = "kotlin"
         val second = "kotlin"
-        val copyOfFirst = buildString { "kotlin" }
+        val third = String("kotlin".toCharArray())
         assertTrue { first === second }
-        assertFalse { first === copyOfFirst }
+        assertFalse { first === third }
     }
 
     @Test

From 35822806087c704f6c3d3e7d743247285032b5d1 Mon Sep 17 00:00:00 2001
From: Ali Dehghani <ali.dehghani.g@gmail.com>
Date: Wed, 27 May 2020 22:25:08 +0430
Subject: [PATCH 398/404] Fixed the Datasource Assertion Issue

---
 .../SpringBootTomcatConnectionPoolIntegrationTest.java          | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
index 5400d76fbe..4422c27150 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
@@ -4,6 +4,7 @@ import javax.sql.DataSource;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import com.baeldung.tomcatconnectionpool.application.SpringBootConsoleApplication;
@@ -13,6 +14,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {SpringBootConsoleApplication.class})
+@TestPropertySource(properties = "spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource")
 public class SpringBootTomcatConnectionPoolIntegrationTest {
     
     @Autowired

From cd293d0cb634752400ec6398ba168707c006451c Mon Sep 17 00:00:00 2001
From: kwoyke <krzysztofwoyke@gmail.com>
Date: Wed, 27 May 2020 22:16:44 +0200
Subject: [PATCH 399/404] BAEL-3448: Change default http port (#9380)

---
 jee-kotlin/pom.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/jee-kotlin/pom.xml b/jee-kotlin/pom.xml
index 14c47a205e..45d5d8ece1 100644
--- a/jee-kotlin/pom.xml
+++ b/jee-kotlin/pom.xml
@@ -221,6 +221,7 @@
                             <systemPropertyVariables>
                                 <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                                 <jboss.home>${project.basedir}/target/wildfly-${wildfly.version}</jboss.home>
+                                <jboss.http.port>8756</jboss.http.port>
                                 <module.path>${project.basedir}/target/wildfly-${wildfly.version}/modules</module.path>
                             </systemPropertyVariables>
                             <redirectTestOutputToFile>false</redirectTestOutputToFile>

From 547a57c3c836f5293784999d71b2d0ab734d6c65 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Wed, 27 May 2020 20:42:38 -0400
Subject: [PATCH 400/404] BAEL-3341 Rename test dependent on database

---
 ...ateTypesIntegrationTest.java => HibernateTypesLiveTest.java} | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 rename persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/{HibernateTypesIntegrationTest.java => HibernateTypesLiveTest.java} (99%)

diff --git a/persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java b/persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesLiveTest.java
similarity index 99%
rename from persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
rename to persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesLiveTest.java
index 9d7479e77d..4b551386ad 100644
--- a/persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesIntegrationTest.java
+++ b/persistence-modules/hibernate-libraries/src/test/java/com/baeldung/hibernate/types/HibernateTypesLiveTest.java
@@ -13,7 +13,7 @@ import java.util.UUID;
 import static org.assertj.core.api.Assertions.assertThat;
 
 @SpringBootTest
-public class HibernateTypesIntegrationTest {
+public class HibernateTypesLiveTest {
 
     @Autowired
     AlbumRepository albumRepository;

From cde01486d750e118829b6e26de68758f858fd60c Mon Sep 17 00:00:00 2001
From: Ali Dehghani <ali.dehghani.g@gmail.com>
Date: Thu, 28 May 2020 06:41:53 +0430
Subject: [PATCH 401/404] Changing to a More Stable Currency!

---
 .../currencies/CurrenciesControllerIntegrationTest.java     | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java
index 02bf8a9ee0..c1e3cf7458 100644
--- a/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java
+++ b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/currencies/CurrenciesControllerIntegrationTest.java
@@ -27,7 +27,7 @@ public class CurrenciesControllerIntegrationTest {
           .header("Accept-Language", "es-ES")
           .param("amount", "10032.5"))
           .andExpect(status().isOk())
-          .andExpect(content().string(containsString("10.032,50 €")));
+          .andExpect(content().string(containsString("10.032,50")));
     }
 
     @Test
@@ -42,10 +42,10 @@ public class CurrenciesControllerIntegrationTest {
     @Test
     public void whenCallCurrencyWithRomanianLocaleWithArrays_ThenReturnLocaleCurrencies() throws Exception {
         mockMvc.perform(MockMvcRequestBuilders.get("/currency")
-          .header("Accept-Language", "ro-RO")
+          .header("Accept-Language", "en-GB")
           .param("amountList", "10", "20", "30"))
           .andExpect(status().isOk())
-          .andExpect(content().string(containsString("10,00 RON, 20,00 RON, 30,00 RON")));
+          .andExpect(content().string(containsString("£10.00, £20.00, £30.00")));
     }
 
     @Test

From 6cd7bfba80b1ec9927099c93f2c85155fff17580 Mon Sep 17 00:00:00 2001
From: vatsalgosar <vatsalgosar@gmail.com>
Date: Thu, 28 May 2020 22:07:23 +0530
Subject: [PATCH 402/404] BAEL-3987 (#9139)

* BAEL-3987 - Cast an int to an enum value

* refactoring

* code refactored

* BAEL-3987 - Updated code snippets

* bAEL-3987 - Fixed indentation
---
 .../com/baeldung/inttoenum/PizzaStatus.java   | 36 +++++++++++++++++++
 .../baeldung/inttoenum/IntToEnumUnitTest.java | 27 ++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/inttoenum/PizzaStatus.java
 create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/inttoenum/IntToEnumUnitTest.java

diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/inttoenum/PizzaStatus.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/inttoenum/PizzaStatus.java
new file mode 100644
index 0000000000..8d7c626521
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/inttoenum/PizzaStatus.java
@@ -0,0 +1,36 @@
+package com.baeldung.inttoenum;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum PizzaStatus {
+    ORDERED(5),
+    READY(2),
+    DELIVERED(0);
+
+    private int timeToDelivery;
+
+    PizzaStatus(int timeToDelivery) {
+        this.timeToDelivery = timeToDelivery;
+    }
+
+    public int getTimeToDelivery() {
+        return timeToDelivery;
+    }
+
+    private static Map<Integer, PizzaStatus> timeToDeliveryToEnumValuesMapping = new HashMap<>();
+
+    static {
+        PizzaStatus[] pizzaStatuses = PizzaStatus.values();
+        for (int pizzaStatusIndex = 0; pizzaStatusIndex < pizzaStatuses.length; pizzaStatusIndex++) {
+            timeToDeliveryToEnumValuesMapping.put(
+                pizzaStatuses[pizzaStatusIndex].getTimeToDelivery(),
+                pizzaStatuses[pizzaStatusIndex]
+            );
+        }
+    }
+
+    public static PizzaStatus castIntToEnum(int timeToDelivery) {
+        return timeToDeliveryToEnumValuesMapping.get(timeToDelivery);
+    }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/inttoenum/IntToEnumUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/inttoenum/IntToEnumUnitTest.java
new file mode 100644
index 0000000000..876c230827
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/inttoenum/IntToEnumUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.inttoenum;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class IntToEnumUnitTest {
+
+    @Test
+    public void whenIntToEnumUsingValuesMethod_thenReturnEnumObject() {
+        int timeToDeliveryForOrderedPizzaStatus = 5;
+        PizzaStatus[] pizzaStatuses = PizzaStatus.values();
+        PizzaStatus pizzaOrderedStatus = null;
+        for (int pizzaStatusIndex = 0; pizzaStatusIndex < pizzaStatuses.length; pizzaStatusIndex++) {
+            if (pizzaStatuses[pizzaStatusIndex].getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) {
+                pizzaOrderedStatus = pizzaStatuses[pizzaStatusIndex];
+            }
+        }
+        assertEquals(pizzaOrderedStatus, PizzaStatus.ORDERED);
+    }
+
+    @Test
+    public void whenIntToEnumUsingMap_thenReturnEnumObject() {
+        int timeToDeliveryForOrderedPizzaStatus = 5;
+        assertEquals(PizzaStatus.castIntToEnum(timeToDeliveryForOrderedPizzaStatus), PizzaStatus.ORDERED);
+    }
+}
\ No newline at end of file

From 135c3160ac0016ecb0244a9c20b6f065fcab632a Mon Sep 17 00:00:00 2001
From: Mark Thomas <spatialguru.net@gmail.com>
Date: Thu, 28 May 2020 15:34:00 -0500
Subject: [PATCH 403/404] BAEL-3768 - spatialguru.net@gmail.com (#9385)

* Add implementation of BeanPostProcessor and BeanFactoryPostProcessor for ticket

* Continue processing beans if annotation not found on one or more

* Add integration test

* Simplify code
---
 spring-core-4/pom.xml                         | 24 ++++-
 .../postprocessor/GlobalEventBus.java         | 39 +++++++++
 ...GuavaEventBusBeanFactoryPostProcessor.java | 63 ++++++++++++++
 .../GuavaEventBusBeanPostProcessor.java       | 87 +++++++++++++++++++
 .../baeldung/postprocessor/StockTrade.java    | 34 ++++++++
 .../postprocessor/StockTradeListener.java     |  7 ++
 .../postprocessor/StockTradePublisher.java    | 36 ++++++++
 .../baeldung/postprocessor/Subscriber.java    | 21 +++++
 .../PostProcessorConfiguration.java           | 23 +++++
 .../StockTradeIntegrationTest.java            | 46 ++++++++++
 10 files changed, 379 insertions(+), 1 deletion(-)
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/GlobalEventBus.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanFactoryPostProcessor.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanPostProcessor.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/StockTrade.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradeListener.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradePublisher.java
 create mode 100644 spring-core-4/src/main/java/com/baeldung/postprocessor/Subscriber.java
 create mode 100644 spring-core-4/src/test/java/com/baeldung/postprocessor/PostProcessorConfiguration.java
 create mode 100644 spring-core-4/src/test/java/com/baeldung/postprocessor/StockTradeIntegrationTest.java

diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml
index 53f7ca6912..fbec5ea9eb 100644
--- a/spring-core-4/pom.xml
+++ b/spring-core-4/pom.xml
@@ -24,6 +24,16 @@
             <artifactId>spring-core</artifactId>
             <version>${spring.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>28.2-jre</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
@@ -42,6 +52,18 @@
             <version>${junit-jupiter.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <version>4.0.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>2.9.1</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -60,4 +82,4 @@
         <spring.boot.version>2.2.2.RELEASE</spring.boot.version>
     </properties>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/GlobalEventBus.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/GlobalEventBus.java
new file mode 100644
index 0000000000..8b95ea7c6f
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/GlobalEventBus.java
@@ -0,0 +1,39 @@
+package com.baeldung.postprocessor;
+
+import com.google.common.eventbus.AsyncEventBus;
+import com.google.common.eventbus.EventBus;
+
+import java.util.concurrent.Executors;
+
+@SuppressWarnings("ALL")
+public final class GlobalEventBus {
+
+    public static final String GLOBAL_EVENT_BUS_EXPRESSION = "T(com.baeldung.postprocessor.GlobalEventBus).getEventBus()";
+
+    private static final String IDENTIFIER = "global-event-bus";
+
+    private static final GlobalEventBus GLOBAL_EVENT_BUS = new GlobalEventBus();
+
+    private final EventBus eventBus = new AsyncEventBus(IDENTIFIER, Executors.newCachedThreadPool());
+
+    private GlobalEventBus() {
+    }
+
+    public static GlobalEventBus getInstance() {
+        return GlobalEventBus.GLOBAL_EVENT_BUS;
+    }
+
+    public static EventBus getEventBus() {
+        return GlobalEventBus.GLOBAL_EVENT_BUS.eventBus;
+    }
+
+    public static void subscribe(Object obj) {
+        getEventBus().register(obj);
+    }
+    public static void unsubscribe(Object obj) {
+        getEventBus().unregister(obj);
+    }
+    public static void post(Object event) {
+        getEventBus().post(event);
+    }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanFactoryPostProcessor.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanFactoryPostProcessor.java
new file mode 100644
index 0000000000..fba31fde6a
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanFactoryPostProcessor.java
@@ -0,0 +1,63 @@
+package com.baeldung.postprocessor;
+
+import com.google.common.eventbus.EventBus;
+
+import java.util.Iterator;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.Advised;
+import org.springframework.aop.support.AopUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionException;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+
+@SuppressWarnings("ALL")
+public class GuavaEventBusBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    private final SpelExpressionParser expressionParser = new SpelExpressionParser();
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+        for (Iterator<String> names = beanFactory.getBeanNamesIterator(); names.hasNext(); ) {
+            Object proxy = this.getTargetObject(beanFactory.getBean(names.next()));
+            final Subscriber annotation = AnnotationUtils.getAnnotation(proxy.getClass(), Subscriber.class);
+            if (annotation == null)
+                continue;
+            this.logger.info("{}: processing bean of type {} during initialization", this.getClass().getSimpleName(),
+              proxy.getClass().getName());
+            final String annotationValue = annotation.value();
+            try {
+                final Expression expression = this.expressionParser.parseExpression(annotationValue);
+                final Object value = expression.getValue();
+                if (!(value instanceof EventBus)) {
+                    this.logger.error("{}: expression {} did not evaluate to an instance of EventBus for bean of type {}",
+                      this.getClass().getSimpleName(), annotationValue, proxy.getClass().getSimpleName());
+                    return;
+                }
+                final EventBus eventBus = (EventBus)value;
+                eventBus.register(proxy);
+            } catch (ExpressionException ex) {
+                this.logger.error("{}: unable to parse/evaluate expression {} for bean of type {}", this.getClass().getSimpleName(),
+                  annotationValue, proxy.getClass().getName());
+            }
+        }
+    }
+
+    private Object getTargetObject(Object proxy) throws BeansException {
+        if (AopUtils.isJdkDynamicProxy(proxy)) {
+            try {
+                return ((Advised)proxy).getTargetSource().getTarget();
+            } catch (Exception e) {
+                throw new FatalBeanException("Error getting target of JDK proxy", e);
+            }
+        }
+        return proxy;
+    }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanPostProcessor.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanPostProcessor.java
new file mode 100644
index 0000000000..677c839444
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/GuavaEventBusBeanPostProcessor.java
@@ -0,0 +1,87 @@
+package com.baeldung.postprocessor;
+
+import com.google.common.eventbus.EventBus;
+
+import java.util.function.BiConsumer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.Advised;
+import org.springframework.aop.support.AopUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionException;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+
+/**
+ * A {@link DestructionAwareBeanPostProcessor} which registers/un-registers subscribers to a Guava {@link EventBus}. The class must
+ * be annotated with {@link Subscriber} and each subscribing method must be annotated with
+ * {@link com.google.common.eventbus.Subscribe}.
+ */
+@SuppressWarnings("ALL")
+public class GuavaEventBusBeanPostProcessor implements DestructionAwareBeanPostProcessor {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    private final SpelExpressionParser expressionParser = new SpelExpressionParser();
+
+    @Override
+    public void postProcessBeforeDestruction(final Object bean, final String beanName) throws BeansException {
+        this.process(bean, EventBus::unregister, "destruction");
+    }
+
+    @Override
+    public boolean requiresDestruction(Object bean) {
+        return true;
+    }
+
+    @Override
+    public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {
+        return bean;
+    }
+
+    @Override
+    public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
+        this.process(bean, EventBus::register, "initialization");
+        return bean;
+    }
+
+    private void process(final Object bean, final BiConsumer<EventBus, Object> consumer, final String action) {
+        Object proxy = this.getTargetObject(bean);
+        final Subscriber annotation = AnnotationUtils.getAnnotation(proxy.getClass(), Subscriber.class);
+        if (annotation == null)
+            return;
+        this.logger.info("{}: processing bean of type {} during {}", this.getClass().getSimpleName(), proxy.getClass().getName(),
+          action);
+        final String annotationValue = annotation.value();
+        try {
+            final Expression expression = this.expressionParser.parseExpression(annotationValue);
+            final Object value = expression.getValue();
+            if (!(value instanceof EventBus)) {
+                this.logger.error("{}: expression {} did not evaluate to an instance of EventBus for bean of type {}",
+                  this.getClass().getSimpleName(), annotationValue, proxy.getClass().getSimpleName());
+                return;
+            }
+            final EventBus eventBus = (EventBus)value;
+            consumer.accept(eventBus, proxy);
+        } catch (ExpressionException ex) {
+            this.logger.error("{}: unable to parse/evaluate expression {} for bean of type {}", this.getClass().getSimpleName(),
+              annotationValue, proxy.getClass().getName());
+        }
+    }
+
+    private Object getTargetObject(Object proxy) throws BeansException {
+        if (AopUtils.isJdkDynamicProxy(proxy)) {
+            try {
+                return ((Advised)proxy).getTargetSource().getTarget();
+            } catch (Exception e) {
+                throw new FatalBeanException("Error getting target of JDK proxy", e);
+            }
+        }
+        return proxy;
+    }
+}
+
+
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTrade.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTrade.java
new file mode 100644
index 0000000000..7711cf7101
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTrade.java
@@ -0,0 +1,34 @@
+package com.baeldung.postprocessor;
+
+import java.util.Date;
+
+public class StockTrade {
+
+    private final String symbol;
+    private final int quantity;
+    private final double price;
+    private final Date tradeDate;
+
+    public StockTrade(String symbol, int quantity, double price, Date tradeDate) {
+        this.symbol = symbol;
+        this.quantity = quantity;
+        this.price = price;
+        this.tradeDate = tradeDate;
+    }
+
+    public String getSymbol() {
+        return this.symbol;
+    }
+
+    public int getQuantity() {
+        return this.quantity;
+    }
+
+    public double getPrice() {
+        return this.price;
+    }
+
+    public Date getTradeDate() {
+        return this.tradeDate;
+    }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradeListener.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradeListener.java
new file mode 100644
index 0000000000..bf34d66f24
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradeListener.java
@@ -0,0 +1,7 @@
+package com.baeldung.postprocessor;
+
+@FunctionalInterface
+public interface StockTradeListener {
+
+    void stockTradePublished(StockTrade trade);
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradePublisher.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradePublisher.java
new file mode 100644
index 0000000000..bf339872d9
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/StockTradePublisher.java
@@ -0,0 +1,36 @@
+package com.baeldung.postprocessor;
+
+import com.google.common.eventbus.AllowConcurrentEvents;
+import com.google.common.eventbus.Subscribe;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Subscriber
+public class StockTradePublisher {
+
+    private final Set<StockTradeListener> stockTradeListeners = new HashSet<>();
+
+    public void addStockTradeListener(StockTradeListener listener) {
+        synchronized (this.stockTradeListeners) {
+            this.stockTradeListeners.add(listener);
+        }
+    }
+
+    public void removeStockTradeListener(StockTradeListener listener) {
+        synchronized (this.stockTradeListeners) {
+            this.stockTradeListeners.remove(listener);
+        }
+    }
+
+    @Subscribe
+    @AllowConcurrentEvents
+    private void handleNewStockTradeEvent(StockTrade trade) {
+        // publish to DB, send to PubNub, whatever you want here
+        final Set<StockTradeListener> listeners;
+        synchronized (this.stockTradeListeners) {
+            listeners = new HashSet<>(this.stockTradeListeners);
+        }
+        listeners.forEach(li -> li.stockTradePublished(trade));
+    }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/postprocessor/Subscriber.java b/spring-core-4/src/main/java/com/baeldung/postprocessor/Subscriber.java
new file mode 100644
index 0000000000..bef38333d6
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/postprocessor/Subscriber.java
@@ -0,0 +1,21 @@
+package com.baeldung.postprocessor;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * An annotation which indicates which Guava {@link com.google.common.eventbus.EventBus} a Spring bean wishes to subscribe to.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface Subscriber {
+
+    /**
+     * A SpEL expression which selects the {@link com.google.common.eventbus.EventBus}.
+     */
+    String value() default GlobalEventBus.GLOBAL_EVENT_BUS_EXPRESSION;
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/postprocessor/PostProcessorConfiguration.java b/spring-core-4/src/test/java/com/baeldung/postprocessor/PostProcessorConfiguration.java
new file mode 100644
index 0000000000..b28e36663a
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/postprocessor/PostProcessorConfiguration.java
@@ -0,0 +1,23 @@
+package com.baeldung.postprocessor;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class PostProcessorConfiguration {
+
+    @Bean
+    public GlobalEventBus eventBus() {
+        return GlobalEventBus.getInstance();
+    }
+
+    @Bean
+    public GuavaEventBusBeanPostProcessor eventBusBeanPostProcessor() {
+        return new GuavaEventBusBeanPostProcessor();
+    }
+
+    @Bean
+    public StockTradePublisher stockTradePublisher() {
+        return new StockTradePublisher();
+    }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/postprocessor/StockTradeIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/postprocessor/StockTradeIntegrationTest.java
new file mode 100644
index 0000000000..ae3cd968dc
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/postprocessor/StockTradeIntegrationTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.postprocessor;
+
+import java.time.Duration;
+import java.util.Date;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = {PostProcessorConfiguration.class})
+public class StockTradeIntegrationTest {
+
+    @Autowired
+    private StockTradePublisher stockTradePublisher;
+
+    @Test
+    public void givenValidConfig_whenTradePublished_thenTradeReceived() {
+        Date tradeDate = new Date();
+        StockTrade stockTrade = new StockTrade("AMZN", 100, 2483.52d, tradeDate);
+        AtomicBoolean assertionsPassed = new AtomicBoolean(false);
+        StockTradeListener listener = trade -> assertionsPassed.set(this.verifyExact(stockTrade, trade));
+        this.stockTradePublisher.addStockTradeListener(listener);
+        try {
+            GlobalEventBus.post(stockTrade);
+            await().atMost(Duration.ofSeconds(2L))
+              .untilAsserted(() -> assertThat(assertionsPassed.get()).isTrue());
+        } finally {
+            this.stockTradePublisher.removeStockTradeListener(listener);
+        }
+    }
+
+    private boolean verifyExact(StockTrade stockTrade, StockTrade trade) {
+        return Objects.equals(stockTrade.getSymbol(), trade.getSymbol())
+          && Objects.equals(stockTrade.getTradeDate(), trade.getTradeDate())
+          && stockTrade.getQuantity() == trade.getQuantity()
+          && stockTrade.getPrice() == trade.getPrice();
+    }
+}

From 6076d4da3b11817b868c6ea7d5769df9a5fa97c7 Mon Sep 17 00:00:00 2001
From: Carlos Cavero <carlos.cavero@atos.net>
Date: Fri, 29 May 2020 00:02:11 +0200
Subject: [PATCH 404/404] BAEL-3756-YAML-for-Spring-DevOps (#9368)

* Add modifications to include the configuration for YAML and DevOps

* Clean the Dockerfile

* Modify the name of testing environment and include YAML tests
---
 .../spring-boot-properties/.dockerignore      | 13 ++++++++++
 .../spring-boot-properties/Dockerfile         | 10 ++++++++
 .../spring-boot-properties/pom.xml            |  3 ++-
 .../src/main/resources/application.yml        | 19 +++++++++++++-
 .../baeldung/yaml/YAMLDevIntegrationTest.java | 25 +++++++++++++++++++
 .../baeldung/yaml/YAMLIntegrationTest.java    | 24 ++++++++++++++++++
 6 files changed, 92 insertions(+), 2 deletions(-)
 create mode 100644 spring-boot-modules/spring-boot-properties/.dockerignore
 create mode 100644 spring-boot-modules/spring-boot-properties/Dockerfile
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLDevIntegrationTest.java
 create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLIntegrationTest.java

diff --git a/spring-boot-modules/spring-boot-properties/.dockerignore b/spring-boot-modules/spring-boot-properties/.dockerignore
new file mode 100644
index 0000000000..df36044e46
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/.dockerignore
@@ -0,0 +1,13 @@
+# Logs
+logs
+*.log
+
+# Git
+.git
+.cache
+
+# Classes 
+**/*.class
+
+# Ignore md files
+*.md
diff --git a/spring-boot-modules/spring-boot-properties/Dockerfile b/spring-boot-modules/spring-boot-properties/Dockerfile
new file mode 100644
index 0000000000..d6bd2a95ae
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/Dockerfile
@@ -0,0 +1,10 @@
+FROM maven:3.6.0-jdk-11
+WORKDIR /code/spring-boot-modules/spring-boot-properties/
+COPY ./spring-boot-modules/spring-boot-properties/pom.xml .
+COPY ./spring-boot-modules/spring-boot-properties/src ./src
+COPY ./parent-boot-2/pom.xml /code/parent-boot-2/pom.xml
+COPY ./pom.xml /code/pom.xml
+COPY ./custom-pmd-0.0.1.jar /code/custom-pmd-0.0.1.jar
+COPY ./baeldung-pmd-rules.xml /code/baeldung-pmd-rules.xml
+RUN mvn dependency:resolve
+CMD ["mvn", "spring-boot:run"]
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml
index ef9c084f4c..98d328bd19 100644
--- a/spring-boot-modules/spring-boot-properties/pom.xml
+++ b/spring-boot-modules/spring-boot-properties/pom.xml
@@ -128,7 +128,8 @@
         <httpcore.version>4.4.11</httpcore.version>
         <resource.delimiter>@</resource.delimiter>
         <configuration-processor.version>2.2.4.RELEASE</configuration-processor.version>
-        <start-class>com.baeldung.buildproperties.Application</start-class>
+<!--         <start-class>com.baeldung.buildproperties.Application</start-class>  -->
+        <start-class>com.baeldung.yaml.MyApplication</start-class>
     </properties>
 
 </project>
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/application.yml b/spring-boot-modules/spring-boot-properties/src/main/resources/application.yml
index 6fc6f67cd0..4914ff15f7 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/application.yml
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/application.yml
@@ -1,7 +1,14 @@
+spring:
+  profiles:
+    active:
+    - test
+
+---
+
 spring:
     profiles: test
 name: test-YAML
-environment: test
+environment: testing
 servers:
     - www.abc.test.com
     - www.xyz.test.com
@@ -15,3 +22,13 @@ environment: production
 servers:
     - www.abc.com
     - www.xyz.com
+    
+---
+
+spring:
+    profiles: dev
+name: ${DEV_NAME:dev-YAML}
+environment: development
+servers:
+    - www.abc.dev.com
+    - www.xyz.dev.com
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLDevIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLDevIntegrationTest.java
new file mode 100644
index 0000000000..8dfc4c2208
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLDevIntegrationTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.yaml;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = MyApplication.class)
+@TestPropertySource(properties = {"spring.profiles.active = dev"})
+class YAMLDevIntegrationTest {
+
+    @Autowired
+    private YAMLConfig config;
+    
+    @Test
+    void whenProfileTest_thenNameTesting() {
+        assertTrue("development".equalsIgnoreCase(config.getEnvironment()));
+        assertTrue("dev-YAML".equalsIgnoreCase(config.getName()));
+    }
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLIntegrationTest.java
new file mode 100644
index 0000000000..090d5c592e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/yaml/YAMLIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.yaml;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = MyApplication.class)
+class YAMLIntegrationTest {
+
+    @Autowired
+    private YAMLConfig config;
+    
+    @Test
+    void whenProfileTest_thenNameTesting() {
+        assertTrue("testing".equalsIgnoreCase(config.getEnvironment()));
+        assertTrue("test-YAML".equalsIgnoreCase(config.getName()));
+    }
+}