diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md
index 00b785c1b2..dd5bbac162 100644
--- a/algorithms-miscellaneous-3/README.md
+++ b/algorithms-miscellaneous-3/README.md
@@ -13,6 +13,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
- [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle)
- [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique)
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
-- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
diff --git a/apache-olingo/olingo2/README.md b/apache-olingo/olingo2/README.md
deleted file mode 100644
index 826cd0133e..0000000000
--- a/apache-olingo/olingo2/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Intro to OData with Olingo](https://www.baeldung.com/olingo)
diff --git a/cas/cas-server/README.md b/cas/cas-server/README.md
deleted file mode 100644
index b224738732..0000000000
--- a/cas/cas-server/README.md
+++ /dev/null
@@ -1,146 +0,0 @@
-CAS Overlay Template [](https://travis-ci.org/apereo/cas-overlay-template)
-=======================
-
-Generic CAS WAR overlay to exercise the latest versions of CAS. This overlay could be freely used as a starting template for local CAS war overlays.
-
-# Versions
-
-- CAS `6.1.x`
-- JDK `11`
-
-# Overview
-
-To build the project, use:
-
-```bash
-# Use --refresh-dependencies to force-update SNAPSHOT versions
-./gradlew[.bat] clean build
-```
-
-To see what commands are available to the build script, run:
-
-```bash
-./gradlew[.bat] tasks
-```
-
-To launch into the CAS command-line shell:
-
-```bash
-./gradlew[.bat] downloadShell runShell
-```
-
-To fetch and overlay a CAS resource or view, use:
-
-```bash
-./gradlew[.bat] getResource -PresourceName=[resource-name]
-```
-
-To list all available CAS views and templates:
-
-```bash
-./gradlew[.bat] listTemplateViews
-```
-
-To unzip and explode the CAS web application file and the internal resources jar:
-
-```bash
-./gradlew[.bat] explodeWar
-```
-
-# Configuration
-
-- The `etc` directory contains the configuration files and directories that need to be copied to `/etc/cas/config`.
-
-```bash
-./gradlew[.bat] copyCasConfiguration
-```
-
-- The specifics of the build are controlled using the `gradle.properties` file.
-
-## Adding Modules
-
-CAS modules may be specified under the `dependencies` block of the [Gradle build script](build.gradle):
-
-```gradle
-dependencies {
- compile "org.apereo.cas:cas-server-some-module:${project.casVersion}"
- ...
-}
-```
-
-To collect the list of all project modules and dependencies:
-
-```bash
-./gradlew[.bat] allDependencies
-```
-
-### Clear Gradle Cache
-
-If you need to, on Linux/Unix systems, you can delete all the existing artifacts (artifacts and metadata) Gradle has downloaded using:
-
-```bash
-# Only do this when absolutely necessary
-rm -rf $HOME/.gradle/caches/
-```
-
-Same strategy applies to Windows too, provided you switch `$HOME` to its equivalent in the above command.
-
-# Deployment
-
-- Create a keystore file `thekeystore` under `/etc/cas`. Use the password `changeit` for both the keystore and the key/certificate entries. This can either be done using the JDK's `keytool` utility or via the following command:
-
-```bash
-./gradlew[.bat] createKeystore
-```
-
-- Ensure the keystore is loaded up with keys and certificates of the server.
-
-On a successful deployment via the following methods, CAS will be available at:
-
-* `https://cas.server.name:8443/cas`
-
-## Executable WAR
-
-Run the CAS web application as an executable WAR:
-
-```bash
-./gradlew[.bat] run
-```
-
-Debug the CAS web application as an executable WAR:
-
-```bash
-./gradlew[.bat] debug
-```
-
-Run the CAS web application as a *standalone* executable WAR:
-
-```bash
-./gradlew[.bat] clean executable
-```
-
-## External
-
-Deploy the binary web application file `cas.war` after a successful build to a servlet container of choice.
-
-## Docker
-
-The following strategies outline how to build and deploy CAS Docker images.
-
-### Jib
-
-The overlay embraces the [Jib Gradle Plugin](https://github.com/GoogleContainerTools/jib) to provide easy-to-use out-of-the-box tooling for building CAS docker images. Jib is an open-source Java containerizer from Google that lets Java developers build containers using the tools they know. It is a container image builder that handles all the steps of packaging your application into a container image. It does not require you to write a Dockerfile or have Docker installed, and it is directly integrated into the overlay.
-
-```bash
-./gradlew build jibDockerBuild
-```
-
-### Dockerfile
-
-You can also use the native Docker tooling and the provided `Dockerfile` to build and run CAS.
-
-```bash
-chmod +x *.sh
-./docker-build.sh
-./docker-run.sh
-```
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java
new file mode 100644
index 0000000000..ef5dbb754c
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java
@@ -0,0 +1,56 @@
+package com.baeldung.java14.helpfulnullpointerexceptions;
+
+public class HelpfulNullPointerException {
+
+ public static void main(String[] args) {
+ Employee employee = null;
+ employee.getName();
+ }
+
+ public String getEmployeeEmailAddress(Employee employee) {
+ String emailAddress = employee.getPersonalDetails().getEmailAddress().toLowerCase();
+ return emailAddress;
+ }
+
+ static class Employee {
+ String name;
+ PersonalDetails personalDetails;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public PersonalDetails getPersonalDetails() {
+ return personalDetails;
+ }
+
+ public void setPersonalDetails(PersonalDetails personalDetails) {
+ this.personalDetails = personalDetails;
+ }
+ }
+
+ static class PersonalDetails {
+ String emailAddress;
+ String phone;
+
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+ public void setEmailAddress(String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+ }
+}
diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java
new file mode 100644
index 0000000000..fae331bb92
--- /dev/null
+++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.java14.helpfulnullpointerexceptions;
+
+import org.junit.Test;
+
+import static com.baeldung.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.Employee;
+import static com.baeldung.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.PersonalDetails;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class HelpfulNullPointerExceptionUnitTest {
+
+ @Test (expected = NullPointerException.class)
+ public void givenAnEmptyPersonalDetails_whenEmailAddressIsAccessed_thenThrowNPE() {
+ var helpfulNPE = new HelpfulNullPointerException();
+
+ var employee = new Employee();
+ employee.setName("Eduard");
+ employee.setPersonalDetails(new PersonalDetails());
+ helpfulNPE.getEmployeeEmailAddress(employee);
+ }
+
+ @Test
+ public void givenCompletePersonalDetails_whenEmailAddressIsAccessed_thenSuccess() {
+ var helpfulNPE = new HelpfulNullPointerException();
+ var emailAddress = "eduard@gmx.com";
+
+ var employee = new Employee();
+ employee.setName("Eduard");
+
+ var personalDetails = new PersonalDetails();
+ personalDetails.setEmailAddress(emailAddress.toUpperCase());
+ personalDetails.setPhone("1234");
+ employee.setPersonalDetails(personalDetails);
+
+ assertThat(helpfulNPE.getEmployeeEmailAddress(employee)).isEqualTo(emailAddress);
+ }
+
+}
diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md
index 961941aac7..c1c09d2192 100644
--- a/core-java-modules/core-java-8-2/README.md
+++ b/core-java-modules/core-java-8-2/README.md
@@ -4,7 +4,6 @@ This module contains articles about Java 8 core features
### Relevant Articles:
-- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution)
- [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments)
- [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit)
- [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface)
diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md
index de5daddb38..e5f6126811 100644
--- a/core-java-modules/core-java-collections-2/README.md
+++ b/core-java-modules/core-java-collections-2/README.md
@@ -12,4 +12,3 @@
- [Sorting in Java](https://www.baeldung.com/java-sorting)
- [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size)
- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections)
-- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream)
diff --git a/java-collections-maps-2/README.md b/core-java-modules/core-java-collections-maps-2/README.md
similarity index 86%
rename from java-collections-maps-2/README.md
rename to core-java-modules/core-java-collections-maps-2/README.md
index 8b33276f56..f49ba25c8c 100644
--- a/java-collections-maps-2/README.md
+++ b/core-java-modules/core-java-collections-maps-2/README.md
@@ -13,5 +13,4 @@ This module contains articles about Map data structures in Java.
- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort)
- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max)
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
-- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap)
-- More articles: [[<-- prev>]](/../java-collections-maps)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps) [[next -->]](/core-java-modules/core-java-collections-maps-3)
diff --git a/java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml
similarity index 94%
rename from java-collections-maps-2/pom.xml
rename to core-java-modules/core-java-collections-maps-2/pom.xml
index a246559f61..a08a4ac072 100644
--- a/java-collections-maps-2/pom.xml
+++ b/core-java-modules/core-java-collections-maps-2/pom.xml
@@ -3,16 +3,16 @@
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">
4.0.0
- java-collections-maps-2
+ core-java-collections-maps-2
0.1.0-SNAPSHOT
- java-collections-maps-2
+ core-java-collections-maps-2
jar
com.baeldung
parent-java
0.0.1-SNAPSHOT
- ../parent-java
+ ../../parent-java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
similarity index 100%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
rename to core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
rename to core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
diff --git a/core-java-modules/core-java-collections-maps-3/README.md b/core-java-modules/core-java-collections-maps-3/README.md
new file mode 100644
index 0000000000..64a3b75d83
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-3/README.md
@@ -0,0 +1,8 @@
+## Java Collections Cookbooks and Examples
+
+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)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2)
diff --git a/core-java-modules/core-java-collections-maps-3/pom.xml b/core-java-modules/core-java-collections-maps-3/pom.xml
new file mode 100644
index 0000000000..95414c12c2
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-3/pom.xml
@@ -0,0 +1,26 @@
+
+
+ 4.0.0
+ core-java-collections-maps-3
+ 0.1.0-SNAPSHOT
+ core-java-collections-maps-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
rename to core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
similarity index 100%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
rename to core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
diff --git a/java-collections-maps/README.md b/core-java-modules/core-java-collections-maps/README.md
similarity index 87%
rename from java-collections-maps/README.md
rename to core-java-modules/core-java-collections-maps/README.md
index dfd0d47dbc..828f8992e1 100644
--- a/java-collections-maps/README.md
+++ b/core-java-modules/core-java-collections-maps/README.md
@@ -10,8 +10,7 @@ This module contains articles about Map data structures in Java.
- [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys)
- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value)
- [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists)
-- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps)
- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps)
- [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map)
- [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap-advanced)
-- More articles: [[next -->]](/../java-collections-maps-2)
+- More articles: [[next -->]](/core-java-modules/core-java-collections-maps-2)
diff --git a/java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml
similarity index 87%
rename from java-collections-maps/pom.xml
rename to core-java-modules/core-java-collections-maps/pom.xml
index 38cf1c38ad..c0dd705c1c 100644
--- a/java-collections-maps/pom.xml
+++ b/core-java-modules/core-java-collections-maps/pom.xml
@@ -2,16 +2,16 @@
4.0.0
- java-collections-maps
+ core-java-collections-maps
0.1.0-SNAPSHOT
- java-collections-maps
+ core-java-collections-maps
jar
-
+
com.baeldung
parent-java
0.0.1-SNAPSHOT
- ../parent-java
+ ../../parent-java
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
similarity index 100%
rename from java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
rename to core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
similarity index 100%
rename from java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
rename to core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
similarity index 100%
rename from java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
rename to core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
diff --git a/java-collections-maps/src/main/resources/logback.xml b/core-java-modules/core-java-collections-maps/src/main/resources/logback.xml
similarity index 100%
rename from java-collections-maps/src/main/resources/logback.xml
rename to core-java-modules/core-java-collections-maps/src/main/resources/logback.xml
diff --git a/java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
similarity index 100%
rename from java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md
index 340c2b286e..12e3c5ac17 100644
--- a/core-java-modules/core-java-collections/README.md
+++ b/core-java-modules/core-java-collections/README.md
@@ -3,7 +3,6 @@
This module contains articles about Java collections
### Relevant Articles:
-- [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection)
- [Introduction to the Java ArrayDeque](https://www.baeldung.com/java-array-deque)
- [An Introduction to Java.util.Hashtable Class](https://www.baeldung.com/java-hash-table)
- [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe)
@@ -13,4 +12,4 @@ This module contains articles about Java collections
- [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack)
- [Guide to the Java Queue Interface](https://www.baeldung.com/java-queue)
- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
-- [[More -->]](/core-java-modules/core-java-collections-2)
\ No newline at end of file
+- [[More -->]](/core-java-modules/core-java-collections-2)
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java
new file mode 100644
index 0000000000..f0493d4911
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java
@@ -0,0 +1,25 @@
+package com.baeldung.concurrent.volatilekeyword;
+
+public class TaskRunner {
+
+ private static int number;
+ private volatile static boolean ready;
+
+ private static class Reader extends Thread {
+
+ @Override
+ public void run() {
+ while (!ready) {
+ Thread.yield();
+ }
+
+ System.out.println(number);
+ }
+ }
+
+ public static void main(String[] args) {
+ new Reader().start();
+ number = 42;
+ ready = true;
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-collections-2/README.md b/core-java-modules/core-java-concurrency-collections-2/README.md
new file mode 100644
index 0000000000..91da6c623c
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-collections-2/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Lock Striping](https://www.baeldung.com/java-lock-stripping)
diff --git a/core-java-modules/core-java-io-2/README.md b/core-java-modules/core-java-io-2/README.md
index 62461be0ff..84cabc5992 100644
--- a/core-java-modules/core-java-io-2/README.md
+++ b/core-java-modules/core-java-io-2/README.md
@@ -12,4 +12,5 @@ This module contains articles about core Java input and output (IO)
- [Java – Append Data to a File](https://www.baeldung.com/java-append-to-file)
- [How to Copy a File with Java](https://www.baeldung.com/java-copy-file)
- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
+- [Java IO vs NIO](https://www.baeldung.com/java-io-vs-nio)
- [[<-- Prev]](/core-java-modules/core-java-io)
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java
index ab4ea2b657..a26b0a74b0 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java
@@ -1,8 +1,12 @@
package com.baeldung.comparelong;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
import org.junit.Test;
+import java.util.Objects;
+
public class CompareLongUnitTest {
@Test
@@ -32,6 +36,33 @@ public class CompareLongUnitTest {
assertThat(l1.equals(l2)).isTrue();
}
+ @Test
+ public void givenLongValuesLessThan128_whenUsingObjectsEquals_thenSuccess() {
+
+ Long l1 = 127L;
+ Long l2 = 127L;
+
+ assertThat(Objects.equals(l1, l2)).isTrue();
+ }
+
+ @Test
+ public void givenLongValuesGreaterOrEqualsThan128_whenUsingObjectsEquals_thenSuccess() {
+
+ Long l1 = 128L;
+ Long l2 = 128L;
+
+ assertThat(Objects.equals(l1, l2)).isTrue();
+ }
+
+ @Test
+ public void givenNullReference_whenUsingObjectsEquals_thenNoException() {
+
+ Long l1 = null;
+ Long l2 = 128L;
+
+ assertThatCode(() -> Objects.equals(l1, l2)).doesNotThrowAnyException();
+ }
+
@Test
public void givenLongValuesGreaterOrEqualsThan128_whenUsingComparisonOperator_andLongValue_thenSuccess() {
diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md
index c250e24078..2eb21fb77e 100644
--- a/core-java-modules/core-java-security-2/README.md
+++ b/core-java-modules/core-java-security-2/README.md
@@ -1,3 +1,11 @@
+## Core Java Security
+
+This module contains articles about core Java Security
+
### Relevant Articles:
- [Guide To The Java Authentication And Authorization Service (JAAS)](https://www.baeldung.com/java-authentication-authorization-service)
+- [MD5 Hashing in Java](http://www.baeldung.com/java-md5)
+- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing)
+- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
+- More articles: [[<-- prev]](/core-java-modules/core-java-security)
diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml
index 23f0c5aab9..5db3b67c04 100644
--- a/core-java-modules/core-java-security-2/pom.xml
+++ b/core-java-modules/core-java-security-2/pom.xml
@@ -16,4 +16,45 @@
../../parent-java
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.1
+
+
+
+
+
+
+
+ 1.60
+ 1.11
+
+
+ 3.10.0
+
+
diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java
new file mode 100644
index 0000000000..d214a0f757
--- /dev/null
+++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java
@@ -0,0 +1,23 @@
+package com.baeldung.checksums;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.CRC32;
+import java.util.zip.CheckedInputStream;
+import java.util.zip.Checksum;
+
+public class ChecksumUtils {
+
+ public static long getChecksumCRC32(byte[] bytes) {
+ Checksum crc32 = new CRC32();
+ crc32.update(bytes, 0, bytes.length);
+ return crc32.getValue();
+ }
+
+ public static long getChecksumCRC32(InputStream stream, int bufferSize) throws IOException {
+ CheckedInputStream checkedInputStream = new CheckedInputStream(stream, new CRC32());
+ byte[] buffer = new byte[bufferSize];
+ while (checkedInputStream.read(buffer, 0, buffer.length) >= 0) {}
+ return checkedInputStream.getChecksum().getValue();
+ }
+}
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA256Hashing.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA256Hashing.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA3Hashing.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA3Hashing.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHACommonUtils.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHACommonUtils.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java
similarity index 100%
rename from core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java
rename to core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java
new file mode 100644
index 0000000000..f5366917f6
--- /dev/null
+++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.checksums;
+
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ChecksumUtilsUnitTest {
+
+ byte[] arr;
+
+ @Before
+ void setUp() {
+ arr = new byte[]{0,10,21,20,35,40,120,56,72,22};
+ }
+
+ @Test
+ void givenByteArray_whenChecksumCreated_checkCorrect() {
+
+ long checksum = ChecksumUtils.getChecksumCRC32(arr);
+
+ assertEquals(3915397664L, checksum);
+ }
+
+ @Test
+ void givenTwoDifferentStrings_whenChecksumCreated_checkCollision() {
+
+ String plumless = "plumless";
+ String buckeroo = "buckeroo";
+
+ long plumlessChecksum = ChecksumUtils.getChecksumCRC32(plumless.getBytes());
+ long buckerooChecksum = ChecksumUtils.getChecksumCRC32(buckeroo.getBytes());
+
+ assertEquals(plumlessChecksum, buckerooChecksum);
+ }
+
+ @Test
+ void givenInputString_whenChecksumCreated_checkCorrect() throws IOException {
+
+ InputStream inputStream = new ByteArrayInputStream(arr);
+ long checksum = ChecksumUtils.getChecksumCRC32(inputStream, 10);
+
+ assertEquals(3915397664L, checksum);
+
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
rename to core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
rename to core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
rename to core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java
rename to core-java-modules/core-java-security-2/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java
rename to core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java
rename to core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java
diff --git a/core-java-modules/core-java-security/src/test/resources/test_md5.txt b/core-java-modules/core-java-security-2/src/test/resources/test_md5.txt
similarity index 100%
rename from core-java-modules/core-java-security/src/test/resources/test_md5.txt
rename to core-java-modules/core-java-security-2/src/test/resources/test_md5.txt
diff --git a/core-java-modules/core-java-security/README.md b/core-java-modules/core-java-security/README.md
index ff9b1eef14..83b12793b5 100644
--- a/core-java-modules/core-java-security/README.md
+++ b/core-java-modules/core-java-security/README.md
@@ -3,17 +3,16 @@
This module contains articles about core Java Security
### Relevant Articles:
-- [MD5 Hashing in Java](http://www.baeldung.com/java-md5)
+
- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class)
- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl)
- [Java KeyStore API](http://www.baeldung.com/java-keystore)
- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream)
-- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing)
- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures)
-- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
- [Enabling TLS v1.2 in Java 7](https://www.baeldung.com/java-7-tls-v12)
- [The Java SecureRandom Class](https://www.baeldung.com/java-secure-random)
- [An Introduction to Java SASL](https://www.baeldung.com/java-sasl)
- [A Guide to Java GSS API](https://www.baeldung.com/java-gss)
- [Intro to the Java SecurityManager](https://www.baeldung.com/java-security-manager)
+- More articles: [[next -->]](/core-java-modules/core-java-security-2)
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index a46c2e2d40..96024a73a1 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/pom.xml
@@ -24,24 +24,9 @@
${assertj-core.version}
test
-
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
-
- org.bouncycastle
- bcprov-jdk15on
- ${bouncycastle.version}
-
-
- 1.60
- 1.11
-
3.10.0
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java
new file mode 100644
index 0000000000..9399908b30
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.streams.bigdecimals;
+
+import static org.junit.Assert.assertEquals;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+public class AddNumbersUnitTest {
+
+ @Test
+ public void givenIntStream_whenSum_thenResultIsCorrect() {
+ IntStream intNumbers = IntStream.range(0, 3);
+ assertEquals(3, intNumbers.sum());
+ }
+
+ @Test
+ public void givenCollectionOfDouble_whenUsingMapToDoubleToSum_thenResultIsCorrect() {
+ List doubleNumbers = Arrays.asList(23.48, 52.26, 13.5);
+ double result = doubleNumbers.stream()
+ .mapToDouble(Double::doubleValue)
+ .sum();
+ assertEquals(89.24, result, .1);
+ }
+
+ public void givenStreamOfIntegers_whenUsingReduceToSum_thenResultIsCorrect() {
+ Stream intNumbers = Stream.of(0, 1, 2);
+ int result = intNumbers.reduce(0, Integer::sum);
+ assertEquals(106, result);
+ }
+
+ public void givenStreamOfBigDecimals_whenUsingReduceToSum_thenResultIsCorrect() {
+ Stream bigDecimalNumber = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
+ BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);
+ assertEquals(11, result);
+ }
+
+}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index ebdb11925b..3fc978a68c 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -42,6 +42,9 @@
core-java-collections-list
core-java-collections-list-2
core-java-collections-list-3
+ core-java-collections-maps
+ core-java-collections-maps-2
+ core-java-collections-maps-3
core-java-concurrency-2
diff --git a/core-kotlin-modules/core-kotlin/README.md b/core-kotlin-modules/core-kotlin/README.md
index 90caccf5c8..151da607ac 100644
--- a/core-kotlin-modules/core-kotlin/README.md
+++ b/core-kotlin-modules/core-kotlin/README.md
@@ -3,7 +3,7 @@
This module contains articles about Kotlin core features.
### Relevant articles:
-- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin-intro)
+- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin/tutorial)
- [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability)
- [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number)
- [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project)
diff --git a/core-scala/README.md b/core-scala/README.md
new file mode 100644
index 0000000000..72b583c22b
--- /dev/null
+++ b/core-scala/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Pattern Matching in Scala](https://www.baeldung.com/scala/pattern-matching)
diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Profile.java b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Profile.java
new file mode 100644
index 0000000000..165c5a9f8f
--- /dev/null
+++ b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Profile.java
@@ -0,0 +1,20 @@
+package com.baeldung.guava.mapmaker;
+
+public class Profile {
+ private long id;
+ private String type;
+
+ public Profile(long id, String type) {
+ this.id = id;
+ this.type = type;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return type;
+ }
+
+}
diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Session.java b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Session.java
new file mode 100644
index 0000000000..a614f431f8
--- /dev/null
+++ b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Session.java
@@ -0,0 +1,13 @@
+package com.baeldung.guava.mapmaker;
+
+public class Session {
+ private long id;
+
+ public Session(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+}
diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/User.java b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/User.java
new file mode 100644
index 0000000000..a7f0435049
--- /dev/null
+++ b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/User.java
@@ -0,0 +1,20 @@
+package com.baeldung.guava.mapmaker;
+
+public class User {
+ private long id;
+ private String name;
+
+ public User(long id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+}
diff --git a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java
new file mode 100644
index 0000000000..754e3ac099
--- /dev/null
+++ b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.guava.mapmaker;
+
+import com.google.common.collect.MapMaker;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.concurrent.ConcurrentMap;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertNotNull;
+
+public class GuavaMapMakerUnitTest {
+ @Test
+ public void whenCreateCaches_thenCreated() {
+ ConcurrentMap sessionCache = new MapMaker().makeMap();
+ assertNotNull(sessionCache);
+
+ ConcurrentMap profileCache = new MapMaker().makeMap();
+ assertNotNull(profileCache);
+
+ User userA = new User(1, "UserA");
+
+ sessionCache.put(userA, new Session(100));
+ Assert.assertThat(sessionCache.size(), equalTo(1));
+
+ profileCache.put(userA, new Profile(1000, "Personal"));
+ Assert.assertThat(profileCache.size(), equalTo(1));
+ }
+
+ @Test
+ public void whenCreateCacheWithInitialCapacity_thenCreated() {
+ ConcurrentMap profileCache = new MapMaker().initialCapacity(100).makeMap();
+ assertNotNull(profileCache);
+ }
+
+ @Test
+ public void whenCreateCacheWithConcurrencyLevel_thenCreated() {
+ ConcurrentMap sessionCache = new MapMaker().concurrencyLevel(10).makeMap();
+ assertNotNull(sessionCache);
+ }
+
+ @Test
+ public void whenCreateCacheWithWeakKeys_thenCreated() {
+ ConcurrentMap sessionCache = new MapMaker().weakKeys().makeMap();
+ assertNotNull(sessionCache);
+ }
+
+ @Test
+ public void whenCreateCacheWithWeakValues_thenCreated() {
+ ConcurrentMap profileCache = new MapMaker().weakValues().makeMap();
+ assertNotNull(profileCache);
+ }
+}
diff --git a/java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java
new file mode 100644
index 0000000000..521f2d37a6
--- /dev/null
+++ b/java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.abstractnumber;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class AbstractNumberUnitTest {
+
+ private final static double DOUBLE_VALUE = 9999.999;
+ private final static float FLOAT_VALUE = 101.99F;
+ private final static long LONG_VALUE = 1000L;
+ private final static int INTEGER_VALUE = 100;
+ private final static short SHORT_VALUE = 127;
+ private final static byte BYTE_VALUE = 120;
+
+ @Test
+ public void givenDoubleValue_whenShortValueUsed_thenShortValueReturned() {
+ Double doubleValue = Double.valueOf(DOUBLE_VALUE);
+ assertEquals(9999, doubleValue.shortValue());
+ }
+
+ @Test
+ public void givenFloatValue_whenByteValueUsed_thenByteValueReturned() {
+ Float floatValue = Float.valueOf(FLOAT_VALUE);
+ assertEquals(101, floatValue.byteValue());
+ }
+
+ @Test
+ public void givenLongValue_whenInitValueUsed_thenInitValueReturned() {
+ Long longValue = Long.valueOf(LONG_VALUE);
+ assertEquals(1000, longValue.intValue());
+ }
+
+ @Test
+ public void givenIntegerValue_whenLongValueUsed_thenLongValueReturned() {
+ Integer integerValue = Integer.valueOf(INTEGER_VALUE);
+ assertEquals(100, integerValue.longValue());
+ }
+
+ @Test
+ public void givenShortValue_whenFloatValueUsed_thenFloatValueReturned() {
+ Short shortValue = Short.valueOf(SHORT_VALUE);
+ assertEquals(127.0F, shortValue.floatValue(), 0);
+ }
+
+ @Test
+ public void givenByteValue_whenDoubleValueUsed_thenDoubleValueReturned() {
+ Byte byteValue = Byte.valueOf(BYTE_VALUE);
+ assertEquals(120.0, byteValue.doubleValue(), 0);
+ }
+
+}
diff --git a/java-numbers/README.md b/java-numbers/README.md
index 8f53006b38..f4b76c3c98 100644
--- a/java-numbers/README.md
+++ b/java-numbers/README.md
@@ -12,4 +12,5 @@ This module contains articles about numbers in Java.
- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root)
- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string)
- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order)
+- [Using Math.sin with Degrees](https://www.baeldung.com/java-math-sin-degrees)
- More articles: [[next -->]](/../java-numbers-2)
diff --git a/jws/pom.xml b/jws/pom.xml
index e6ab7e05ec..f867df8051 100644
--- a/jws/pom.xml
+++ b/jws/pom.xml
@@ -17,7 +17,7 @@
OpenNMS Repository
- http://repo.opennms.org/maven2/
+ https://repo.opennms.org/maven2/
@@ -27,11 +27,6 @@
jnlp-servlet
${jnlp-servlet.version}
-
- javax.samples.jnlp
- jnlp-jardiff
- ${jnlp-jardiff.version}
-
@@ -84,7 +79,6 @@
3.0.2
- 1.6.0
1.6.0
diff --git a/libraries-3/README.md b/libraries-3/README.md
index f3c3375098..62bd3b9f66 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -15,4 +15,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
- [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)
-
+- [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro)
diff --git a/libraries-concurrency/coroutines-with-quasar/pom.xml b/libraries-concurrency/coroutines-with-quasar/pom.xml
new file mode 100644
index 0000000000..59241272e7
--- /dev/null
+++ b/libraries-concurrency/coroutines-with-quasar/pom.xml
@@ -0,0 +1,84 @@
+
+ 4.0.0
+ coroutines-with-quasar
+ coroutines-with-quasar
+
+
+ com.baeldung
+ libraries-concurrency
+ 1.0.0-SNAPSHOT
+
+
+
+
+ co.paralleluniverse
+ quasar-core
+ 0.8.0
+
+
+ co.paralleluniverse
+ quasar-actors
+ 0.8.0
+
+
+ co.paralleluniverse
+ quasar-reactive-streams
+ 0.8.0
+
+
+
+
+
+
+ maven-dependency-plugin
+ 3.1.2
+
+
+ getClasspathFilenames
+
+ properties
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+ com.baeldung.quasar.App
+ target/classes
+ java
+
+
+ -Dco.paralleluniverse.fibers.verifyInstrumentation=true
+
+
+ -javaagent:${co.paralleluniverse:quasar-core:jar}
+
+
+ -classpath
+
+
+
+ com.baeldung.quasar.App
+
+
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 12
+ 12
+
+
+
+
+
diff --git a/libraries-concurrency/coroutines-with-quasar/src/main/java/com/baeldung/quasar/App.java b/libraries-concurrency/coroutines-with-quasar/src/main/java/com/baeldung/quasar/App.java
new file mode 100644
index 0000000000..510877d1be
--- /dev/null
+++ b/libraries-concurrency/coroutines-with-quasar/src/main/java/com/baeldung/quasar/App.java
@@ -0,0 +1,11 @@
+package com.baeldung.quasar;
+
+import co.paralleluniverse.fibers.Fiber;
+
+public class App {
+ public static void main(String[] args) {
+ new Fiber(() -> {
+ System.out.println("Inside fiber coroutine...");
+ }).start();
+ }
+}
diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml
new file mode 100644
index 0000000000..cb59b17674
--- /dev/null
+++ b/libraries-concurrency/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+ libraries-concurrency
+ libraries-concurrency
+ pom
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/linux-bash/command-line-arguments/src/main/bash/README.md b/linux-bash/command-line-arguments/src/main/bash/README.md
new file mode 100644
index 0000000000..27d89fff99
--- /dev/null
+++ b/linux-bash/command-line-arguments/src/main/bash/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [How to Use Command Line Arguments in a Bash Script](https://www.baeldung.com/linux/use-command-line-arguments-in-bash-script)
diff --git a/linux-bash/functions/src/main/bash/README.md b/linux-bash/functions/src/main/bash/README.md
new file mode 100644
index 0000000000..5fb6958b9d
--- /dev/null
+++ b/linux-bash/functions/src/main/bash/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Bash Functions in Linux](https://www.baeldung.com/linux/bash-functions)
diff --git a/linux-bash/read/README.md b/linux-bash/read/README.md
new file mode 100644
index 0000000000..56c1dd5b24
--- /dev/null
+++ b/linux-bash/read/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Guide to the Linux read Command](https://www.baeldung.com/linux/read-command)
diff --git a/linux-bash/text/README.md b/linux-bash/text/README.md
index de99c1962a..20df2a33ec 100644
--- a/linux-bash/text/README.md
+++ b/linux-bash/text/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [Linux Commands – Remove All Text After X](https://www.baeldung.com/linux/tr-manipulate-strings)
+- [Linux Commands for Appending Multiple Lines to a File](https://www.baeldung.com/linux/appending-multiple-lines-to-file2)
diff --git a/logging-modules/log-mdc/README.md b/logging-modules/log-mdc/README.md
index b676d3ba76..0d516619ef 100644
--- a/logging-modules/log-mdc/README.md
+++ b/logging-modules/log-mdc/README.md
@@ -1,7 +1,7 @@
### Relevant Articles:
- TBD
- [Improved Java Logging with Mapped Diagnostic Context (MDC)](https://www.baeldung.com/mdc-in-log4j-2-logback)
-- [Java Logging with Nested Diagnostic Context (NDC)](https:www.baeldung.com/java-logging-ndc-log4j)
+- [Java Logging with Nested Diagnostic Context (NDC)](https://www.baeldung.com/java-logging-ndc-log4j)
- [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel)
### References
diff --git a/lombok/src/main/README.md b/lombok/src/main/README.md
new file mode 100644
index 0000000000..4092d8ce99
--- /dev/null
+++ b/lombok/src/main/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Guide to the Linux wc Command](https://www.baeldung.com/linux/wc-command)
diff --git a/netty/README.md b/netty/README.md
new file mode 100644
index 0000000000..b006c1c686
--- /dev/null
+++ b/netty/README.md
@@ -0,0 +1,6 @@
+## Netty
+
+This module contains articles about Netty.
+
+### Relevant Articles:
+
diff --git a/netty/pom.xml b/netty/pom.xml
new file mode 100644
index 0000000000..1a33eef92e
--- /dev/null
+++ b/netty/pom.xml
@@ -0,0 +1,34 @@
+
+
+ 4.0.0
+ netty
+ 0.0.1-SNAPSHOT
+ netty
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ io.netty
+ netty-all
+ ${netty.version}
+
+
+
+ org.conscrypt
+ conscrypt-openjdk-uber
+ 2.4.0
+
+
+
+
+
+ 4.1.48.Final
+
+
+
\ No newline at end of file
diff --git a/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java b/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java
new file mode 100644
index 0000000000..62b6d4c4ed
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java
@@ -0,0 +1,135 @@
+package com.baeldung.netty.http2;
+
+import static io.netty.handler.logging.LogLevel.INFO;
+
+import java.security.cert.CertificateException;
+
+import javax.net.ssl.SSLException;
+
+import com.baeldung.netty.http2.client.Http2ClientResponseHandler;
+import com.baeldung.netty.http2.client.Http2SettingsHandler;
+import com.baeldung.netty.http2.server.Http2ServerResponseHandler;
+
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPipeline;
+import io.netty.handler.codec.http.DefaultFullHttpRequest;
+import io.netty.handler.codec.http.FullHttpRequest;
+import io.netty.handler.codec.http.HttpHeaderNames;
+import io.netty.handler.codec.http.HttpHeaderValues;
+import io.netty.handler.codec.http.HttpMethod;
+import io.netty.handler.codec.http.HttpScheme;
+import io.netty.handler.codec.http.HttpVersion;
+import io.netty.handler.codec.http2.DefaultHttp2Connection;
+import io.netty.handler.codec.http2.DelegatingDecompressorFrameListener;
+import io.netty.handler.codec.http2.Http2Connection;
+import io.netty.handler.codec.http2.Http2FrameCodecBuilder;
+import io.netty.handler.codec.http2.Http2FrameLogger;
+import io.netty.handler.codec.http2.Http2SecurityUtil;
+import io.netty.handler.codec.http2.HttpConversionUtil;
+import io.netty.handler.codec.http2.HttpToHttp2ConnectionHandler;
+import io.netty.handler.codec.http2.HttpToHttp2ConnectionHandlerBuilder;
+import io.netty.handler.codec.http2.InboundHttp2ToHttpAdapterBuilder;
+import io.netty.handler.ssl.ApplicationProtocolConfig;
+import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol;
+import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior;
+import io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior;
+import io.netty.handler.ssl.ApplicationProtocolNames;
+import io.netty.handler.ssl.ApplicationProtocolNegotiationHandler;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.SslProvider;
+import io.netty.handler.ssl.SupportedCipherSuiteFilter;
+import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import io.netty.handler.ssl.util.SelfSignedCertificate;
+
+public class Http2Util {
+ public static SslContext createSSLContext(boolean isServer) throws SSLException, CertificateException {
+
+ SslContext sslCtx;
+
+ SelfSignedCertificate ssc = new SelfSignedCertificate();
+
+ if (isServer) {
+ sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey())
+ .sslProvider(SslProvider.JDK)
+ .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
+ .applicationProtocolConfig(new ApplicationProtocolConfig(Protocol.ALPN,
+ SelectorFailureBehavior.NO_ADVERTISE,
+ SelectedListenerFailureBehavior.ACCEPT, ApplicationProtocolNames.HTTP_2, ApplicationProtocolNames.HTTP_1_1))
+ .build();
+ } else {
+ sslCtx = SslContextBuilder.forClient()
+ .sslProvider(SslProvider.JDK)
+ .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
+ .trustManager(InsecureTrustManagerFactory.INSTANCE)
+ .applicationProtocolConfig(new ApplicationProtocolConfig(Protocol.ALPN,
+ SelectorFailureBehavior.NO_ADVERTISE,
+ SelectedListenerFailureBehavior.ACCEPT, ApplicationProtocolNames.HTTP_2))
+ .build();
+ }
+ return sslCtx;
+
+ }
+
+ public static ApplicationProtocolNegotiationHandler getServerAPNHandler() {
+ ApplicationProtocolNegotiationHandler serverAPNHandler = new ApplicationProtocolNegotiationHandler(ApplicationProtocolNames.HTTP_2) {
+
+ @Override
+ protected void configurePipeline(ChannelHandlerContext ctx, String protocol) throws Exception {
+ if (ApplicationProtocolNames.HTTP_2.equals(protocol)) {
+ ctx.pipeline()
+ .addLast(Http2FrameCodecBuilder.forServer()
+ .build(), new Http2ServerResponseHandler());
+ return;
+ }
+ throw new IllegalStateException("Protocol: " + protocol + " not supported");
+ }
+ };
+ return serverAPNHandler;
+
+ }
+
+ public static ApplicationProtocolNegotiationHandler getClientAPNHandler(int maxContentLength, Http2SettingsHandler settingsHandler, Http2ClientResponseHandler responseHandler) {
+ final Http2FrameLogger logger = new Http2FrameLogger(INFO, Http2Util.class);
+ final Http2Connection connection = new DefaultHttp2Connection(false);
+
+ HttpToHttp2ConnectionHandler connectionHandler = new HttpToHttp2ConnectionHandlerBuilder()
+ .frameListener(new DelegatingDecompressorFrameListener(connection, new InboundHttp2ToHttpAdapterBuilder(connection).maxContentLength(maxContentLength)
+ .propagateSettings(true)
+ .build()))
+ .frameLogger(logger)
+ .connection(connection)
+ .build();
+
+ ApplicationProtocolNegotiationHandler clientAPNHandler = new ApplicationProtocolNegotiationHandler(ApplicationProtocolNames.HTTP_2) {
+ @Override
+ protected void configurePipeline(ChannelHandlerContext ctx, String protocol) {
+ if (ApplicationProtocolNames.HTTP_2.equals(protocol)) {
+ ChannelPipeline p = ctx.pipeline();
+ p.addLast(connectionHandler);
+ p.addLast(settingsHandler, responseHandler);
+ return;
+ }
+ ctx.close();
+ throw new IllegalStateException("Protocol: " + protocol + " not supported");
+ }
+ };
+
+ return clientAPNHandler;
+
+ }
+
+ public static FullHttpRequest createGetRequest(String host, int port) {
+ FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.valueOf("HTTP/2.0"), HttpMethod.GET, "/", Unpooled.EMPTY_BUFFER);
+ request.headers()
+ .add(HttpHeaderNames.HOST, new String(host + ":" + port));
+ request.headers()
+ .add(HttpConversionUtil.ExtensionHeaderNames.SCHEME.text(), HttpScheme.HTTPS);
+ request.headers()
+ .add(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP);
+ request.headers()
+ .add(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.DEFLATE);
+ return request;
+ }
+}
diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java
new file mode 100644
index 0000000000..d50240fcb2
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java
@@ -0,0 +1,46 @@
+package com.baeldung.netty.http2.client;
+
+import com.baeldung.netty.http2.Http2Util;
+
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelPipeline;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.handler.ssl.SslContext;
+
+public class Http2ClientInitializer extends ChannelInitializer {
+
+ private final SslContext sslCtx;
+ private final int maxContentLength;
+ private Http2SettingsHandler settingsHandler;
+ private Http2ClientResponseHandler responseHandler;
+ private String host;
+ private int port;
+
+ public Http2ClientInitializer(SslContext sslCtx, int maxContentLength, String host, int port) {
+ this.sslCtx = sslCtx;
+ this.maxContentLength = maxContentLength;
+ this.host = host;
+ this.port = port;
+ }
+
+ @Override
+ public void initChannel(SocketChannel ch) throws Exception {
+
+ settingsHandler = new Http2SettingsHandler(ch.newPromise());
+ responseHandler = new Http2ClientResponseHandler();
+
+ if (sslCtx != null) {
+ ChannelPipeline pipeline = ch.pipeline();
+ pipeline.addLast(sslCtx.newHandler(ch.alloc(), host, port));
+ pipeline.addLast(Http2Util.getClientAPNHandler(maxContentLength, settingsHandler, responseHandler));
+ }
+ }
+
+ public Http2SettingsHandler getSettingsHandler() {
+ return settingsHandler;
+ }
+
+ public Http2ClientResponseHandler getResponseHandler() {
+ return responseHandler;
+ }
+}
diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java
new file mode 100644
index 0000000000..4e17155bbc
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java
@@ -0,0 +1,128 @@
+package com.baeldung.netty.http2.client;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http.FullHttpResponse;
+import io.netty.handler.codec.http2.HttpConversionUtil;
+import io.netty.util.CharsetUtil;
+
+public class Http2ClientResponseHandler extends SimpleChannelInboundHandler {
+
+ private final Logger logger = LoggerFactory.getLogger(Http2ClientResponseHandler.class);
+ private final Map streamidMap;
+
+ public Http2ClientResponseHandler() {
+ streamidMap = new HashMap();
+ }
+
+ public MapValues put(int streamId, ChannelFuture writeFuture, ChannelPromise promise) {
+ return streamidMap.put(streamId, new MapValues(writeFuture, promise));
+ }
+
+ public String awaitResponses(long timeout, TimeUnit unit) {
+
+ Iterator> itr = streamidMap.entrySet()
+ .iterator();
+
+ String response = null;
+
+ while (itr.hasNext()) {
+ Entry entry = itr.next();
+ ChannelFuture writeFuture = entry.getValue()
+ .getWriteFuture();
+
+ if (!writeFuture.awaitUninterruptibly(timeout, unit)) {
+ throw new IllegalStateException("Timed out waiting to write for stream id " + entry.getKey());
+ }
+ if (!writeFuture.isSuccess()) {
+ throw new RuntimeException(writeFuture.cause());
+ }
+ ChannelPromise promise = entry.getValue()
+ .getPromise();
+
+ if (!promise.awaitUninterruptibly(timeout, unit)) {
+ throw new IllegalStateException("Timed out waiting for response on stream id " + entry.getKey());
+ }
+ if (!promise.isSuccess()) {
+ throw new RuntimeException(promise.cause());
+ }
+ logger.info("---Stream id: " + entry.getKey() + " received---");
+ response = entry.getValue().getResponse();
+
+ itr.remove();
+ }
+
+ return response;
+
+ }
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext ctx, FullHttpResponse msg) throws Exception {
+ Integer streamId = msg.headers()
+ .getInt(HttpConversionUtil.ExtensionHeaderNames.STREAM_ID.text());
+ if (streamId == null) {
+ logger.error("HttpResponseHandler unexpected message received: " + msg);
+ return;
+ }
+
+ MapValues value = streamidMap.get(streamId);
+
+ if (value == null) {
+ logger.error("Message received for unknown stream id " + streamId);
+ ctx.close();
+ } else {
+ ByteBuf content = msg.content();
+ if (content.isReadable()) {
+ int contentLength = content.readableBytes();
+ byte[] arr = new byte[contentLength];
+ content.readBytes(arr);
+ String response = new String(arr, 0, contentLength, CharsetUtil.UTF_8);
+ logger.info("Response from Server: "+ (response));
+ value.setResponse(response);
+ }
+
+ value.getPromise()
+ .setSuccess();
+ }
+ }
+
+ public static class MapValues {
+ ChannelFuture writeFuture;
+ ChannelPromise promise;
+ String response;
+
+ public String getResponse() {
+ return response;
+ }
+
+ public void setResponse(String response) {
+ this.response = response;
+ }
+
+ public MapValues(ChannelFuture writeFuture2, ChannelPromise promise2) {
+ this.writeFuture = writeFuture2;
+ this.promise = promise2;
+ }
+
+ public ChannelFuture getWriteFuture() {
+ return writeFuture;
+ }
+
+ public ChannelPromise getPromise() {
+ return promise;
+ }
+
+ }
+}
diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java b/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java
new file mode 100644
index 0000000000..93841187c7
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java
@@ -0,0 +1,30 @@
+package com.baeldung.netty.http2.client;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http2.Http2Settings;
+
+import java.util.concurrent.TimeUnit;
+
+public class Http2SettingsHandler extends SimpleChannelInboundHandler {
+ private final ChannelPromise promise;
+
+ public Http2SettingsHandler(ChannelPromise promise) {
+ this.promise = promise;
+ }
+
+ public void awaitSettings(long timeout, TimeUnit unit) throws Exception {
+ if (!promise.awaitUninterruptibly(timeout, unit)) {
+ throw new IllegalStateException("Timed out waiting for settings");
+ }
+ }
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext ctx, Http2Settings msg) throws Exception {
+ promise.setSuccess();
+
+ ctx.pipeline()
+ .remove(this);
+ }
+}
diff --git a/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java b/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java
new file mode 100644
index 0000000000..a8e9e59953
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java
@@ -0,0 +1,59 @@
+package com.baeldung.netty.http2.server;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.netty.http2.Http2Util;
+
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.logging.LogLevel;
+import io.netty.handler.logging.LoggingHandler;
+import io.netty.handler.ssl.SslContext;
+
+public final class Http2Server {
+
+ private static final int PORT = 8443;
+ private static final Logger logger = LoggerFactory.getLogger(Http2Server.class);
+
+ public static void main(String[] args) throws Exception {
+ SslContext sslCtx = Http2Util.createSSLContext(true);
+
+ EventLoopGroup group = new NioEventLoopGroup();
+ try {
+ ServerBootstrap b = new ServerBootstrap();
+ b.option(ChannelOption.SO_BACKLOG, 1024);
+ b.group(group)
+ .channel(NioServerSocketChannel.class)
+ .handler(new LoggingHandler(LogLevel.INFO))
+ .childHandler(new ChannelInitializer() {
+ @Override
+ protected void initChannel(SocketChannel ch) throws Exception {
+ if (sslCtx != null) {
+ ch.pipeline()
+ .addLast(sslCtx.newHandler(ch.alloc()), Http2Util.getServerAPNHandler());
+ }
+ }
+
+ });
+
+ Channel ch = b.bind(PORT)
+ .sync()
+ .channel();
+
+ logger.info("HTTP/2 Server is listening on https://127.0.0.1:" + PORT + '/');
+
+ ch.closeFuture()
+ .sync();
+ } finally {
+ group.shutdownGracefully();
+ }
+ }
+
+}
diff --git a/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java b/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java
new file mode 100644
index 0000000000..24c66f15bb
--- /dev/null
+++ b/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java
@@ -0,0 +1,52 @@
+package com.baeldung.netty.http2.server;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelDuplexHandler;
+import io.netty.channel.ChannelHandler.Sharable;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import io.netty.handler.codec.http2.DefaultHttp2DataFrame;
+import io.netty.handler.codec.http2.DefaultHttp2Headers;
+import io.netty.handler.codec.http2.DefaultHttp2HeadersFrame;
+import io.netty.handler.codec.http2.Http2Headers;
+import io.netty.handler.codec.http2.Http2HeadersFrame;
+import io.netty.util.CharsetUtil;
+
+@Sharable
+public class Http2ServerResponseHandler extends ChannelDuplexHandler {
+
+ static final ByteBuf RESPONSE_BYTES = Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8));
+
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+ super.exceptionCaught(ctx, cause);
+ cause.printStackTrace();
+ ctx.close();
+ }
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+ if (msg instanceof Http2HeadersFrame) {
+ Http2HeadersFrame msgHeader = (Http2HeadersFrame) msg;
+ if (msgHeader.isEndStream()) {
+ ByteBuf content = ctx.alloc()
+ .buffer();
+ content.writeBytes(RESPONSE_BYTES.duplicate());
+
+ Http2Headers headers = new DefaultHttp2Headers().status(HttpResponseStatus.OK.codeAsText());
+ ctx.write(new DefaultHttp2HeadersFrame(headers).stream(msgHeader.stream()));
+ ctx.write(new DefaultHttp2DataFrame(content, true).stream(msgHeader.stream()));
+ }
+
+ } else {
+ super.channelRead(ctx, msg);
+ }
+ }
+
+ @Override
+ public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
+ ctx.flush();
+ }
+
+}
diff --git a/netty/src/main/resources/logback.xml b/netty/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/netty/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java b/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java
new file mode 100644
index 0000000000..6b9a53a1b3
--- /dev/null
+++ b/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java
@@ -0,0 +1,91 @@
+package com.baeldung.netty;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.concurrent.TimeUnit;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.netty.http2.Http2Util;
+import com.baeldung.netty.http2.client.Http2ClientInitializer;
+import com.baeldung.netty.http2.client.Http2ClientResponseHandler;
+import com.baeldung.netty.http2.client.Http2SettingsHandler;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.codec.http.FullHttpRequest;
+import io.netty.handler.ssl.SslContext;
+
+//Ensure the server class - Http2Server.java is already started before running this test
+public class Http2ClientLiveTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(Http2ClientLiveTest.class);
+
+ private static final String HOST = "127.0.0.1";
+ private static final int PORT = 8443;
+ private SslContext sslCtx;
+ private Channel channel;
+
+ @Before
+ public void setup() throws Exception {
+ sslCtx = Http2Util.createSSLContext(false);
+ }
+
+ @Test
+ public void whenRequestSent_thenHelloWorldReceived() throws Exception {
+
+ EventLoopGroup workerGroup = new NioEventLoopGroup();
+ Http2ClientInitializer initializer = new Http2ClientInitializer(sslCtx, Integer.MAX_VALUE, HOST, PORT);
+
+ try {
+ Bootstrap b = new Bootstrap();
+ b.group(workerGroup);
+ b.channel(NioSocketChannel.class);
+ b.option(ChannelOption.SO_KEEPALIVE, true);
+ b.remoteAddress(HOST, PORT);
+ b.handler(initializer);
+
+ channel = b.connect()
+ .syncUninterruptibly()
+ .channel();
+
+ logger.info("Connected to [" + HOST + ':' + PORT + ']');
+
+ Http2SettingsHandler http2SettingsHandler = initializer.getSettingsHandler();
+ http2SettingsHandler.awaitSettings(60, TimeUnit.SECONDS);
+
+ logger.info("Sending request(s)...");
+
+ FullHttpRequest request = Http2Util.createGetRequest(HOST, PORT);
+
+ Http2ClientResponseHandler responseHandler = initializer.getResponseHandler();
+ int streamId = 3;
+
+ responseHandler.put(streamId, channel.write(request), channel.newPromise());
+ channel.flush();
+ String response = responseHandler.awaitResponses(60, TimeUnit.SECONDS);
+
+ assertEquals("Hello World", response);
+
+ logger.info("Finished HTTP/2 request(s)");
+
+ } finally {
+ workerGroup.shutdownGracefully();
+ }
+
+ }
+
+ @After
+ public void cleanup() {
+ channel.close()
+ .syncUninterruptibly();
+ }
+}
diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml
index 27f355bfad..c75655ebc8 100644
--- a/parent-spring-5/pom.xml
+++ b/parent-spring-5/pom.xml
@@ -31,8 +31,8 @@
- 5.2.2.RELEASE
- 5.2.1.RELEASE
+ 5.2.5.RELEASE
+ 5.2.3.RELEASE
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-h2/README.md b/persistence-modules/spring-boot-persistence-h2/README.md
index a0f9c67a33..d11ec1f409 100644
--- a/persistence-modules/spring-boot-persistence-h2/README.md
+++ b/persistence-modules/spring-boot-persistence-h2/README.md
@@ -1,4 +1,5 @@
### Relevant Articles:
- [Access the Same In-Memory H2 Database in Multiple Spring Boot Applications](https://www.baeldung.com/spring-boot-access-h2-database-multiple-apps)
- [Spring Boot With H2 Database](https://www.baeldung.com/spring-boot-h2-database)
-- [Hibernate @NotNull vs @Column(nullable = false)](https://www.baeldung.com/hibernate-notnull-vs-nullable)
\ No newline at end of file
+- [Hibernate @NotNull vs @Column(nullable = false)](https://www.baeldung.com/hibernate-notnull-vs-nullable)
+- [Quick Guide to Hibernate enable_lazy_load_no_trans Property](https://www.baeldung.com/hibernate-lazy-loading-workaround)
diff --git a/persistence-modules/spring-hibernate4/README.md b/persistence-modules/spring-hibernate4/README.md
index cfa13ca3b0..a5a72a9b7e 100644
--- a/persistence-modules/spring-hibernate4/README.md
+++ b/persistence-modules/spring-hibernate4/README.md
@@ -9,7 +9,6 @@ This module contains articles about Spring with Hibernate 4
- [Stored Procedures with Hibernate](https://www.baeldung.com/stored-procedures-with-hibernate-tutorial)
- [Hibernate: save, persist, update, merge, saveOrUpdate](https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate)
- [Eager/Lazy Loading In Hibernate](https://www.baeldung.com/hibernate-lazy-eager-loading)
-- [The DAO with Spring and Hibernate](https://www.baeldung.com/persistence-layer-with-spring-and-hibernate)
- [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa)
### Quick Start
diff --git a/pom.xml b/pom.xml
index 9f132ca7a8..8d4632fb3e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -453,8 +453,6 @@
java-collections-conversions
java-collections-conversions-2
- java-collections-maps
- java-collections-maps-2
javafx
@@ -535,6 +533,7 @@
mybatis
netflix-modules
+
ninja
open-liberty
@@ -964,8 +963,6 @@
java-collections-conversions
java-collections-conversions-2
- java-collections-maps
- java-collections-maps-2
javafx
@@ -1045,6 +1042,7 @@
mybatis
netflix-modules
+
ninja
open-liberty
@@ -1261,6 +1259,7 @@
wildfly
xml
xstream
+ libraries-concurrency
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java
new file mode 100644
index 0000000000..c977d6ecab
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java
@@ -0,0 +1,21 @@
+package org.baeldung.conditionalflow;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ConditionalFlowApplication implements CommandLineRunner {
+ private static Logger logger = LoggerFactory.getLogger(ConditionalFlowApplication.class);
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConditionalFlowApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) throws Exception {
+ logger.info("Running conditional flow application...");
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java
new file mode 100644
index 0000000000..701011b4d3
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java
@@ -0,0 +1,29 @@
+package org.baeldung.conditionalflow;
+
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.StepExecution;
+import org.springframework.batch.core.job.flow.FlowExecutionStatus;
+import org.springframework.batch.core.job.flow.JobExecutionDecider;
+
+public class NumberInfoDecider implements JobExecutionDecider {
+
+ public static final String NOTIFY = "NOTIFY";
+ public static final String QUIET = "QUIET";
+
+ /**
+ * Method that determines notification status of job
+ * @return true if notifications should be sent.
+ */
+ private boolean shouldNotify() {
+ return true;
+ }
+
+ @Override
+ public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
+ if (shouldNotify()) {
+ return new FlowExecutionStatus(NOTIFY);
+ } else {
+ return new FlowExecutionStatus(QUIET);
+ }
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java
new file mode 100644
index 0000000000..906a6e1d28
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java
@@ -0,0 +1,91 @@
+package org.baeldung.conditionalflow.config;
+
+import org.baeldung.conditionalflow.NumberInfoDecider;
+import org.baeldung.conditionalflow.model.NumberInfo;
+import org.baeldung.conditionalflow.step.*;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.Step;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
+import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY;
+
+@Configuration
+@EnableBatchProcessing
+public class NumberInfoConfig {
+
+ @Bean
+ @Qualifier("NotificationStep")
+ public Step notificationStep(StepBuilderFactory sbf) {
+ return sbf.get("Notify step")
+ .tasklet(new NotifierTasklet())
+ .build();
+ }
+
+ public Step numberGeneratorStep(StepBuilderFactory sbf, int[] values, String prepend) {
+ return sbf.get("Number generator")
+ . chunk(1)
+ .reader(new NumberInfoGenerator(values))
+ .processor(new NumberInfoClassifier())
+ .writer(new PrependingStdoutWriter<>(prepend))
+ .build();
+ }
+
+ public Step numberGeneratorStepDecider(StepBuilderFactory sbf, int[] values, String prepend) {
+ return sbf.get("Number generator decider")
+ . chunk(1)
+ .reader(new NumberInfoGenerator(values))
+ .processor(new NumberInfoClassifierWithDecider())
+ .writer(new PrependingStdoutWriter<>(prepend))
+ .build();
+ }
+
+ @Bean
+ @Qualifier("first_job")
+ public Job numberGeneratorNonNotifierJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) {
+ int[] nonNotifierData = { -1, -2, -3 };
+ Step step = numberGeneratorStep(stepBuilderFactory, nonNotifierData, "First Dataset Processor");
+ return jobBuilderFactory.get("Number generator - first dataset")
+ .start(step)
+ .on(NOTIFY)
+ .to(notificationStep)
+ .from(step)
+ .on("*")
+ .stop()
+ .end()
+ .build();
+ }
+
+ @Bean
+ @Qualifier("second_job")
+ public Job numberGeneratorNotifierJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) {
+ int[] billableData = { 11, -2, -3 };
+ Step dataProviderStep = numberGeneratorStep(stepBuilderFactory, billableData, "Second Dataset Processor");
+ return jobBuilderFactory.get("Number generator - second dataset")
+ .start(dataProviderStep)
+ .on(NOTIFY)
+ .to(notificationStep)
+ .end()
+ .build();
+ }
+
+ @Bean
+ @Qualifier("third_job")
+ @Primary
+ public Job numberGeneratorNotifierJobWithDecider(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) {
+ int[] billableData = { 11, -2, -3 };
+ Step dataProviderStep = numberGeneratorStepDecider(stepBuilderFactory, billableData, "Third Dataset Processor");
+ return jobBuilderFactory.get("Number generator - third dataset")
+ .start(dataProviderStep)
+ .next(new NumberInfoDecider())
+ .on(NOTIFY)
+ .to(notificationStep)
+ .end()
+ .build();
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java
new file mode 100644
index 0000000000..4134974386
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java
@@ -0,0 +1,47 @@
+package org.baeldung.conditionalflow.model;
+
+import java.util.Objects;
+
+public class NumberInfo {
+ private int number;
+
+ public NumberInfo(int number) {
+ this.number = number;
+ }
+
+ public static NumberInfo from(int number) {
+ return new NumberInfo(number);
+ }
+
+ public boolean isPositive() {
+ return number > 0;
+ }
+
+ public boolean isEven() {
+ return number % 2 == 0;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ NumberInfo that = (NumberInfo) o;
+ return number == that.number;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(number);
+ }
+
+ @Override
+ public String toString() {
+ return "NumberInfo{" + "number=" + number + '}';
+ }
+}
\ No newline at end of file
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java
new file mode 100644
index 0000000000..0d1db66fe9
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java
@@ -0,0 +1,15 @@
+package org.baeldung.conditionalflow.step;
+
+import org.springframework.batch.core.StepContribution;
+import org.springframework.batch.core.scope.context.ChunkContext;
+import org.springframework.batch.core.step.tasklet.Tasklet;
+import org.springframework.batch.repeat.RepeatStatus;
+
+public class NotifierTasklet implements Tasklet {
+ @Override
+ public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
+ System.err.println("[" + chunkContext.getStepContext()
+ .getJobName() + "] contains interesting data!!");
+ return RepeatStatus.FINISHED;
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java
new file mode 100644
index 0000000000..fdb28263e7
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java
@@ -0,0 +1,35 @@
+package org.baeldung.conditionalflow.step;
+
+import org.baeldung.conditionalflow.model.NumberInfo;
+import org.springframework.batch.core.ExitStatus;
+import org.springframework.batch.core.StepExecution;
+import org.springframework.batch.core.annotation.BeforeStep;
+import org.springframework.batch.core.listener.ItemListenerSupport;
+import org.springframework.batch.item.ItemProcessor;
+
+import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY;
+import static org.baeldung.conditionalflow.NumberInfoDecider.QUIET;
+
+public class NumberInfoClassifier extends ItemListenerSupport
+ implements ItemProcessor {
+ private StepExecution stepExecution;
+
+ @BeforeStep
+ public void beforeStep(StepExecution stepExecution) {
+ this.stepExecution = stepExecution;
+ this.stepExecution.setExitStatus(new ExitStatus(QUIET));
+ }
+
+ @Override
+ public void afterProcess(NumberInfo item, Integer result) {
+ super.afterProcess(item, result);
+ if (item.isPositive()) {
+ stepExecution.setExitStatus(new ExitStatus(NOTIFY));
+ }
+ }
+
+ @Override
+ public Integer process(NumberInfo numberInfo) throws Exception {
+ return Integer.valueOf(numberInfo.getNumber());
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java
new file mode 100644
index 0000000000..4a8b7f1963
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java
@@ -0,0 +1,13 @@
+package org.baeldung.conditionalflow.step;
+
+import org.baeldung.conditionalflow.model.NumberInfo;
+import org.springframework.batch.core.listener.ItemListenerSupport;
+import org.springframework.batch.item.ItemProcessor;
+
+public class NumberInfoClassifierWithDecider extends ItemListenerSupport implements ItemProcessor {
+
+ @Override
+ public Integer process(NumberInfo numberInfo) throws Exception {
+ return Integer.valueOf(numberInfo.getNumber());
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java
new file mode 100644
index 0000000000..606ebf6204
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java
@@ -0,0 +1,23 @@
+package org.baeldung.conditionalflow.step;
+
+import org.baeldung.conditionalflow.model.NumberInfo;
+import org.springframework.batch.item.ItemReader;
+
+public class NumberInfoGenerator implements ItemReader {
+ private int[] values;
+ private int counter;
+
+ public NumberInfoGenerator(int[] values) {
+ this.values = values;
+ counter = 0;
+ }
+
+ @Override
+ public NumberInfo read() {
+ if (counter == values.length) {
+ return null;
+ } else {
+ return new NumberInfo(values[counter++]);
+ }
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java
new file mode 100644
index 0000000000..9ffea1e798
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java
@@ -0,0 +1,20 @@
+package org.baeldung.conditionalflow.step;
+
+import java.util.List;
+
+import org.springframework.batch.item.ItemWriter;
+
+public class PrependingStdoutWriter implements ItemWriter {
+ private String prependText;
+
+ public PrependingStdoutWriter(String prependText) {
+ this.prependText = prependText;
+ }
+
+ @Override
+ public void write(List extends T> list) {
+ for (T listItem : list) {
+ System.out.println(prependText + " " + listItem.toString());
+ }
+ }
+}
diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java
new file mode 100644
index 0000000000..e73cb17494
--- /dev/null
+++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java
@@ -0,0 +1,56 @@
+package org.baeldung.conditionalflow;
+
+import org.baeldung.conditionalflow.config.NumberInfoConfig;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.batch.core.ExitStatus;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.StepExecution;
+import org.springframework.batch.test.JobLauncherTestUtils;
+import org.springframework.batch.test.context.SpringBatchTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(SpringRunner.class)
+@SpringBatchTest
+@EnableAutoConfiguration
+@ContextConfiguration(classes = { NumberInfoConfig.class })
+@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class })
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+public class DeciderJobIntegrationTest {
+ @Autowired
+ private JobLauncherTestUtils jobLauncherTestUtils;
+
+ @Test
+ public void givenNumberGeneratorDecider_whenDeciderRuns_thenStatusIsNotify() throws Exception {
+ JobExecution jobExecution = jobLauncherTestUtils.launchJob();
+ Collection actualStepExecutions = jobExecution.getStepExecutions();
+ ExitStatus actualJobExitStatus = jobExecution.getExitStatus();
+
+ assertEquals("COMPLETED", actualJobExitStatus.getExitCode()
+ .toString());
+ assertEquals(2, actualStepExecutions.size());
+ boolean notifyStepDidRun = false;
+ Iterator iterator = actualStepExecutions.iterator();
+ while (iterator.hasNext() && !notifyStepDidRun) {
+ if (iterator.next()
+ .getStepName()
+ .equals("Notify step")) {
+ notifyStepDidRun = true;
+ }
+ }
+ assertTrue(notifyStepDidRun);
+ }
+}
diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java
new file mode 100644
index 0000000000..dc396b38da
--- /dev/null
+++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java
@@ -0,0 +1,71 @@
+package org.baeldung.conditionalflow.model;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+class NumberInfoUnitTest {
+
+ @Test
+ void givenPositive_whenFrom_isPositive() {
+ assertTrue(NumberInfo.from(1)
+ .isPositive());
+ assertTrue(NumberInfo.from(11)
+ .isPositive());
+ assertFalse(NumberInfo.from(0)
+ .isPositive());
+ }
+
+ @Test
+ void givenNegative_whenFrom_isNegative() {
+ assertFalse(NumberInfo.from(-1)
+ .isPositive());
+ assertFalse(NumberInfo.from(-10)
+ .isPositive());
+ }
+
+ @Test
+ void givenEven_whenFrom_isEven() {
+ assertTrue(NumberInfo.from(0)
+ .isEven());
+ assertTrue(NumberInfo.from(-2)
+ .isEven());
+ assertTrue(NumberInfo.from(2)
+ .isEven());
+ assertTrue(NumberInfo.from(-22)
+ .isEven());
+ assertTrue(NumberInfo.from(22)
+ .isEven());
+ }
+
+ @Test
+ void givenOdd_whenFrom_isOdd() {
+
+ assertFalse(NumberInfo.from(1)
+ .isEven());
+ assertFalse(NumberInfo.from(-1)
+ .isEven());
+
+ assertFalse(NumberInfo.from(13)
+ .isEven());
+ assertFalse(NumberInfo.from(-13)
+ .isEven());
+ assertFalse(NumberInfo.from(31)
+ .isEven());
+ assertFalse(NumberInfo.from(-51)
+ .isEven());
+ }
+
+ @Test
+ void giveGeneratedInt_whenFrom_isNumberFromGenerator() {
+ for (int i = -100; i < 100; i++) {
+ assertEquals(i, NumberInfo.from(i)
+ .getNumber());
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java
new file mode 100644
index 0000000000..cea0626168
--- /dev/null
+++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung.conditionalflow.step;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.baeldung.conditionalflow.model.NumberInfo;
+import org.junit.jupiter.api.Test;
+
+class NumberInfoClassifierUnitTest {
+
+ @Test
+ void givenNumberInfo_whenProcess_thenConvertsToInteger() throws Exception {
+ NumberInfoClassifier nic = new NumberInfoClassifier();
+ assertEquals(Integer.valueOf(4), nic.process(NumberInfo.from(4)));
+ assertEquals(Integer.valueOf(-4), nic.process(NumberInfo.from(-4)));
+ }
+}
\ No newline at end of file
diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java
new file mode 100644
index 0000000000..90fd884674
--- /dev/null
+++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java
@@ -0,0 +1,21 @@
+package org.baeldung.conditionalflow.step;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.baeldung.conditionalflow.model.NumberInfo;
+import org.junit.jupiter.api.Test;
+
+public class NumberInfoGeneratorUnitTest {
+
+ @Test
+ public void givenArray_whenGenerator_correctOrderAndValue() {
+ int[] numbers = new int[] { 1, -2, 4, -10 };
+ NumberInfoGenerator numberGenerator = new NumberInfoGenerator(numbers);
+ assertEquals(new NumberInfo(numbers[0]), numberGenerator.read());
+ assertEquals(new NumberInfo(numbers[1]), numberGenerator.read());
+ assertEquals(new NumberInfo(numbers[2]), numberGenerator.read());
+ assertEquals(new NumberInfo(numbers[3]), numberGenerator.read());
+ assertNull(numberGenerator.read());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java
index 834f26dacf..78a1ab7a54 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java
index c185456019..3322193134 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java
index 961d756a68..0f4fa757d6 100644
--- a/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-artifacts/pom.xml b/spring-boot-modules/spring-boot-artifacts/pom.xml
index f7c8636593..de9f6ab635 100644
--- a/spring-boot-modules/spring-boot-artifacts/pom.xml
+++ b/spring-boot-modules/spring-boot-artifacts/pom.xml
@@ -208,7 +208,7 @@
- org.baeldung.boot.Application
+ com.baeldung.boot.Application
3.1.1
3.3.7-1
2.2
diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java
index 8324fabfca..ce743e0f77 100644
--- a/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/Application.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/Application.java
similarity index 93%
rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/Application.java
rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/Application.java
index c1b6558b26..cb0d0c1532 100644
--- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/Application.java
+++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/Application.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot;
+package com.baeldung.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/Details.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/Details.java
similarity index 93%
rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/Details.java
rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/Details.java
index 1e3ddf7b21..c806476634 100644
--- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/Details.java
+++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/Details.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.client;
+package com.baeldung.boot.client;
public class Details {
diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/DetailsServiceClient.java
similarity index 93%
rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java
rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/DetailsServiceClient.java
index f2b9d6d030..a9f1b08c97 100644
--- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java
+++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/DetailsServiceClient.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.client;
+package com.baeldung.boot.client;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Service;
diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/Message.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/Message.java
similarity index 89%
rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/Message.java
rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/Message.java
index 2744c49f62..19140f76a2 100644
--- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/Message.java
+++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/Message.java
@@ -1,4 +1,4 @@
-package org.baeldung.websocket.client;
+package com.baeldung.websocket.client;
public class Message {
diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/MyStompSessionHandler.java
similarity index 97%
rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java
rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/MyStompSessionHandler.java
index 92beab9430..8ccc42c58a 100644
--- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java
+++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/MyStompSessionHandler.java
@@ -1,4 +1,4 @@
-package org.baeldung.websocket.client;
+package com.baeldung.websocket.client;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/StompClient.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/StompClient.java
similarity index 96%
rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/StompClient.java
rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/StompClient.java
index 2bff07186d..04d87dd2ed 100644
--- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/StompClient.java
+++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/StompClient.java
@@ -1,4 +1,4 @@
-package org.baeldung.websocket.client;
+package com.baeldung.websocket.client;
import java.util.Scanner;
diff --git a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/SpringContextTest.java
similarity index 86%
rename from spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/SpringContextTest.java
index 9c3b83ea79..1341f17eac 100644
--- a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.boot.Application;
+import com.baeldung.boot.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/boot/client/DetailsServiceClientIntegrationTest.java
similarity index 90%
rename from spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java
rename to spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/boot/client/DetailsServiceClientIntegrationTest.java
index d423300b85..4af5370950 100644
--- a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/boot/client/DetailsServiceClientIntegrationTest.java
@@ -1,10 +1,12 @@
-package org.baeldung.boot.client;
+package com.baeldung.boot.client;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
-import org.baeldung.boot.Application;
+import com.baeldung.boot.Application;
+import com.baeldung.boot.client.Details;
+import com.baeldung.boot.client.DetailsServiceClient;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java
index bb1b5e254e..57eec935f6 100644
--- a/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java
@@ -1,6 +1,5 @@
package com.baeldung.websocket.client;
-import org.baeldung.websocket.client.MyStompSessionHandler;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.messaging.simp.stomp.StompHeaders;
diff --git a/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java
index ff3e795778..ca8989724b 100644
--- a/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java
index e6ce83fab5..b4668e7d2b 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java
index b82b67df68..7103da97f3 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-deployment/pom.xml b/spring-boot-modules/spring-boot-deployment/pom.xml
index 64c0e698f6..b3fc3eabd1 100644
--- a/spring-boot-modules/spring-boot-deployment/pom.xml
+++ b/spring-boot-modules/spring-boot-deployment/pom.xml
@@ -190,7 +190,7 @@
- org.baeldung.boot.Application
+ com.baeldung.boot.Application
3.1.1
3.3.7-1
2.2
diff --git a/spring-boot-modules/spring-boot-gradle/build.gradle b/spring-boot-modules/spring-boot-gradle/build.gradle
index 96055536c3..faae01a1a5 100644
--- a/spring-boot-modules/spring-boot-gradle/build.gradle
+++ b/spring-boot-modules/spring-boot-gradle/build.gradle
@@ -21,7 +21,7 @@ apply plugin: 'io.spring.dependency-management'
//add tasks thinJar and thinResolve for thin JAR deployments
apply plugin: 'org.springframework.boot.experimental.thin-launcher'
-group = 'org.baeldung'
+group = 'com.baeldung'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
@@ -35,16 +35,16 @@ dependencies {
}
springBoot {
- mainClassName = 'org.baeldung.DemoApplication'
+ mainClassName = 'com.baeldung.DemoApplication'
}
bootJar {
// This is overridden by the mainClassName in springBoot{} and added here for reference purposes.
- mainClassName = 'org.baeldung.DemoApplication'
+ mainClassName = 'com.baeldung.DemoApplication'
// This block serves the same purpose as the above thus commented out. Added here for reference purposes
// manifest {
-// attributes 'Start-Class': 'org.baeldung.DemoApplication'
+// attributes 'Start-Class': 'com.baeldung.DemoApplication'
// }
}
diff --git a/spring-boot-modules/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java b/spring-boot-modules/spring-boot-gradle/src/main/java/com/baeldung/DemoApplication.java
similarity index 92%
rename from spring-boot-modules/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java
rename to spring-boot-modules/spring-boot-gradle/src/main/java/com/baeldung/DemoApplication.java
index f8df823f25..64bac6936b 100644
--- a/spring-boot-modules/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java
+++ b/spring-boot-modules/spring-boot-gradle/src/main/java/com/baeldung/DemoApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-modules/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java b/spring-boot-modules/spring-boot-gradle/src/test/java/com/baeldung/DemoApplicationTests.java
similarity index 93%
rename from spring-boot-modules/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java
rename to spring-boot-modules/spring-boot-gradle/src/test/java/com/baeldung/DemoApplicationTests.java
index b24bfb2cb6..65395582cb 100644
--- a/spring-boot-modules/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java
+++ b/spring-boot-modules/spring-boot-gradle/src/test/java/com/baeldung/DemoApplicationTests.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java
index ab6e4557d5..97810cf590 100644
--- a/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java
index 4effccc083..3f3ecd87d0 100644
--- a/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java
index 9817522e68..d2660ad84e 100644
--- a/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java
index 069dd41b8d..209a93d94c 100644
--- a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java
index 16e0708fc9..e73f4e79f7 100644
--- a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java
index d43f18f6a7..5b954f8941 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java
@@ -7,7 +7,7 @@ import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
-@ComponentScan("org.baeldung.properties.core")
+@ComponentScan("com.baeldung.properties.core")
@PropertySource("classpath:foo.properties")
public class ExternalPropertiesWithJavaConfig {
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java
index 6d105428d9..9080e3d0ba 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java
@@ -6,7 +6,7 @@ import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:configForProperties.xml")
-@ComponentScan("org.baeldung.core")
+@ComponentScan("com.baeldung.core")
public class ExternalPropertiesWithXmlConfig {
public ExternalPropertiesWithXmlConfig() {
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java
index 6f1e4c8490..f45f5b6a03 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java
@@ -6,7 +6,7 @@ import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:configForPropertiesOne.xml")
-@ComponentScan("org.baeldung.core")
+@ComponentScan("com.baeldung.core")
public class ExternalPropertiesWithXmlConfigOne {
public ExternalPropertiesWithXmlConfigOne() {
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/org/baeldung/SpringContextTest.java
index 874c4f582f..2e1a17199d 100644
--- 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/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
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/org/baeldung/SpringContextTest.java
index 874c4f582f..2e1a17199d 100644
--- 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/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java
index 16e0708fc9..e73f4e79f7 100644
--- a/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/Application.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java
similarity index 93%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/Application.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java
index c1b6558b26..cb0d0c1532 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/Application.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot;
+package com.baeldung.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
similarity index 89%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
index 92a6ed7ab0..928928c9a5 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.config;
+package com.baeldung.boot.config;
import java.util.Properties;
@@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
-@EnableJpaRepositories(basePackages = { "org.baeldung.boot.repository", "org.baeldung.boot.boottest", "org.baeldung.repository" })
+@EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.boot.boottest", "com.baeldung.repository" })
@PropertySource("classpath:persistence-generic-entity.properties")
@EnableTransactionManagement
public class H2JpaConfig {
@@ -41,7 +41,7 @@ public class H2JpaConfig {
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
- em.setPackagesToScan(new String[] { "org.baeldung.boot.domain", "org.baeldung.boot.model", "org.baeldung.boot.boottest", "org.baeldung.model" });
+ em.setPackagesToScan(new String[] { "com.baeldung.boot.domain", "com.baeldung.boot.model", "com.baeldung.boot.boottest", "com.baeldung.model" });
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
em.setJpaProperties(additionalProperties());
return em;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java
similarity index 71%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java
index 9554facb12..b23c910a04 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.config;
+package com.baeldung.boot.config;
-import org.baeldung.boot.converter.StringToEmployeeConverter;
-import org.baeldung.boot.converter.StringToEnumConverterFactory;
-import org.baeldung.boot.converter.GenericBigDecimalConverter;
+import com.baeldung.boot.converter.StringToEmployeeConverter;
+import com.baeldung.boot.converter.StringToEnumConverterFactory;
+import com.baeldung.boot.converter.GenericBigDecimalConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java
similarity index 96%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java
index 34ad11254c..80c75aa8b5 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.controller.servlet;
+package com.baeldung.boot.controller.servlet;
import java.io.IOException;
import java.io.PrintWriter;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java
similarity index 96%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java
index 91547683c6..f276f94b7c 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.controller.servlet;
+package com.baeldung.boot.controller.servlet;
import java.io.IOException;
import java.io.PrintWriter;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java
similarity index 96%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java
index 8add28fc2d..fc73cfee5f 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
import com.google.common.collect.ImmutableSet;
import org.springframework.core.convert.TypeDescriptor;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java
similarity index 90%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java
index 1bf75b38f0..ac635532ea 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
import org.springframework.core.convert.converter.Converter;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java
similarity index 95%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java
index ddb2cd2b08..a2dce11a6a 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
similarity index 91%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
index 27bad4c387..260b1c734b 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.converter.controller;
+package com.baeldung.boot.converter.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java
similarity index 54%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java
index dcba064e8c..7717294996 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
public enum Modes {
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/MyCustomErrorController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java
similarity index 93%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/MyCustomErrorController.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java
index df0e3ec0b2..373ae8f745 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/MyCustomErrorController.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java
@@ -1,4 +1,4 @@
-package org.baeldung.common.error;
+package com.baeldung.common.error;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java
similarity index 91%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java
index 774cf1b970..3f51a4ab69 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.common.error;
+package com.baeldung.common.error;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/controller/ErrorController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java
similarity index 90%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/controller/ErrorController.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java
index ac5f92e9c9..1e5fbf3ac4 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/controller/ErrorController.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java
@@ -1,4 +1,4 @@
-package org.baeldung.common.error.controller;
+package com.baeldung.common.error.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java
similarity index 95%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java
index d553d44769..be503b1b6c 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java
@@ -1,4 +1,4 @@
-package org.baeldung.common.properties;
+package com.baeldung.common.properties;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java
index 64853a9941..1db7054f85 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java
@@ -1,4 +1,4 @@
-package org.baeldung.common.resources;
+package com.baeldung.common.resources;
import org.springframework.boot.ExitCodeGenerator;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java
index 4a88fcea07..eb091b4695 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo;
+package com.baeldung.demo;
import com.baeldung.graphql.GraphqlConfiguration;
import org.springframework.boot.SpringApplication;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/Employee.java
similarity index 95%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/Employee.java
index 645ce2838a..fa3c1dc809 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/Employee.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRepository.java
similarity index 91%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRepository.java
index 00fdbfaae4..b6850d587e 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRepository.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import java.util.List;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRestController.java
similarity index 96%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRestController.java
index 516bff0e8c..7d2e06d4a0 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRestController.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import java.util.List;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeService.java
similarity index 89%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeService.java
index 07765a511c..ff1976cad1 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeService.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import java.util.List;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeServiceImpl.java
similarity index 96%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeServiceImpl.java
index a1639b29cc..156fc571f3 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeServiceImpl.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import java.util.List;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java
similarity index 77%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java
index 66943f6461..98a0db67ef 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java
@@ -1,7 +1,7 @@
-package org.baeldung.demo.components;
+package com.baeldung.demo.components;
-import org.baeldung.demo.model.Foo;
-import org.baeldung.demo.repository.FooRepository;
+import com.baeldung.demo.model.Foo;
+import com.baeldung.demo.repository.FooRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java
similarity index 85%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java
index 51dd7bbd44..276802d0b9 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.exceptions;
+package com.baeldung.demo.exceptions;
public class CommonException extends RuntimeException {
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java
similarity index 86%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java
index 59796c58f0..8c425d078e 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.exceptions;
+package com.baeldung.demo.exceptions;
public class FooNotFoundException extends RuntimeException {
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java
similarity index 95%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java
index e5638cfd3d..796bcca11b 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.model;
+package com.baeldung.demo.model;
import java.io.Serializable;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java
similarity index 70%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java
index c04e0c7438..ed27ac23bc 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.demo.repository;
+package com.baeldung.demo.repository;
-import org.baeldung.demo.model.Foo;
+import com.baeldung.demo.model.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface FooRepository extends JpaRepository {
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java
similarity index 85%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java
index c28dcde1a7..c72c52fa3e 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java
@@ -1,7 +1,7 @@
-package org.baeldung.demo.service;
+package com.baeldung.demo.service;
-import org.baeldung.demo.components.FooService;
-import org.baeldung.demo.model.Foo;
+import com.baeldung.demo.model.Foo;
+import com.baeldung.demo.components.FooService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/endpoints/info/TotalUsersInfoContributor.java
similarity index 89%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/endpoints/info/TotalUsersInfoContributor.java
index 34b50a2c0a..c316cabda5 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/endpoints/info/TotalUsersInfoContributor.java
@@ -1,9 +1,9 @@
-package org.baeldung.endpoints.info;
+package com.baeldung.endpoints.info;
import java.util.HashMap;
import java.util.Map;
-import org.baeldung.repository.UserRepository;
+import com.baeldung.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java
similarity index 78%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java
index a203659d63..383932524f 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java
@@ -1,9 +1,9 @@
-package org.baeldung.main;
+package com.baeldung.main;
-import org.baeldung.boot.controller.servlet.HelloWorldServlet;
-import org.baeldung.boot.controller.servlet.SpringHelloWorldServlet;
-import org.baeldung.common.error.SpringHelloServletRegistrationBean;
-import org.baeldung.common.resources.ExecutorServiceExitCodeGenerator;
+import com.baeldung.boot.controller.servlet.HelloWorldServlet;
+import com.baeldung.boot.controller.servlet.SpringHelloWorldServlet;
+import com.baeldung.common.error.SpringHelloServletRegistrationBean;
+import com.baeldung.common.resources.ExecutorServiceExitCodeGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -18,7 +18,7 @@ import java.util.concurrent.Executors;
@RestController
@EnableAutoConfiguration
-@ComponentScan({ "org.baeldung.common.error", "org.baeldung.common.error.controller", "org.baeldung.common.properties", "org.baeldung.common.resources", "org.baeldung.endpoints", "org.baeldung.service", "org.baeldung.monitor.jmx", "org.baeldung.boot.config" })
+@ComponentScan({ "com.baeldung.common.error", "com.baeldung.common.error.controller", "com.baeldung.common.properties", "com.baeldung.common.resources", "com.baeldung.endpoints", "com.baeldung.service", "com.baeldung.monitor.jmx", "com.baeldung.boot.config" })
public class SpringBootApplication {
private static ApplicationContext applicationContext;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/model/User.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java
similarity index 96%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/model/User.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java
index eb886338a0..cc5f27f38c 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/model/User.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.model;
+package com.baeldung.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java
similarity index 98%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java
index 752664cd5d..4dd863fb17 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.repository;
+package com.baeldung.repository;
-import org.baeldung.model.User;
+import com.baeldung.model.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/Application.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java
similarity index 87%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java
index 354c64c258..de4ca5998e 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java
@@ -1,6 +1,6 @@
-package org.baeldung.session.exception;
+package com.baeldung.session.exception;
-import org.baeldung.demo.model.Foo;
+import com.baeldung.demo.model.Foo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java
similarity index 50%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java
index ce7bbfe57b..5e748973ed 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.session.exception.repository;
+package com.baeldung.session.exception.repository;
-import org.baeldung.demo.model.Foo;
+import com.baeldung.demo.model.Foo;
public interface FooRepository {
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java
similarity index 88%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java
index 607bae83ba..a304373d6c 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java
@@ -1,8 +1,8 @@
-package org.baeldung.session.exception.repository;
+package com.baeldung.session.exception.repository;
import javax.persistence.EntityManagerFactory;
-import org.baeldung.demo.model.Foo;
+import com.baeldung.demo.model.Foo;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/AppStartupRunner.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/AppStartupRunner.java
similarity index 95%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/AppStartupRunner.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/AppStartupRunner.java
index d491bdb42c..0495473704 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/AppStartupRunner.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/AppStartupRunner.java
@@ -1,4 +1,4 @@
-package org.baeldung.startup;
+package com.baeldung.startup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/CommandLineAppStartupRunner.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/CommandLineAppStartupRunner.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/CommandLineAppStartupRunner.java
rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/CommandLineAppStartupRunner.java
index 6a7be59c21..48c5225cf1 100644
--- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/CommandLineAppStartupRunner.java
+++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/CommandLineAppStartupRunner.java
@@ -1,4 +1,4 @@
-package org.baeldung.startup;
+package com.baeldung.startup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/ApplicationIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java
similarity index 85%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/ApplicationIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java
index 5e351157c8..462291e0ac 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/ApplicationIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java
@@ -1,6 +1,6 @@
-package org.baeldung.boot;
+package com.baeldung.boot;
-import org.baeldung.session.exception.Application;
+import com.baeldung.session.exception.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java
similarity index 87%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java
index 0541da3199..aaf4f1f780 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java
@@ -1,6 +1,6 @@
-package org.baeldung.boot;
+package com.baeldung.boot;
-import org.baeldung.demo.DemoApplication;
+import com.baeldung.demo.DemoApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java
similarity index 82%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java
index c32e36d7e3..1772739d20 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.repository;
+package com.baeldung.boot.repository;
-import org.baeldung.boot.DemoApplicationIntegrationTest;
-import org.baeldung.demo.model.Foo;
-import org.baeldung.demo.repository.FooRepository;
+import com.baeldung.boot.DemoApplicationIntegrationTest;
+import com.baeldung.demo.model.Foo;
+import com.baeldung.demo.repository.FooRepository;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java
similarity index 81%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java
index b22282e896..2fe072bb67 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.repository;
+package com.baeldung.boot.repository;
-import org.baeldung.boot.DemoApplicationIntegrationTest;
-import org.baeldung.demo.model.Foo;
-import org.baeldung.demo.repository.FooRepository;
+import com.baeldung.boot.DemoApplicationIntegrationTest;
+import com.baeldung.demo.model.Foo;
+import com.baeldung.demo.repository.FooRepository;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java
similarity index 78%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java
index 5c8d10223b..2e3326e6b1 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.repository;
+package com.baeldung.boot.repository;
-import org.baeldung.boot.ApplicationIntegrationTest;
-import org.baeldung.demo.model.Foo;
-import org.baeldung.session.exception.repository.FooRepository;
+import com.baeldung.boot.ApplicationIntegrationTest;
+import com.baeldung.demo.model.Foo;
+import com.baeldung.session.exception.repository.FooRepository;
import org.hibernate.HibernateException;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java
index bd1ae2c8fa..4619964783 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java
@@ -1,9 +1,9 @@
-package org.baeldung.converter;
+package com.baeldung.converter;
import com.baeldung.toggle.Employee;
-import org.baeldung.boot.Application;
-import org.baeldung.boot.domain.Modes;
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.Modes;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java
index 2afda7565a..52dc542ebf 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.converter.controller;
+package com.baeldung.converter.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -14,7 +14,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import org.baeldung.boot.Application;
+import com.baeldung.boot.Application;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = Application.class)
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java
similarity index 93%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java
index 2d70583a54..962abf0fa3 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java
@@ -1,8 +1,5 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
-import org.baeldung.demo.boottest.Employee;
-import org.baeldung.demo.boottest.EmployeeRestController;
-import org.baeldung.demo.boottest.EmployeeService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java
index 3042f95a46..164887886b 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java
@@ -1,7 +1,7 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
-import org.baeldung.demo.boottest.Employee;
-import org.baeldung.demo.boottest.EmployeeRepository;
+import com.baeldung.demo.boottest.Employee;
+import com.baeldung.demo.boottest.EmployeeRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java
similarity index 97%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java
index a4b35889d6..327e9f9d56 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.is;
@@ -14,7 +14,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import java.io.IOException;
import java.util.List;
-import org.baeldung.demo.DemoApplication;
+import com.baeldung.demo.DemoApplication;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java
similarity index 94%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java
index df28111a57..88f2830a2b 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import static org.assertj.core.api.Assertions.assertThat;
@@ -6,6 +6,10 @@ import java.util.Arrays;
import java.util.List;
import java.util.Optional;
+import com.baeldung.demo.boottest.Employee;
+import com.baeldung.demo.boottest.EmployeeRepository;
+import com.baeldung.demo.boottest.EmployeeService;
+import com.baeldung.demo.boottest.EmployeeServiceImpl;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/JsonUtil.java
similarity index 91%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/JsonUtil.java
index 7e04f47696..3fcd709f7c 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/JsonUtil.java
@@ -1,4 +1,4 @@
-package org.baeldung.demo.boottest;
+package com.baeldung.demo.boottest;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java
similarity index 92%
rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java
rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java
index ea7f118967..a1318949f3 100644
--- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java
+++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java
@@ -1,7 +1,8 @@
-package org.baeldung.repository;
+package com.baeldung.repository;
-import org.baeldung.boot.config.H2JpaConfig;
-import org.baeldung.model.User;
+import com.baeldung.boot.config.H2JpaConfig;
+import com.baeldung.model.User;
+import com.baeldung.repository.UserRepository;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-circuit-breaker/README.md b/spring-cloud/spring-cloud-circuit-breaker/README.md
new file mode 100644
index 0000000000..040eb0ccee
--- /dev/null
+++ b/spring-cloud/spring-cloud-circuit-breaker/README.md
@@ -0,0 +1,5 @@
+## Spring Cloud Circuit Breaker
+
+This module contains articles about Spring Cloud Circuit Breaker
+
+### Relevant Articles:
diff --git a/spring-cloud/spring-cloud-circuit-breaker/pom.xml b/spring-cloud/spring-cloud-circuit-breaker/pom.xml
new file mode 100644
index 0000000000..188fc4bf8e
--- /dev/null
+++ b/spring-cloud/spring-cloud-circuit-breaker/pom.xml
@@ -0,0 +1,55 @@
+
+
+ 4.0.0
+ spring-cloud-circuit-breaker
+ spring-cloud-gateway
+ jar
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ https://repo.spring.io/libs-snapshot
+
+ true
+
+
+ false
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 2.2.4.RELEASE
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-circuitbreaker-resilience4j
+ 1.0.2.RELEASE
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java
new file mode 100644
index 0000000000..67163c8c9a
--- /dev/null
+++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java
@@ -0,0 +1,40 @@
+package com.baeldung.circuitbreaker;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
+import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+@Service
+public class AlbumService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AlbumService.class);
+
+ @Autowired
+ private CircuitBreakerFactory circuitBreakerFactory;
+
+ private RestTemplate restTemplate = new RestTemplate();
+
+ public String getAlbumList() {
+ CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
+ String url = "https://jsonplaceholder.typicode.com/albums";
+
+ return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class), throwable -> getDefaultAlbumList());
+ }
+
+ private String getDefaultAlbumList() {
+ try {
+ return new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("fallback-album-list.json").toURI())));
+ } catch (Exception e) {
+ LOGGER.error("error occurred while reading the file", e);
+ }
+ return null;
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java
new file mode 100644
index 0000000000..10f7c57a7a
--- /dev/null
+++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java
@@ -0,0 +1,18 @@
+package com.baeldung.circuitbreaker;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class Controller {
+
+ @Autowired
+ private AlbumService service;
+
+ @GetMapping("/albums")
+ public String albums() {
+ return service.getAlbumList();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java
new file mode 100644
index 0000000000..f891e7693f
--- /dev/null
+++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java
@@ -0,0 +1,71 @@
+package com.baeldung.circuitbreaker;
+
+import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
+import io.github.resilience4j.timelimiter.TimeLimiterConfig;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
+import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
+import org.springframework.cloud.client.circuitbreaker.Customizer;
+import org.springframework.context.annotation.Bean;
+
+import java.time.Duration;
+
+@SpringBootApplication
+public class SpringApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringApp.class, args);
+ }
+
+ @Bean
+ public Customizer globalCustomConfiguration() {
+ TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
+ .timeoutDuration(Duration.ofSeconds(4))
+ .build();
+ CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
+ .failureRateThreshold(50)
+ .waitDurationInOpenState(Duration.ofMillis(1000))
+ .slidingWindowSize(2)
+ .build();
+
+ return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
+ .timeLimiterConfig(timeLimiterConfig)
+ .circuitBreakerConfig(circuitBreakerConfig)
+ .build());
+ }
+
+ @Bean
+ public Customizer specificCustomConfiguration1() {
+
+ TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
+ .timeoutDuration(Duration.ofSeconds(4))
+ .build();
+ CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
+ .failureRateThreshold(50)
+ .waitDurationInOpenState(Duration.ofMillis(1000))
+ .slidingWindowSize(2)
+ .build();
+
+ return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
+ .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker");
+ }
+
+ @Bean
+ public Customizer specificCustomConfiguration2() {
+
+ TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
+ .timeoutDuration(Duration.ofSeconds(4))
+ .build();
+ CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
+ .failureRateThreshold(50)
+ .waitDurationInOpenState(Duration.ofMillis(1000))
+ .slidingWindowSize(2)
+ .build();
+
+ return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
+ .timeLimiterConfig(timeLimiterConfig).build(),
+ "circuitBreaker1", "circuitBreaker2", "circuitBreaker3");
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json b/spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json
new file mode 100644
index 0000000000..001df7610a
--- /dev/null
+++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json
@@ -0,0 +1,12 @@
+[
+ {
+ "userId": 1,
+ "id": 1,
+ "title": "quidem molestiae enim"
+ },
+ {
+ "userId": 1,
+ "id": 2,
+ "title": "sunt qui excepturi placeat culpa"
+ }
+]
\ No newline at end of file
diff --git a/spring-core-2/README.md b/spring-core-2/README.md
index 1fb591f693..947b816db8 100644
--- a/spring-core-2/README.md
+++ b/spring-core-2/README.md
@@ -7,7 +7,6 @@ This module contains articles about core Spring functionality
- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire)
- [Spring Profiles](http://www.baeldung.com/spring-profiles)
- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor)
-- [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring)
- [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes)
- [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope)
- [@Order in Spring](http://www.baeldung.com/spring-order)
@@ -15,6 +14,4 @@ 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)
-- [Guide to the Spring BeanFactory](https://www.baeldung.com/spring-beanfactory)
-- [Reading HttpServletRequest Multiple Times in Spring](https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times)
- More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3)
diff --git a/spring-security-modules/spring-security-acl/pom.xml b/spring-security-modules/spring-security-acl/pom.xml
index 3c613f9d92..5c04aaa9ca 100644
--- a/spring-security-modules/spring-security-acl/pom.xml
+++ b/spring-security-modules/spring-security-acl/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../../parent-boot-1
+ ../../parent-boot-2
diff --git a/spring-security-modules/spring-security-cache-control/pom.xml b/spring-security-modules/spring-security-cache-control/pom.xml
index acc37b41ef..743b3c291d 100644
--- a/spring-security-modules/spring-security-cache-control/pom.xml
+++ b/spring-security-modules/spring-security-cache-control/pom.xml
@@ -8,9 +8,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../../parent-boot-1
+ ../../parent-boot-2
@@ -23,41 +23,15 @@
spring-boot-starter-web
- org.springframework.security
- spring-security-core
-
-
- org.springframework.security
- spring-security-config
-
-
- org.springframework.security
- spring-security-web
-
-
- javax.servlet
- javax.servlet-api
- ${javax.servlet-api.version}
+ org.springframework.boot
+ spring-boot-starter-security
- org.hamcrest
- hamcrest
- ${hamcrest.version}
+ org.springframework.boot
+ spring-boot-starter-test
test
-
-
- org.mockito
- mockito-core
- test
-
-
-
- org.springframework
- spring-test
-
-
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java b/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java
index d6a1a97773..d4d24a4986 100644
--- a/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java
+++ b/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java
@@ -4,8 +4,8 @@ import static io.restassured.RestAssured.given;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.junit4.SpringRunner;
import io.restassured.http.ContentType;
diff --git a/spring-security-modules/spring-security-kerberos/pom.xml b/spring-security-modules/spring-security-kerberos/pom.xml
index 6846bdf063..51a48a78c6 100644
--- a/spring-security-modules/spring-security-kerberos/pom.xml
+++ b/spring-security-modules/spring-security-kerberos/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../../parent-boot-1
+ ../../parent-boot-2
diff --git a/spring-security-modules/spring-security-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml
index f5e8856648..baed682186 100644
--- a/spring-security-modules/spring-security-ldap/pom.xml
+++ b/spring-security-modules/spring-security-ldap/pom.xml
@@ -9,9 +9,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../../parent-boot-1
+ ../../parent-boot-2
@@ -21,6 +21,10 @@
org.springframework.boot
spring-boot-starter-security
+
+ org.springframework.boot
+ spring-boot-starter-web
+
org.springframework.boot
spring-boot-starter-thymeleaf
diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java
index ec585f2387..2d619cccfa 100644
--- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java
+++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java
@@ -2,7 +2,7 @@ package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@@ -19,15 +19,4 @@ public class SampleLDAPApplication extends SpringBootServletInitializer {
SpringApplication.run(SampleLDAPApplication.class, args);
}
- @Bean
- public WebMvcConfigurerAdapter adapter() {
- return new WebMvcConfigurerAdapter() {
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- registry.addViewController("/login")
- .setViewName("login");
- }
- };
- }
-
}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java
similarity index 53%
rename from spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java
index a00cb02459..69f90d9de9 100644
--- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java
+++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java
@@ -1,4 +1,4 @@
-package com.baeldung.security;
+package com.baeldung.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
@@ -14,13 +14,26 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- auth.ldapAuthentication().userSearchBase("ou=people").userSearchFilter("(uid={0})").groupSearchBase("ou=groups").groupSearchFilter("(member={0})").contextSource().root("dc=baeldung,dc=com").ldif("classpath:users.ldif");
+ auth.ldapAuthentication()
+ .userSearchBase("ou=people")
+ .userSearchFilter("(uid={0})")
+ .groupSearchBase("ou=groups")
+ .groupSearchFilter("(member={0})")
+ .contextSource()
+ .root("dc=baeldung,dc=com")
+ .ldif("classpath:users.ldif");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
- http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated();
- http.formLogin().loginPage("/login").permitAll().and().logout().logoutSuccessUrl("/");
+ http
+ .authorizeRequests()
+ .antMatchers("/", "/home", "/css/**")
+ .permitAll()
+ .anyRequest()
+ .authenticated()
+ .and().formLogin().loginPage("/login").permitAll()
+ .and().logout().logoutSuccessUrl("/");
}
}
diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java
new file mode 100644
index 0000000000..9809be1844
--- /dev/null
+++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addViewControllers(ViewControllerRegistry registry) {
+ registry.addViewController("/login")
+ .setViewName("login");
+ }
+}
diff --git a/spring-security-modules/spring-security-ldap/src/main/resources/application.properties b/spring-security-modules/spring-security-ldap/src/main/resources/application.properties
new file mode 100644
index 0000000000..3d0221bb7b
--- /dev/null
+++ b/spring-security-modules/spring-security-ldap/src/main/resources/application.properties
@@ -0,0 +1 @@
+management.health.ldap.enabled=false
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml
index c13f65de5e..adfd603e54 100644
--- a/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml
+++ b/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml
@@ -10,6 +10,7 @@
+
diff --git a/spring-security-modules/spring-security-x509/pom.xml b/spring-security-modules/spring-security-x509/pom.xml
index a4ff908eed..d4132f058d 100644
--- a/spring-security-modules/spring-security-x509/pom.xml
+++ b/spring-security-modules/spring-security-x509/pom.xml
@@ -9,9 +9,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../../parent-boot-1
+ ../../parent-boot-2
diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties
index f293d6712d..53dfe9976a 100644
--- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties
+++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties
@@ -1,8 +1,8 @@
-server.ssl.key-store=../keystore/keystore.jks
+server.ssl.key-store=keystore/keystore.jks
server.ssl.key-store-password=changeit
server.ssl.key-alias=localhost
server.ssl.key-password=changeit
server.ssl.enabled=true
server.port=8443
-security.user.name=Admin
-security.user.password=admin
\ No newline at end of file
+spring.security.user.name=Admin
+spring.security.user.password=admin
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties
index 174eba9f98..743c9c4582 100644
--- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties
+++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties
@@ -4,8 +4,8 @@ server.ssl.key-alias=localhost
server.ssl.key-password=changeit
server.ssl.enabled=true
server.port=8443
-security.user.name=Admin
-security.user.password=admin
+spring.security.user.name=Admin
+spring.security.user.password=admin
server.ssl.trust-store=../keystore/truststore.jks
server.ssl.trust-store-password=changeit
server.ssl.client-auth=need
\ No newline at end of file
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java
new file mode 100644
index 0000000000..fa021f8cba
--- /dev/null
+++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java
@@ -0,0 +1,58 @@
+package com.baeldung.mockito.additionalanswers;
+
+public class Book {
+
+ private Long bookId;
+
+ private String title;
+
+ private String author;
+
+ private int numberOfPages;
+
+ public Book(String title, String author, int numberOfPages) {
+ this.title = title;
+ this.author = author;
+ this.numberOfPages = numberOfPages;
+ }
+
+ public Book(Long bookId, String title, String author, int numberOfPages) {
+ this.bookId = bookId;
+ this.title = title;
+ this.author = author;
+ this.numberOfPages = numberOfPages;
+ }
+
+ public Long getBookId() {
+ return bookId;
+ }
+
+ public void setBookId(Long bookId) {
+ this.bookId = bookId;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public int getNumberOfPages() {
+ return numberOfPages;
+ }
+
+ public void setNumberOfPages(int numberOfPages) {
+ this.numberOfPages = numberOfPages;
+ }
+}
+
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java
new file mode 100644
index 0000000000..78187e3f01
--- /dev/null
+++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java
@@ -0,0 +1,17 @@
+package com.baeldung.mockito.additionalanswers;
+
+public class BookRepository {
+ public Book getByBookId(Long bookId) {
+ return new Book(bookId, "To Kill a Mocking Bird", "Harper Lee", 256);
+ }
+
+ public Book save(Book book) {
+ return new Book(book.getBookId(), book.getTitle(), book.getAuthor(), book.getNumberOfPages());
+ }
+
+ public Book checkIfEquals(Book bookOne, Book bookTwo, Book bookThree) {
+ if (bookOne.equals(bookTwo) && bookTwo.equals(bookThree) && bookThree.equals(bookOne)) {
+ return bookOne;
+ } else return bookTwo;
+ }
+}
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java
new file mode 100644
index 0000000000..92c01f8a70
--- /dev/null
+++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java
@@ -0,0 +1,22 @@
+package com.baeldung.mockito.additionalanswers;
+
+public class BookService {
+ private final BookRepository bookRepository;
+
+ public BookService(BookRepository bookRepository) {
+ this.bookRepository = bookRepository;
+ }
+
+ public Book getByBookId(Long id) {
+ return bookRepository.getByBookId(id);
+ }
+
+ public Book save(Book book) {
+ return bookRepository.save(book);
+ }
+
+ public Book checkifEquals(Book book1, Book book2, Book book3) {
+ return bookRepository.checkIfEquals(book1, book2, book3);
+ }
+}
+
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java
new file mode 100644
index 0000000000..c9527ec0ec
--- /dev/null
+++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.mockito.additionalanswers;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.AdditionalAnswers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BookServiceUnitTest {
+ @InjectMocks
+ private BookService bookService;
+
+ @Mock
+ private BookRepository bookRepository;
+
+ @Test
+ public void givenSaveMethodMocked_whenSaveInvoked_ThenReturnFirstArgument_UnitTest() {
+ Book book = new Book("To Kill a Mocking Bird", "Harper Lee", 256);
+ Mockito.when(bookRepository.save(any(Book.class))).then(AdditionalAnswers.returnsFirstArg());
+
+ Book savedBook = bookService.save(book);
+
+ assertEquals(savedBook, book);
+ }
+
+ @Test
+ public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnSecondArgument_UnitTest() {
+ Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456);
+ Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300);
+ Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200);
+
+ Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsSecondArg());
+
+ Book secondBook = bookService.checkifEquals(book1, book2, book3);
+
+ assertEquals(secondBook, book2);
+ }
+
+ @Test
+ public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnLastArgument_UnitTest() {
+ Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456);
+ Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300);
+ Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200);
+
+ Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsLastArg());
+
+ Book lastBook = bookService.checkifEquals(book1, book2, book3);
+ assertEquals(lastBook, book3);
+ }
+
+ @Test
+ public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnArgumentAtIndex_UnitTest() {
+ Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456);
+ Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300);
+ Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200);
+
+ Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsArgAt(1));
+
+ Book bookOnIndex = bookService.checkifEquals(book1, book2, book3);
+
+ assertEquals(bookOnIndex, book2);
+ }
+}
diff --git a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java
index 799e7721e0..1aafa28a6a 100644
--- a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java
+++ b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java
@@ -15,5 +15,5 @@ public interface ExpectationsCollaborator {
void methodForArgThat(Object o);
String methodReturnsString();
int methodReturnsInt();
- Object methodForDelegate(int i);
+ int methodForDelegate(int i);
}
diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java
index 8b0c3ab4ec..1ff90111d1 100644
--- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java
+++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java
@@ -1,21 +1,21 @@
package com.baeldung.jmockit;
-import com.baeldung.jmockit.ExpectationsCollaborator;
-import com.baeldung.jmockit.Model;
-import mockit.Delegate;
-import mockit.Expectations;
-import mockit.Mocked;
-import mockit.Verifications;
-import mockit.integration.junit4.JMockit;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
+import mockit.Delegate;
+import mockit.Expectations;
+import mockit.Mocked;
+import mockit.Verifications;
+import mockit.integration.junit4.JMockit;
@RunWith(JMockit.class)
@SuppressWarnings("unchecked")
@@ -112,17 +112,16 @@ public class ExpectationsIntegrationTest {
result = "foo";
result = new Exception();
result = "bar";
- mock.methodReturnsInt();
- result = new int[]{1, 2, 3};
- mock.methodReturnsString();
returns("foo", "bar");
mock.methodReturnsInt();
+ result = new int[]{1, 2, 3};
result = 1;
}};
assertEquals("Should return foo", "foo", mock.methodReturnsString());
try {
mock.methodReturnsString();
+ fail("Shouldn't reach here");
} catch (Exception e) {
// NOOP
}
@@ -134,13 +133,14 @@ public class ExpectationsIntegrationTest {
assertEquals("Should return bar", "bar", mock.methodReturnsString());
assertEquals("Should return 1", 1, mock.methodReturnsInt());
}
-
+
@Test
public void testDelegate(@Mocked ExpectationsCollaborator mock) {
new Expectations() {{
mock.methodForDelegate(anyInt);
- result = new Delegate() {
- public int delegate(int i) throws Exception {
+
+ result = new Delegate() {
+ int delegate(int i) throws Exception {
if (i < 3) {
return 5;
} else {
@@ -153,6 +153,7 @@ public class ExpectationsIntegrationTest {
assertEquals("Should return 5", 5, mock.methodForDelegate(1));
try {
mock.methodForDelegate(3);
+ fail("Shouldn't reach here");
} catch (Exception e) {
}
}