diff --git a/algorithms-genetic/.gitignore b/algorithms-modules/algorithms-genetic/.gitignore
similarity index 100%
rename from algorithms-genetic/.gitignore
rename to algorithms-modules/algorithms-genetic/.gitignore
diff --git a/algorithms-genetic/README.md b/algorithms-modules/algorithms-genetic/README.md
similarity index 100%
rename from algorithms-genetic/README.md
rename to algorithms-modules/algorithms-genetic/README.md
diff --git a/algorithms-genetic/pom.xml b/algorithms-modules/algorithms-genetic/pom.xml
similarity index 96%
rename from algorithms-genetic/pom.xml
rename to algorithms-modules/algorithms-genetic/pom.xml
index c53ae0f776..c18ba0e7f1 100644
--- a/algorithms-genetic/pom.xml
+++ b/algorithms-modules/algorithms-genetic/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/City.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/SimulatedAnnealing.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/Ant.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/ant_colony/AntColonyOptimization.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Individual.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/Population.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/binary/SimpleGeneticAlgorithm.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/Knapsack.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackFF.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/KnapsackItem.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SimpleGeneticAlgorithm.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenProblem.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SpringsteenRecord.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/SubsetSum.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java b/algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java
rename to algorithms-modules/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/jenetics/TravelingSalesman.java
diff --git a/algorithms-genetic/src/main/resources/logback.xml b/algorithms-modules/algorithms-genetic/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-genetic/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-genetic/src/main/resources/logback.xml
diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java
similarity index 100%
rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java
rename to algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java
diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java
similarity index 100%
rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java
rename to algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java
diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java
similarity index 100%
rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java
rename to algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-modules/algorithms-miscellaneous-1/README.md
similarity index 100%
rename from algorithms-miscellaneous-1/README.md
rename to algorithms-modules/algorithms-miscellaneous-1/README.md
diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-modules/algorithms-miscellaneous-1/pom.xml
similarity index 97%
rename from algorithms-miscellaneous-1/pom.xml
rename to algorithms-modules/algorithms-miscellaneous-1/pom.xml
index c6f247f4e3..62c9738f1a 100644
--- a/algorithms-miscellaneous-1/pom.xml
+++ b/algorithms-modules/algorithms-miscellaneous-1/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtState.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/RtTransition.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/State.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/automata/Transition.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/hillclimbing/State.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Node.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java b/algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/minimax/Tree.java
diff --git a/algorithms-miscellaneous-1/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-1/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-miscellaneous-1/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-modules/algorithms-miscellaneous-2/README.md
similarity index 100%
rename from algorithms-miscellaneous-2/README.md
rename to algorithms-modules/algorithms-miscellaneous-2/README.md
diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-modules/algorithms-miscellaneous-2/pom.xml
similarity index 97%
rename from algorithms-miscellaneous-2/pom.xml
rename to algorithms-modules/algorithms-miscellaneous-2/pom.xml
index a411cfdb71..f3b41cb7f8 100644
--- a/algorithms-miscellaneous-2/pom.xml
+++ b/algorithms-modules/algorithms-miscellaneous-2/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceBase.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceDynamicProgramming.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/editdistance/EditDistanceRecursive.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForce.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIterators.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashing.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleDetectionResult.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForce.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodes.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodes.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/linkedlist/Node.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java
diff --git a/algorithms-miscellaneous-2/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-2/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt b/algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze1.txt
diff --git a/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt b/algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt
rename to algorithms-modules/algorithms-miscellaneous-2/src/main/resources/maze/maze2.txt
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Graph.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/GraphNode.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteFinder.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/RouteNode.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/Scorer.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/HaversineScorer.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/Station.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/resources/graph.png b/algorithms-modules/algorithms-miscellaneous-2/src/test/resources/graph.png
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/resources/graph.png
rename to algorithms-modules/algorithms-miscellaneous-2/src/test/resources/graph.png
diff --git a/algorithms-miscellaneous-3/.gitignore b/algorithms-modules/algorithms-miscellaneous-3/.gitignore
similarity index 100%
rename from algorithms-miscellaneous-3/.gitignore
rename to algorithms-modules/algorithms-miscellaneous-3/.gitignore
diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-modules/algorithms-miscellaneous-3/README.md
similarity index 100%
rename from algorithms-miscellaneous-3/README.md
rename to algorithms-modules/algorithms-miscellaneous-3/README.md
diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-modules/algorithms-miscellaneous-3/pom.xml
similarity index 97%
rename from algorithms-miscellaneous-3/pom.xml
rename to algorithms-modules/algorithms-miscellaneous-3/pom.xml
index 2f180da5e1..8958cbef88 100644
--- a/algorithms-miscellaneous-3/pom.xml
+++ b/algorithms-modules/algorithms-miscellaneous-3/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/Employee.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checksortedlist/SortedListChecker.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestState.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Graph.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/graphcycledetection/domain/Vertex.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanArabicConverter.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/romannumerals/RomanNumeral.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/FoldingHash.java
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/folding/Main.java
diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json
diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json
diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html
diff --git a/algorithms-miscellaneous-3/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-3/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-miscellaneous-3/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-miscellaneous-3/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java
diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-modules/algorithms-miscellaneous-4/README.md
similarity index 100%
rename from algorithms-miscellaneous-4/README.md
rename to algorithms-modules/algorithms-miscellaneous-4/README.md
diff --git a/algorithms-miscellaneous-4/pom.xml b/algorithms-modules/algorithms-miscellaneous-4/pom.xml
similarity index 94%
rename from algorithms-miscellaneous-4/pom.xml
rename to algorithms-modules/algorithms-miscellaneous-4/pom.xml
index 1dc9a62f64..ed752a6b41 100644
--- a/algorithms-miscellaneous-4/pom.xml
+++ b/algorithms-modules/algorithms-miscellaneous-4/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveInteger.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
diff --git a/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
diff --git a/algorithms-miscellaneous-4/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-4/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-miscellaneous-4/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-miscellaneous-4/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/smallestinteger/SmallestMissingPositiveIntegerUnitTest.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
diff --git a/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
similarity index 100%
rename from algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
rename to algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-modules/algorithms-miscellaneous-5/README.md
similarity index 100%
rename from algorithms-miscellaneous-5/README.md
rename to algorithms-modules/algorithms-miscellaneous-5/README.md
diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-modules/algorithms-miscellaneous-5/pom.xml
similarity index 96%
rename from algorithms-miscellaneous-5/pom.xml
rename to algorithms-modules/algorithms-miscellaneous-5/pom.xml
index 7ceede9cb9..26b445555b 100644
--- a/algorithms-miscellaneous-5/pom.xml
+++ b/algorithms-modules/algorithms-miscellaneous-5/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTree.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/balancedbinarytree/Tree.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/binarygap/BinaryGap.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/combinatorics/Combinatorics.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStream2.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/mergesortedarrays/SortedArrays.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
diff --git a/algorithms-miscellaneous-5/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-5/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-miscellaneous-5/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-miscellaneous-5/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BinaryTreeDataProvider.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/resources/input.json b/algorithms-modules/algorithms-miscellaneous-5/src/test/resources/input.json
similarity index 100%
rename from algorithms-miscellaneous-5/src/test/resources/input.json
rename to algorithms-modules/algorithms-miscellaneous-5/src/test/resources/input.json
diff --git a/algorithms-miscellaneous-6/README.md b/algorithms-modules/algorithms-miscellaneous-6/README.md
similarity index 100%
rename from algorithms-miscellaneous-6/README.md
rename to algorithms-modules/algorithms-miscellaneous-6/README.md
diff --git a/algorithms-miscellaneous-6/pom.xml b/algorithms-modules/algorithms-miscellaneous-6/pom.xml
similarity index 95%
rename from algorithms-miscellaneous-6/pom.xml
rename to algorithms-modules/algorithms-miscellaneous-6/pom.xml
index 584ec8a8dd..34eae2e2b9 100644
--- a/algorithms-miscellaneous-6/pom.xml
+++ b/algorithms-modules/algorithms-miscellaneous-6/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
similarity index 97%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
index 4c220b4047..45ef842670 100644
--- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
+++ b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDeque.java
@@ -31,6 +31,6 @@ public class BalancedBracketsUsingDeque {
}
}
- return true;
+ return deque.isEmpty();
}
}
\ No newline at end of file
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingString.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/Follower.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/CycleDetector.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/DisjointSetInfo.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/kruskal/Kruskal.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Board.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Cell.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Computer.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Human.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Move.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/play2048/Play2048.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/BruteForceTopKElementsFinder.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/MaxHeapTopKElementsFinder.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TopKElementsFinder.java
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java b/algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/topkelements/TreeSetTopKElementsFinder.java
diff --git a/algorithms-miscellaneous-6/src/main/resources/logback.xml b/algorithms-modules/algorithms-miscellaneous-6/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-miscellaneous-6/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-miscellaneous-6/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
similarity index 91%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
index 964c1ce11a..4c0a56dabc 100644
--- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
+++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java
@@ -49,6 +49,12 @@ public class BalancedBracketsUsingDequeUnitTest {
assertThat(result).isFalse();
}
+ @Test
+ public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() {
+ boolean result = balancedBracketsUsingDeque.isBalanced("{{}(");
+ assertThat(result).isFalse();
+ }
+
@Test
public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() {
boolean result = balancedBracketsUsingDeque.isBalanced("{[()]}");
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
similarity index 91%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
index 69ce42b0f1..bda85a75ce 100644
--- a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
+++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java
@@ -49,6 +49,12 @@ public class BalancedBracketsUsingStringUnitTest {
assertThat(result).isFalse();
}
+ @Test
+ public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() {
+ boolean result = balancedBracketsUsingString.isBalanced("{{}(");
+ assertThat(result).isFalse();
+ }
+
@Test
public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() {
boolean result = balancedBracketsUsingString.isBalanced("{[()]}");
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java
rename to algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java
diff --git a/algorithms-searching/README.md b/algorithms-modules/algorithms-searching/README.md
similarity index 100%
rename from algorithms-searching/README.md
rename to algorithms-modules/algorithms-searching/README.md
diff --git a/algorithms-searching/pom.xml b/algorithms-modules/algorithms-searching/pom.xml
similarity index 92%
rename from algorithms-searching/pom.xml
rename to algorithms-modules/algorithms-searching/pom.xml
index edb8a0c423..f981b4542f 100644
--- a/algorithms-searching/pom.xml
+++ b/algorithms-modules/algorithms-searching/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/binarysearch/BinarySearch.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/Graph.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/kthsmallest/KthSmallest.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Point.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/QuadTree.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/quadtree/Region.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/Node.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java b/algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java
similarity index 100%
rename from algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java
rename to algorithms-modules/algorithms-searching/src/main/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithms.java
diff --git a/algorithms-searching/src/main/resources/logback.xml b/algorithms-modules/algorithms-searching/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-searching/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-searching/src/main/resources/logback.xml
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java
similarity index 100%
rename from algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java
rename to algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java
diff --git a/algorithms-sorting-2/.gitignore b/algorithms-modules/algorithms-sorting-2/.gitignore
similarity index 100%
rename from algorithms-sorting-2/.gitignore
rename to algorithms-modules/algorithms-sorting-2/.gitignore
diff --git a/algorithms-sorting-2/README.md b/algorithms-modules/algorithms-sorting-2/README.md
similarity index 100%
rename from algorithms-sorting-2/README.md
rename to algorithms-modules/algorithms-sorting-2/README.md
diff --git a/algorithms-sorting-2/pom.xml b/algorithms-modules/algorithms-sorting-2/pom.xml
similarity index 95%
rename from algorithms-sorting-2/pom.xml
rename to algorithms-modules/algorithms-sorting-2/pom.xml
index a8477bf624..d81df0adec 100644
--- a/algorithms-sorting-2/pom.xml
+++ b/algorithms-modules/algorithms-sorting-2/pom.xml
@@ -8,7 +8,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/BentleyMcIlroyPartioning.java
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/DutchNationalFlagPartioning.java
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/Partition.java
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/quicksort/SortingUtils.java
diff --git a/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
similarity index 100%
rename from algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
rename to algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
diff --git a/algorithms-sorting-2/src/main/resources/logback.xml b/algorithms-modules/algorithms-sorting-2/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-sorting-2/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-sorting-2/src/main/resources/logback.xml
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java
similarity index 100%
rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java
rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java
similarity index 100%
rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java
rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java
similarity index 100%
rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java
rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java
similarity index 100%
rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java
rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
similarity index 100%
rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
diff --git a/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
similarity index 100%
rename from algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
rename to algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
diff --git a/algorithms-sorting/.gitignore b/algorithms-modules/algorithms-sorting/.gitignore
similarity index 100%
rename from algorithms-sorting/.gitignore
rename to algorithms-modules/algorithms-sorting/.gitignore
diff --git a/algorithms-sorting/README.md b/algorithms-modules/algorithms-sorting/README.md
similarity index 100%
rename from algorithms-sorting/README.md
rename to algorithms-modules/algorithms-sorting/README.md
diff --git a/algorithms-sorting/pom.xml b/algorithms-modules/algorithms-sorting/pom.xml
similarity index 95%
rename from algorithms-sorting/pom.xml
rename to algorithms-modules/algorithms-sorting/pom.xml
index 383014d528..eeccbf814d 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-modules/algorithms-sorting/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
- parent-modules
+ algorithms-modules
1.0.0-SNAPSHOT
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
similarity index 97%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
index 002d4997f4..cf86eda4a6 100644
--- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
+++ b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
@@ -1,4 +1,4 @@
-package com.baeldung.bucketsort;
+package com.baeldung.algorithms.bucketsort;
import java.util.ArrayList;
import java.util.Comparator;
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
similarity index 68%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
index b86f60324f..c1207088da 100644
--- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
+++ b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
@@ -1,4 +1,4 @@
-package com.baeldung.bucketsort;
+package com.baeldung.algorithms.bucketsort;
import java.util.List;
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/heapsort/Heap.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/QuickSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java b/algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java
similarity index 100%
rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java
rename to algorithms-modules/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java
diff --git a/algorithms-sorting/src/main/resources/logback.xml b/algorithms-modules/algorithms-sorting/src/main/resources/logback.xml
similarity index 100%
rename from algorithms-sorting/src/main/resources/logback.xml
rename to algorithms-modules/algorithms-sorting/src/main/resources/logback.xml
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
similarity index 89%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
index 2773d8a68f..4671819673 100644
--- a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
+++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
@@ -1,13 +1,12 @@
-package com.baeldung.bucketsort;
+package com.baeldung.algorithms.bucketsort;
-import com.baeldung.bucketsort.IntegerBucketSorter;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
-import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
public class IntegerBucketSorterUnitTest {
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java
similarity index 100%
rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java
rename to algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java
diff --git a/algorithms-modules/pom.xml b/algorithms-modules/pom.xml
new file mode 100644
index 0000000000..4ba819cfe3
--- /dev/null
+++ b/algorithms-modules/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+ algorithms-modules
+ algorithms-modules
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ algorithms-genetic
+ algorithms-miscellaneous-1
+ algorithms-miscellaneous-2
+ algorithms-miscellaneous-3
+ algorithms-miscellaneous-4
+ algorithms-miscellaneous-5
+ algorithms-miscellaneous-6
+ algorithms-searching
+ algorithms-sorting
+ algorithms-sorting-2
+
+
+
\ No newline at end of file
diff --git a/httpclient-2/.gitignore b/apache-httpclient-2/.gitignore
similarity index 100%
rename from httpclient-2/.gitignore
rename to apache-httpclient-2/.gitignore
diff --git a/httpclient-2/README.md b/apache-httpclient-2/README.md
similarity index 60%
rename from httpclient-2/README.md
rename to apache-httpclient-2/README.md
index 49adf470e9..45f1e41637 100644
--- a/httpclient-2/README.md
+++ b/apache-httpclient-2/README.md
@@ -1,6 +1,6 @@
-## HttpClient 4.x
+## Apache HttpClient
-This module contains articles about HttpClient 4.x
+This module contains articles about Apache HttpClient
### The Course
@@ -12,5 +12,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Reading an HTTP Response Body as a String in Java](https://www.baeldung.com/java-http-response-body-as-string)
- [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies)
- [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging)
-- [Unshorten URLs with HttpClient](https://www.baeldung.com/unshorten-url-httpclient)
-- More articles: [[<-- prev]](../httpclient)
+- [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/apache-httpclient-expand-url)
+- [Apache HttpClient vs. CloseableHttpClient](https://www.baeldung.com/apache-httpclient-vs-closeablehttpclient)
+- More articles: [[<-- prev]](../apache-httpclient)
diff --git a/httpclient-2/pom.xml b/apache-httpclient-2/pom.xml
similarity index 77%
rename from httpclient-2/pom.xml
rename to apache-httpclient-2/pom.xml
index 32f2e80b18..c5b8195472 100644
--- a/httpclient-2/pom.xml
+++ b/apache-httpclient-2/pom.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- httpclient-2
+ apache-httpclient-2
0.1-SNAPSHOT
- httpclient-2
+ apache-httpclient-2
com.baeldung
@@ -55,10 +55,26 @@
spring-boot-starter-webflux
${spring-boot.version}
+
+ org.mock-server
+ mockserver-netty
+ ${mockserver.version}
+
+
+ org.mock-server
+ mockserver-client-java
+ ${mockserver.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
- httpclient-2
+ apache-httpclient-2
src/main/resources
@@ -79,8 +95,10 @@
+ 3.22.0
+ 5.11.2
4.5.8
- 5.1
+ 5.1.3
11
11
2.1.7.RELEASE
diff --git a/httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java b/apache-httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java
similarity index 100%
rename from httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java
rename to apache-httpclient-2/src/main/java/com/baeldung/tlsversion/ClientTlsVersionExamples.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/rare/HttpClientUnshortenLiveTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java
similarity index 89%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/rare/HttpClientUnshortenLiveTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java
index efa7953ba8..5a8c87f4aa 100644
--- a/httpclient-2/src/test/java/com/baeldung/httpclient/rare/HttpClientUnshortenLiveTest.java
+++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/expandurl/HttpClientExpandUrlLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.httpclient.rare;
+package com.baeldung.httpclient.expandurl;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
@@ -22,35 +22,29 @@ import java.util.List;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
-public class HttpClientUnshortenLiveTest {
+public class HttpClientExpandUrlLiveTest {
private CloseableHttpClient client;
- // fixtures
-
@Before
public final void before() {
client = HttpClientBuilder.create().disableRedirectHandling().build();
}
- // tests
-
@Test
- public final void givenShortenedOnce_whenUrlIsUnshortened_thenCorrectResult() throws IOException {
- final String expectedResult = "http://www.baeldung.com/rest-versioning";
- final String actualResult = expandSingleLevel("http://bit.ly/13jEoS1");
+ public final void givenShortenedOnce_whenUrlIsExpanded_thenCorrectResult() throws IOException {
+ final String expectedResult = "https://www.baeldung.com/rest-versioning";
+ final String actualResult = expandSingleLevel("http://bit.ly/3LScTri");
assertThat(actualResult, equalTo(expectedResult));
}
@Test
- public final void givenShortenedMultiple_whenUrlIsUnshortened_thenCorrectResult() throws IOException {
- final String expectedResult = "http://www.baeldung.com/rest-versioning";
+ public final void givenShortenedMultiple_whenUrlIsExpanded_thenCorrectResult() throws IOException {
+ final String expectedResult = "https://www.baeldung.com/rest-versioning";
final String actualResult = expand("http://t.co/e4rDDbnzmk");
assertThat(actualResult, equalTo(expectedResult));
}
- // API
-
private String expand(final String urlArg) throws IOException {
String originalUrl = urlArg;
String newUrl = expandSingleLevel(originalUrl);
diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java
new file mode 100644
index 0000000000..0d45eedc12
--- /dev/null
+++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ApacheHttpClientUnitTest.java
@@ -0,0 +1,78 @@
+package com.baeldung.httpclient.httpclient;
+
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ApacheHttpClientUnitTest extends GetRequestMockServer {
+
+ @Test
+ void givenDeveloperUsedHttpClient_whenExecutingGetRequest_thenStatusIsOkButSonarReportsAnIssue() throws IOException {
+ HttpClient httpClient = HttpClients.createDefault();
+ HttpGet httpGet = new HttpGet(serviceOneUrl);
+ HttpResponse response = httpClient.execute(httpGet);
+ assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK);
+ }
+
+ @Test
+ void givenDeveloperUsedCloseableHttpClient_whenExecutingGetRequest_thenStatusIsOk() throws IOException {
+ try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+ HttpGet httpGet = new HttpGet(serviceOneUrl);
+ HttpResponse response = httpClient.execute(httpGet);
+ assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK);
+ }
+ }
+
+ @Test
+ void givenDeveloperUsedHttpClientBuilder_whenExecutingGetRequest_thenStatusIsOk() throws IOException {
+ try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
+ HttpGet httpGet = new HttpGet(serviceOneUrl);
+ HttpResponse response = httpClient.execute(httpGet);
+ assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK);
+ }
+ }
+
+ @Test
+ void givenDeveloperUsedCloseableHttpResponse_whenExecutingGetRequest_thenStatusIsOk() throws IOException {
+ try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
+ HttpGet httpGet = new HttpGet(serviceOneUrl);
+ try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK);
+ }
+ }
+ }
+
+ @Test
+ void givenDeveloperUsedSingleClient_whenExecutingTwoGetRequest_thenStatusIsOk() throws IOException {
+ try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
+ HttpGet httpGetOne = new HttpGet(serviceOneUrl);
+ try (CloseableHttpResponse responseOne = httpClient.execute(httpGetOne)) {
+ HttpEntity entityOne = responseOne.getEntity();
+ EntityUtils.consume(entityOne);
+ assertThat(responseOne.getCode()).isEqualTo(HttpStatus.SC_OK);
+ }
+
+ HttpGet httpGetTwo = new HttpGet(serviceTwoUrl);
+ try (CloseableHttpResponse responseTwo = httpClient.execute(httpGetTwo)) {
+ HttpEntity entityTwo = responseTwo.getEntity();
+ EntityUtils.consume(entityTwo);
+ assertThat(responseTwo.getCode()).isEqualTo(HttpStatus.SC_OK);
+ }
+ }
+ }
+
+}
diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java
new file mode 100644
index 0000000000..2c08cfa6e4
--- /dev/null
+++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/GetRequestMockServer.java
@@ -0,0 +1,78 @@
+package com.baeldung.httpclient.httpclient;
+
+import org.apache.hc.core5.http.HttpStatus;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.mockserver.client.MockServerClient;
+import org.mockserver.integration.ClientAndServer;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.URISyntaxException;
+
+import static org.mockserver.integration.ClientAndServer.startClientAndServer;
+import static org.mockserver.matchers.Times.exactly;
+import static org.mockserver.model.HttpRequest.request;
+import static org.mockserver.model.HttpResponse.response;
+
+public class GetRequestMockServer {
+
+ public static ClientAndServer mockServer;
+ public static String serviceOneUrl;
+ public static String serviceTwoUrl;
+
+ private static int serverPort;
+
+ public static final String SERVER_ADDRESS = "127.0.0.1";
+ public static final String PATH_ONE = "/test1";
+ public static final String PATH_TWO = "/test2";
+ public static final String METHOD = "GET";
+
+ @BeforeAll
+ static void startServer() throws IOException, URISyntaxException {
+ serverPort = getFreePort();
+ serviceOneUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_ONE;
+ serviceTwoUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_TWO;
+ mockServer = startClientAndServer(serverPort);
+ mockGetRequest();
+ }
+
+ @AfterAll
+ static void stopServer() {
+ mockServer.stop();
+ }
+
+ private static void mockGetRequest() {
+ new MockServerClient(SERVER_ADDRESS, serverPort)
+ .when(
+ request()
+ .withPath(PATH_ONE)
+ .withMethod(METHOD),
+ exactly(5)
+ )
+ .respond(
+ response()
+ .withStatusCode(HttpStatus.SC_OK)
+ .withBody("{\"status\":\"ok\"}")
+ );
+ new MockServerClient(SERVER_ADDRESS, serverPort)
+ .when(
+ request()
+ .withPath(PATH_TWO)
+ .withMethod(METHOD),
+ exactly(1)
+ )
+ .respond(
+ response()
+ .withStatusCode(HttpStatus.SC_OK)
+ .withBody("{\"status\":\"ok\"}")
+ );
+ }
+
+ private static int getFreePort () throws IOException {
+ try (ServerSocket serverSocket = new ServerSocket(0)) {
+ return serverSocket.getLocalPort();
+ }
+ }
+
+}
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClientUnitTest.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpClientUnitTest.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/HttpUrlConnectionUnitTest.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringRestTemplateUnitTest.java
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java
similarity index 100%
rename from httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java
rename to apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java
diff --git a/httpclient-2/src/test/resources/logback.xml b/apache-httpclient-2/src/test/resources/logback.xml
similarity index 100%
rename from httpclient-2/src/test/resources/logback.xml
rename to apache-httpclient-2/src/test/resources/logback.xml
diff --git a/httpclient/.gitignore b/apache-httpclient/.gitignore
similarity index 100%
rename from httpclient/.gitignore
rename to apache-httpclient/.gitignore
diff --git a/httpclient/README.md b/apache-httpclient/README.md
similarity index 80%
rename from httpclient/README.md
rename to apache-httpclient/README.md
index ea3bc28572..338b416df1 100644
--- a/httpclient/README.md
+++ b/apache-httpclient/README.md
@@ -1,6 +1,6 @@
-## HttpClient 4.x
+## Apache HttpClient
-This module contains articles about HttpClient 4.x
+This module contains articles about Apache HttpClient
### The Course
@@ -13,8 +13,8 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Multipart Upload with Apache HttpClient](https://www.baeldung.com/httpclient-multipart-upload)
- [Apache HttpAsyncClient Tutorial](https://www.baeldung.com/httpasyncclient-tutorial)
- [Apache HttpClient Tutorial](https://www.baeldung.com/httpclient-guide)
-- [Advanced HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config)
+- [Advanced Apache HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config)
- [Apache HttpClient – Do Not Follow Redirects](https://www.baeldung.com/httpclient-stop-follow-redirect)
- [Custom User-Agent in Apache HttpClient](https://www.baeldung.com/httpclient-user-agent-header)
- [Apache HttpClient Connection Management](https://www.baeldung.com/httpclient-connection-management)
-- More articles: [[next -->]](../httpclient-2)
+- More articles: [[next -->]](../apache-httpclient-2)
diff --git a/httpclient/pom.xml b/apache-httpclient/pom.xml
similarity index 95%
rename from httpclient/pom.xml
rename to apache-httpclient/pom.xml
index b69981fb13..26eb319ac0 100644
--- a/httpclient/pom.xml
+++ b/apache-httpclient/pom.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- httpclient
+ apache-httpclient
0.1-SNAPSHOT
- httpclient
+ apache-httpclient
com.baeldung
@@ -63,7 +63,7 @@
- httpclient
+ apache-httpclient
src/main/resources
diff --git a/httpclient/src/main/resources/logback.xml b/apache-httpclient/src/main/resources/logback.xml
similarity index 100%
rename from httpclient/src/main/resources/logback.xml
rename to apache-httpclient/src/main/resources/logback.xml
diff --git a/httpclient/src/main/resources/temp.txt b/apache-httpclient/src/main/resources/temp.txt
similarity index 100%
rename from httpclient/src/main/resources/temp.txt
rename to apache-httpclient/src/main/resources/temp.txt
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientRedirectLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientBasicPostLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientSandboxLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/HttpClientConnectionManagementLiveTest.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/IdleConnectionMonitorThread.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/MultiHttpClientConnThread.java
diff --git a/httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java
similarity index 100%
rename from httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java
rename to apache-httpclient/src/test/java/com/baeldung/httpclient/conn/TesterVersion_MultiHttpClientConnThread.java
diff --git a/httpclient/src/test/resources/.gitignore b/apache-httpclient/src/test/resources/.gitignore
similarity index 100%
rename from httpclient/src/test/resources/.gitignore
rename to apache-httpclient/src/test/resources/.gitignore
diff --git a/httpclient/src/test/resources/test.in b/apache-httpclient/src/test/resources/test.in
similarity index 100%
rename from httpclient/src/test/resources/test.in
rename to apache-httpclient/src/test/resources/test.in
diff --git a/httpclient/src/test/resources/uploads/image.jpg b/apache-httpclient/src/test/resources/uploads/image.jpg
similarity index 100%
rename from httpclient/src/test/resources/uploads/image.jpg
rename to apache-httpclient/src/test/resources/uploads/image.jpg
diff --git a/httpclient/src/test/resources/uploads/sandbox.txt b/apache-httpclient/src/test/resources/uploads/sandbox.txt
similarity index 100%
rename from httpclient/src/test/resources/uploads/sandbox.txt
rename to apache-httpclient/src/test/resources/uploads/sandbox.txt
diff --git a/httpclient/src/test/resources/uploads/temp.txt b/apache-httpclient/src/test/resources/uploads/temp.txt
similarity index 100%
rename from httpclient/src/test/resources/uploads/temp.txt
rename to apache-httpclient/src/test/resources/uploads/temp.txt
diff --git a/httpclient/src/test/resources/uploads/zipFile.zip b/apache-httpclient/src/test/resources/uploads/zipFile.zip
similarity index 100%
rename from httpclient/src/test/resources/uploads/zipFile.zip
rename to apache-httpclient/src/test/resources/uploads/zipFile.zip
diff --git a/apache-poi-2/pom.xml b/apache-poi-2/pom.xml
index 30270cd7be..af959292fa 100644
--- a/apache-poi-2/pom.xml
+++ b/apache-poi-2/pom.xml
@@ -1,7 +1,7 @@
+ 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
apache-poi-2
0.0.1-SNAPSHOT
@@ -25,5 +25,4 @@
5.2.0
-
-
+
\ No newline at end of file
diff --git a/apache-spark/README.md b/apache-spark/README.md
index 3a2d2f4e15..862626988b 100644
--- a/apache-spark/README.md
+++ b/apache-spark/README.md
@@ -9,3 +9,4 @@ This module contains articles about Apache Spark
- [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning)
- [Introduction to Spark Graph Processing with GraphFrames](https://www.baeldung.com/spark-graph-graphframes)
- [Apache Spark: Differences between Dataframes, Datasets and RDDs](https://www.baeldung.com/java-spark-dataframe-dataset-rdd)
+- [Spark DataFrame](https://www.baeldung.com/spark-dataframes)
diff --git a/apache-spark/data/customerData.csv b/apache-spark/data/customerData.csv
new file mode 100644
index 0000000000..8661bcb352
--- /dev/null
+++ b/apache-spark/data/customerData.csv
@@ -0,0 +1,9 @@
+id,zoneId,FIRST_NAME,MIDDLE_NAME,LAST_NAME,CITY,gender,transaction_date,transaction_amount
+1,EU11,Ana1,A,MN, London,Female,1/2/2018,5200
+2,EU12,Ana2,A,MN, London,Female,29/3/2018,1000
+3,EU13,Jack1,Josh,MN, London,Male,19/6/2018,9600
+4,EU14,Jack2,Josh,MN, London,Male,9/9/2018,1000
+5,EU15,Nick1,H,Dee,London,Male,9/6/2021,3000
+6,EU16,Nick2,H,Dee,London,Male,27/9/2021,500
+7,EU17,Nick3,H,Dee,London,Male,8/12/2021,500
+8,EU18,Sara1,H,Dee,London,Female,7/4/2021,2000
\ No newline at end of file
diff --git a/apache-spark/data/customerData.json b/apache-spark/data/customerData.json
new file mode 100644
index 0000000000..d713d75678
--- /dev/null
+++ b/apache-spark/data/customerData.json
@@ -0,0 +1,114 @@
+[
+ {
+ "zoneId": "LONDON",
+ "customerId": 1,
+ "gender": "Female",
+ "name": "jane austin",
+ "contact": {
+ "street_Address": "XYZ Road",
+ "address2": "house 47",
+ "zipcode": "MK1110",
+ "county": "DCounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityA"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 15000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 2,
+ "gender": "Male",
+ "name": "Jack Trevor",
+ "contact": {
+ "street_Address": " kingfisher road",
+ "address2": "SUITE 110",
+ "zipcode": "HM1190",
+ "county": "CCounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityB"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 12000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 11,
+ "gender": "Female",
+ "name": "jane1 austin",
+ "contact": {
+ "street_Address": "B Road",
+ "address2": "house 47",
+ "zipcode": "MK1110",
+ "county": "BCounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityA"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 1000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 21,
+ "gender": "Male",
+ "name": "Jack1 Trevor",
+ "contact": {
+ "street_Address": " A road",
+ "address2": "SUITE 777",
+ "zipcode": "AZ890",
+ "county": "ACounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityB"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 1000
+ },
+ {
+ "zoneId": "Wales",
+ "customerId": 3,
+ "gender": "Male",
+ "name": "John Jack",
+ "contact": {
+ "street_Address": "sunny croft",
+ "address2": "SUITE 1",
+ "zipcode": "SN1030",
+ "county": "bucks",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "Cardiff"
+ },
+ "transaction_date": "2018-02-05",
+ "transaction_amount": 5000
+ },
+ {
+ "zoneId": "LONDON",
+ "customerId": 4,
+ "gender": "Male",
+ "name": "Jack Trevor",
+ "contact": {
+ "street_Address": " kingfisher road",
+ "address2": "SUITE 110",
+ "zipcode": "HM1190",
+ "county": "Hampshire",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "CityB"
+ },
+ "transaction_date": "2021-02-05",
+ "transaction_amount": 500
+ },
+ {
+ "zoneId": "Wales",
+ "customerId": 5,
+ "gender": "Male",
+ "name": "John Jack",
+ "contact": {
+ "street_Address": "sunny croft",
+ "address2": "SUITE 1",
+ "zipcode": "SN1030",
+ "county": "ECounty",
+ "phone_number": "(919) 403-0025",
+ "customer_city": "Cardiff"
+ },
+ "transaction_date": "2018-01-25",
+ "transaction_amount": 500
+ }
+]
diff --git a/apache-spark/data/minCustomerData.json b/apache-spark/data/minCustomerData.json
new file mode 100644
index 0000000000..a47a739d51
--- /dev/null
+++ b/apache-spark/data/minCustomerData.json
@@ -0,0 +1,20 @@
+[
+ {
+ "id": "1",
+ "gender": "Female",
+ "name": "Jo",
+ "transaction_amount": 200
+ },
+ {
+ "id":"2",
+ "gender": "Male",
+ "name": "Mike",
+ "transaction_amount": 500
+ },
+ {
+ "id": "3",
+ "gender": "Male",
+ "name": "Dave",
+ "transaction_amount": 5000
+ }
+]
\ No newline at end of file
diff --git a/apache-spark/docker/docker-compose.yaml b/apache-spark/docker/docker-compose.yaml
new file mode 100644
index 0000000000..960e543229
--- /dev/null
+++ b/apache-spark/docker/docker-compose.yaml
@@ -0,0 +1,33 @@
+version: "3"
+
+services:
+ postgres:
+ image: postgres:12.3-alpine
+ restart: always
+ environment:
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_USER: postgres
+ expose:
+ - 5432
+ ports:
+ - 5432:5432
+ command: -p 5432
+ volumes:
+ - ./init.sql:/docker-entrypoint-initdb.d/init.sql
+# - postgres:/var/lib/postgresql/data
+
+ pgadmin:
+ image: dpage/pgadmin4:4.23
+ environment:
+ PGADMIN_DEFAULT_EMAIL: admin@pgadmin.com
+ PGADMIN_DEFAULT_PASSWORD: password
+ PGADMIN_LISTEN_PORT: 80
+ ports:
+ - 15432:80
+ volumes:
+ - pgadmin:/var/lib/pgadmin
+ depends_on:
+ - postgres
+
+volumes:
+ pgadmin:
\ No newline at end of file
diff --git a/apache-spark/docker/init.sql b/apache-spark/docker/init.sql
new file mode 100755
index 0000000000..371135faa3
--- /dev/null
+++ b/apache-spark/docker/init.sql
@@ -0,0 +1 @@
+CREATE DATABASE customerdb;
\ No newline at end of file
diff --git a/apache-spark/pom.xml b/apache-spark/pom.xml
index 05c5088662..b86e99433a 100644
--- a/apache-spark/pom.xml
+++ b/apache-spark/pom.xml
@@ -20,37 +20,31 @@
org.apache.spark
spark-core_2.11
${org.apache.spark.spark-core.version}
- provided
org.apache.spark
spark-sql_2.11
${org.apache.spark.spark-sql.version}
- provided
org.apache.spark
spark-graphx_2.11
${org.apache.spark.spark-graphx.version}
- provided
graphframes
graphframes
${graphframes.version}
- provided
org.apache.spark
spark-streaming_2.11
${org.apache.spark.spark-streaming.version}
- provided
org.apache.spark
spark-mllib_2.11
${org.apache.spark.spark-mllib.version}
- provided
org.apache.spark
@@ -67,6 +61,11 @@
spark-cassandra-connector-java_2.11
${com.datastax.spark.spark-cassandra-connector-java.version}
+
+ org.postgresql
+ postgresql
+ ${postgres.version}
+
@@ -108,6 +107,7 @@
2.4.8
2.5.2
1.6.0-M1
+ 42.3.3
\ No newline at end of file
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java b/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java
new file mode 100644
index 0000000000..97fa160872
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/Customer.java
@@ -0,0 +1,52 @@
+package com.baeldung.dataframes;
+
+public class Customer {
+ String id;
+ String name;
+ String gender;
+ int transaction_amount;
+
+ public Customer() {
+
+ }
+
+ public Customer(String id, String name, String gender, int transaction_amount) {
+ this.id = id;
+ this.name = name;
+ this.gender = gender;
+ this.transaction_amount = transaction_amount;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ public int getTransaction_amount() {
+ return transaction_amount;
+ }
+
+ public void setTransaction_amount(int transaction_amount) {
+ this.transaction_amount = transaction_amount;
+ }
+
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java
new file mode 100644
index 0000000000..869645624a
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerDataAggregationPipeline.java
@@ -0,0 +1,129 @@
+package com.baeldung.dataframes;
+
+import static org.apache.spark.sql.functions.col;
+import static org.apache.spark.sql.functions.column;
+import static org.apache.spark.sql.functions.concat;
+import static org.apache.spark.sql.functions.lit;
+
+import java.util.Properties;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SaveMode;
+import org.apache.spark.sql.SparkSession;
+import org.apache.spark.sql.functions;
+
+public class CustomerDataAggregationPipeline {
+ private static final SparkSession SPARK_SESSION = SparkDriver.getSparkSession();
+
+ private final Properties dbProperties;
+
+ public CustomerDataAggregationPipeline(Properties properties) {
+ dbProperties = properties;
+ }
+
+ public static void main(String[] args) {
+ // replace with actual DB properties
+ Properties dbProps = new Properties();
+ dbProps.setProperty("connectionURL", "jdbc:postgresql://localhost:5432/customerdb");
+ dbProps.setProperty("driver", "org.postgresql.Driver");
+ dbProps.setProperty("user", "postgres");
+ dbProps.setProperty("password", "postgres");
+
+ new CustomerDataAggregationPipeline(dbProps).run();
+ }
+
+ public void run() {
+ Dataset ebayDFRaw = ingestCustomerDataFromEbay();
+ Dataset ebayDf = normalizeCustomerDataFromEbay(ebayDFRaw);
+
+ Dataset amazonDFRaw = ingestCustomerDataFromAmazon();
+ Dataset amazonDf = normalizeCustomerDataFromAmazon(amazonDFRaw);
+
+ Dataset combineDataframes = combineDataframes(ebayDf, amazonDf);
+
+ Dataset rowDataset = aggregateYearlySalesByGender(combineDataframes);
+
+ exportData(rowDataset);
+ }
+
+ private static Dataset ingestCustomerDataFromAmazon() {
+ return SPARK_SESSION.read()
+ .format("csv")
+ .option("header", "true")
+ .schema(SchemaFactory.customerSchema())
+ .option("dateFormat", "m/d/YYYY")
+ .load("data/customerData.csv");
+ }
+
+ private static Dataset ingestCustomerDataFromEbay() {
+ return SPARK_SESSION.read()
+ .format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat")
+ .option("multiline", true)
+ .load("data/customerData.json");
+ }
+
+ private static Dataset combineDataframes(Dataset df1, Dataset df2) {
+ return df1.unionByName(df2);
+ }
+
+ private static Dataset normalizeCustomerDataFromEbay(Dataset rawDataset) {
+ Dataset transformedDF = rawDataset.withColumn("id", concat(rawDataset.col("zoneId"), lit("-"), rawDataset.col("customerId")))
+ .drop(column("customerId"))
+ .withColumn("source", lit("ebay"))
+ .withColumn("city", rawDataset.col("contact.customer_city"))
+ .drop(column("contact"))
+ .drop(column("zoneId"))
+ .withColumn("year", functions.year(col("transaction_date")))
+ .drop("transaction_date")
+ .withColumn("firstName", functions.split(column("name"), " ")
+ .getItem(0))
+ .withColumn("lastName", functions.split(column("name"), " ")
+ .getItem(1))
+ .drop(column("name"));
+
+ print(transformedDF);
+ return transformedDF;
+ }
+
+ private static Dataset normalizeCustomerDataFromAmazon(Dataset rawDataset) {
+
+ Dataset transformedDF = rawDataset.withColumn("id", concat(rawDataset.col("zoneId"), lit("-"), rawDataset.col("id")))
+ .withColumn("source", lit("amazon"))
+ .withColumnRenamed("CITY", "city")
+ .withColumnRenamed("PHONE_NO", "contactNo")
+ .withColumnRenamed("POSTCODE", "postCode")
+ .withColumnRenamed("FIRST_NAME", "firstName")
+ .drop(column("MIDDLE_NAME"))
+ .drop(column("zoneId"))
+ .withColumnRenamed("LAST_NAME", "lastName")
+ .withColumn("year", functions.year(col("transaction_date")))
+ .drop("transaction_date");
+
+ print(transformedDF);
+ return transformedDF;
+ }
+
+ private static Dataset aggregateYearlySalesByGender(Dataset dataset) {
+
+ Dataset aggDF = dataset.groupBy(column("year"), column("source"), column("gender"))
+ .sum("transaction_amount")
+ .withColumnRenamed("sum(transaction_amount)", "annual_spending")
+ .orderBy(col("year").asc(), col("annual_spending").desc());
+
+ print(aggDF);
+ return aggDF;
+ }
+
+ private static void print(Dataset aggDs) {
+ aggDs.show();
+ aggDs.printSchema();
+ }
+
+ private void exportData(Dataset dataset) {
+ String connectionURL = dbProperties.getProperty("connectionURL");
+ dataset.write()
+ .mode(SaveMode.Overwrite)
+ .jdbc(connectionURL, "customer", dbProperties);
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java
new file mode 100644
index 0000000000..53799c1079
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToDataFrameConverterApp.java
@@ -0,0 +1,46 @@
+package com.baeldung.dataframes;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+
+public class CustomerToDataFrameConverterApp {
+
+ private static final List CUSTOMERS = Arrays.asList(
+ aCustomerWith("01", "jo", "Female", 2000),
+ aCustomerWith("02", "jack", "Male", 1200)
+ );
+
+ public static void main(String[] args) {
+ Dataset dataFrame = convertAfterMappingRows(CUSTOMERS);
+ print(dataFrame);
+ Dataset customerDF = convertToDataFrameWithNoChange();
+ print(customerDF);
+ }
+
+ public static Dataset convertToDataFrameWithNoChange() {
+ return SparkDriver.getSparkSession().createDataFrame(CUSTOMERS, Customer.class);
+ }
+
+ public static Dataset convertAfterMappingRows(List customer) {
+ List rows = customer.stream()
+ .map(c -> new CustomerToRowMapper().call(c))
+ .collect(Collectors.toList());
+
+ return SparkDriver.getSparkSession()
+ .createDataFrame(rows, SchemaFactory.minimumCustomerDataSchema());
+ }
+
+ private static Customer aCustomerWith(String id, String name, String gender, int amount) {
+ return new Customer(id, name, gender, amount);
+ }
+
+ private static void print(Dataset dataFrame) {
+ dataFrame.printSchema();
+ dataFrame.show();
+ }
+
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java
new file mode 100644
index 0000000000..e54bceb3ad
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/CustomerToRowMapper.java
@@ -0,0 +1,18 @@
+package com.baeldung.dataframes;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.spark.api.java.function.MapFunction;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.RowFactory;
+
+public class CustomerToRowMapper implements MapFunction {
+
+ @Override
+ public Row call(Customer customer) {
+ Row row = RowFactory.create(
+ customer.getId(), customer.getName().toUpperCase(),
+ StringUtils.substring(customer.getGender(),0, 1),
+ customer.getTransaction_amount());
+ return row;
+ }
+}
\ No newline at end of file
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java
new file mode 100644
index 0000000000..31ad8de12b
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/DataFrameToCustomerConverterApp.java
@@ -0,0 +1,21 @@
+package com.baeldung.dataframes;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Encoders;
+import org.apache.spark.sql.Row;
+
+public class DataFrameToCustomerConverterApp {
+
+ public static void main(String[] args) {
+ Dataset df = SparkDriver.getSparkSession()
+ .read()
+ .format("org.apache.spark.sql.execution.datasources.json.JsonFileFormat")
+ .option("multiline", true)
+ .load("data/minCustomerData.json");
+ df.show();
+ df.printSchema();
+ Dataset customerDS = df.map(new RowToCustomerMapper(), Encoders.bean(Customer. class));
+ customerDS.show();
+ customerDS.printSchema();
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java b/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java
new file mode 100644
index 0000000000..23db18dddf
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/DataSetToDataFrameConverterApp.java
@@ -0,0 +1,57 @@
+package com.baeldung.dataframes;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Encoders;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SparkSession;
+
+public class DataSetToDataFrameConverterApp {
+
+ private static final SparkSession SPARK_SESSION = SparkDriver.getSparkSession();
+
+ public static void main(String[] args) {
+
+ Dataset customerDataset = convertToDataSetFromPOJO();
+ Dataset customerDataFrame = customerDataset.toDF();
+ print(customerDataFrame);
+
+ List names = getNames();
+ Dataset namesDataset = convertToDataSetFromStrings(names);
+ Dataset namesDataFrame = namesDataset.toDF();
+ print(namesDataFrame);
+ }
+
+ private static Dataset convertToDataSetFromStrings(List names) {
+ return SPARK_SESSION.createDataset(names, Encoders.STRING());
+ }
+
+ private static Dataset convertToDataSetFromPOJO() {
+ return SPARK_SESSION.createDataset(CUSTOMERS, Encoders.bean(Customer.class));
+ }
+
+ private static final List CUSTOMERS = Arrays.asList(
+ aCustomerWith("01", "jo", "Female", 2000),
+ aCustomerWith("02", "jack", "Female", 1200),
+ aCustomerWith("03", "ash", "male", 2000),
+ aCustomerWith("04", "emma", "Female", 2000)
+ );
+
+ private static List getNames() {
+ return CUSTOMERS.stream()
+ .map(Customer::getName)
+ .collect(Collectors.toList());
+ }
+
+ private static void print(Dataset df) {
+ df.show();
+ df.printSchema();
+ }
+
+ private static Customer aCustomerWith(String id, String name, String gender, int amount) {
+ return new Customer(id, name, gender, amount);
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java b/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java
new file mode 100644
index 0000000000..02fde539c8
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/RowToCustomerMapper.java
@@ -0,0 +1,19 @@
+package com.baeldung.dataframes;
+
+import org.apache.spark.api.java.function.MapFunction;
+import org.apache.spark.sql.Row;
+
+class RowToCustomerMapper implements MapFunction {
+
+ @Override
+ public Customer call(Row row) {
+
+ Customer customer = new Customer();
+ customer.setId(row.getAs("id"));
+ customer.setName(row.getAs("name"));
+ customer.setGender(row.getAs("gender"));
+ customer.setTransaction_amount(Math.toIntExact(row.getAs("transaction_amount")));
+
+ return customer;
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java b/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java
new file mode 100644
index 0000000000..6c298e4829
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/SchemaFactory.java
@@ -0,0 +1,31 @@
+package com.baeldung.dataframes;
+
+import org.apache.spark.sql.types.DataTypes;
+import org.apache.spark.sql.types.StructField;
+import org.apache.spark.sql.types.StructType;
+
+public class SchemaFactory {
+
+ public static StructType customerSchema() {
+ return DataTypes.createStructType(
+ new StructField[] { DataTypes.createStructField("id", DataTypes.IntegerType, false),
+ DataTypes.createStructField("zoneId", DataTypes.StringType, false),
+ DataTypes.createStructField("FIRST_NAME", DataTypes.StringType, false),
+ DataTypes.createStructField("MIDDLE_NAME", DataTypes.StringType, false),
+ DataTypes.createStructField("LAST_NAME", DataTypes.StringType, false),
+ DataTypes.createStructField("CITY", DataTypes.StringType, false),
+ DataTypes.createStructField("gender", DataTypes.StringType, false),
+ DataTypes.createStructField("transaction_date", DataTypes.DateType, false),
+ DataTypes.createStructField("transaction_amount", DataTypes.IntegerType, false)
+ });
+ }
+
+ public static StructType minimumCustomerDataSchema() {
+ return DataTypes.createStructType(new StructField[] {
+ DataTypes.createStructField("id", DataTypes.StringType, true),
+ DataTypes.createStructField("name", DataTypes.StringType, true),
+ DataTypes.createStructField("gender", DataTypes.StringType, true),
+ DataTypes.createStructField("transaction_amount", DataTypes.IntegerType, true)
+ });
+ }
+}
diff --git a/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java b/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java
new file mode 100644
index 0000000000..adc25170a7
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/dataframes/SparkDriver.java
@@ -0,0 +1,16 @@
+package com.baeldung.dataframes;
+
+import java.io.Serializable;
+
+import org.apache.spark.sql.SparkSession;
+
+public class SparkDriver implements Serializable {
+
+ public static SparkSession getSparkSession() {
+ return SparkSession.builder()
+ .appName("Customer Aggregation pipeline")
+ .master("local")
+ .getOrCreate();
+
+ }
+}
diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java
new file mode 100644
index 0000000000..52a7b1451f
--- /dev/null
+++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerDataAggregationPipelineLiveTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.dataframes;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+class CustomerDataAggregationPipelineLiveTest {
+
+ private static Connection conn;
+
+ @BeforeAll
+ static void beforeAll() throws SQLException {
+ DriverManager.registerDriver(new org.postgresql.Driver());
+ String dbURL1 = "jdbc:postgresql://localhost:5432/customerdb";
+ conn = DriverManager.getConnection(dbURL1, "postgres", "postgres");
+
+ String sql = "drop table if exists customer";
+
+ PreparedStatement statement = conn.prepareStatement(sql);
+ statement.executeUpdate();
+ }
+
+ @Test
+ void givenCSVAndJSON_whenRun_thenStoresAggregatedDataFrameInDB() throws Exception {
+ Properties dbProps = new Properties();
+ dbProps.setProperty("connectionURL", "jdbc:postgresql://localhost:5432/customerdb");
+ dbProps.setProperty("driver", "org.postgresql.Driver");
+ dbProps.setProperty("user", "postgres");
+ dbProps.setProperty("password", "postgres");
+
+ CustomerDataAggregationPipeline pipeline = new CustomerDataAggregationPipeline(dbProps);
+ pipeline.run();
+
+ String allCustomersSql = "Select count(*) from customer";
+
+ Statement statement = conn.createStatement();
+ ResultSet resultSet = statement.executeQuery(allCustomersSql);
+ resultSet.next();
+ int count = resultSet.getInt(1);
+ assertEquals(7, count);
+ }
+
+}
diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
new file mode 100644
index 0000000000..06c8f66bcd
--- /dev/null
+++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.dataframes;
+
+import static com.baeldung.dataframes.CustomerToDataFrameConverterApp.convertAfterMappingRows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.junit.jupiter.api.Test;
+
+class CustomerToDataFrameConverterAppUnitTest {
+
+ @Test
+ void givenCustomers_whenConvertAfterMappingRows_thenConvertsToDataSet() {
+
+ List customers = Arrays.asList(
+ new Customer("01", "jo", "Female", 2000),
+ new Customer("02", "jack", "Male", 1200)
+ );
+
+ Dataset customerDF = convertAfterMappingRows(customers);
+ List rows = customerDF.collectAsList();
+ Row row1 = rows.get(0);
+ Row row2 = rows.get(1);
+
+ assertEquals("01", row1.get(0));
+ assertEquals( "JO", row1.get(1));
+ assertEquals( "F", row1.get(2));
+ assertEquals( 2000, row1.get(3));
+
+ assertEquals("02", row2.get(0));
+ assertEquals( "JACK", row2.get(1));
+ assertEquals( "M", row2.get(2));
+ assertEquals( 1200, row2.get(3));
+ }
+
+ @Test
+ void givenCustomers_whenConvertWithNoChange_thenConvertsToDataSet() {
+
+ List customers = Arrays.asList(
+ new Customer("01", "jo", "Female", 2000),
+ new Customer("02", "jack", "Male", 1200)
+ );
+
+ Dataset customerDF = CustomerToDataFrameConverterApp.convertToDataFrameWithNoChange();
+ List rows = customerDF.collectAsList();
+ Row row1 = rows.get(0);
+ Row row2 = rows.get(1);
+
+ assertEquals("01", row1.getAs("id"));
+ assertEquals( "jo", row1.getAs("name"));
+ assertEquals( "Female", row1.getAs("gender"));
+ assertEquals( 2000, (int)row1.getAs("transaction_amount"));
+
+ assertEquals("02", row2.getAs("id"));
+ assertEquals( "jack", row2.getAs("name"));
+ assertEquals( "Male", row2.getAs("gender"));
+ assertEquals( 1200, (int)row2.getAs("transaction_amount"));
+ }
+}
diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java
index a3e1811e6f..b1083021a9 100644
--- a/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java
+++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/ActionsUnitTest.java
@@ -12,21 +12,29 @@ import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import scala.Tuple2;
public class ActionsUnitTest {
+
+ public static final Logger LOG = LoggerFactory.getLogger(ActionsUnitTest.class);
+
private static JavaRDD tourists;
private static JavaSparkContext sc;
public static final String COMMA_DELIMITER = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
-
+
@BeforeClass
public static void init() {
- SparkConf conf = new SparkConf().setAppName("reduce")
- .setMaster("local[*]");
+ SparkConf conf = new SparkConf()
+ .setAppName("reduce")
+ .setMaster("local[*]")
+ .set("spark.driver.allowMultipleContexts", "true");
+
sc = new JavaSparkContext(conf);
tourists = sc.textFile("data/Tourist.csv").filter(line -> !line.startsWith("Region"));
}
-
+
@AfterClass
public static void cleanup() {
sc.close();
@@ -40,11 +48,11 @@ public class ActionsUnitTest {
})
.distinct();
Long numberOfCountries = countries.count();
- System.out.println("Count: " + numberOfCountries);
-
+ LOG.debug("Count: {}", numberOfCountries);
+
assertEquals(Long.valueOf(220), numberOfCountries);
}
-
+
@Test
public void whenReduceByKeySum_thenTotalValuePerKey() {
JavaRDD touristsExpenditure = tourists.filter(line -> line.split(COMMA_DELIMITER)[3].contains("expenditure"));
@@ -53,10 +61,12 @@ public class ActionsUnitTest {
String[] columns = line.split(COMMA_DELIMITER);
return new Tuple2<>(columns[1], Double.valueOf(columns[6]));
});
- List> totalByCountry = expenditurePairRdd.reduceByKey((x, y) -> x + y)
- .collect();
- System.out.println("Total per Country: " + totalByCountry);
-
+ List> totalByCountry = expenditurePairRdd
+ .reduceByKey(Double::sum)
+ .collect();
+
+ LOG.debug("Total per Country: {}", totalByCountry);
+
for(Tuple2 tuple : totalByCountry) {
if (tuple._1.equals("Mexico")) {
assertEquals(Double.valueOf(99164), tuple._2);
diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java
index f294e5bc66..621e589fb6 100644
--- a/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java
+++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/DataFrameUnitTest.java
@@ -39,8 +39,10 @@ public class DataFrameUnitTest {
@Test
public void whenSelectSpecificColumns_thenColumnsFiltered() {
Dataset selectedData = data.select(col("country"), col("year"), col("value"));
- selectedData.show();
-
+
+ // uncomment to see table
+ // selectedData.show();
+
List resultList = Arrays.asList(selectedData.columns());
assertTrue(resultList.contains("country"));
assertTrue(resultList.contains("year"));
@@ -52,22 +54,26 @@ public class DataFrameUnitTest {
@Test
public void whenFilteringByCountry_thenCountryRecordsSelected() {
Dataset filteredData = data.filter(col("country").equalTo("Mexico"));
- filteredData.show();
-
+
+ // uncomment to see table
+ // filteredData.show();
+
filteredData.foreach(record -> {
assertEquals("Mexico", record.get(1));
});
-
+
}
@Test
public void whenGroupCountByCountry_thenContryTotalRecords() {
Dataset recordsPerCountry = data.groupBy(col("country"))
.count();
- recordsPerCountry.show();
-
+
+ // uncomment to see table
+ // recordsPerCountry.show();
+
Dataset filteredData = recordsPerCountry.filter(col("country").equalTo("Sweden"));
- assertEquals(new Long(12), filteredData.first()
+ assertEquals(12L, filteredData.first()
.get(1));
}
diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java
index 1d83505812..4fde933a3b 100644
--- a/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java
+++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/DatasetUnitTest.java
@@ -3,6 +3,7 @@ package com.baeldung.differences.rdd;
import static org.apache.spark.sql.functions.col;
import static org.apache.spark.sql.functions.sum;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import org.apache.spark.api.java.function.FilterFunction;
import org.apache.spark.sql.DataFrameReader;
@@ -29,8 +30,8 @@ public class DatasetUnitTest {
DataFrameReader dataFrameReader = session.read();
Dataset data = dataFrameReader.option("header", "true")
.csv("data/Tourist.csv");
- Dataset responseWithSelectedColumns = data.select(col("region"),
- col("country"), col("year"), col("series"), col("value").cast("double"),
+ Dataset responseWithSelectedColumns = data.select(col("region"),
+ col("country"), col("year"), col("series"), col("value").cast("double"),
col("footnotes"), col("source"));
typedDataset = responseWithSelectedColumns.as(Encoders.bean(TouristData.class));
}
@@ -45,7 +46,9 @@ public class DatasetUnitTest {
Dataset selectedData = typedDataset
.filter((FilterFunction) record -> record.getCountry()
.equals("Norway"));
- selectedData.show();
+
+ // uncomment to see output
+ // selectedData.show();
selectedData.foreach(record -> {
assertEquals("Norway", record.getCountry());
@@ -56,28 +59,41 @@ public class DatasetUnitTest {
public void whenGroupCountByCountry_thenContryTotalRecords() {
Dataset countriesCount = typedDataset.groupBy(typedDataset.col("country"))
.count();
- countriesCount.show();
- assertEquals(Long.valueOf(220), Long.valueOf(countriesCount.count()));
+ // uncomment to see output
+ // countriesCount.show();
+
+ assertEquals(220, countriesCount.count());
}
@Test
public void whenFilteredByPropertyRange_thenRetreiveValidRecords() {
// Filter records with existing data for years between 2010 and 2017
- typedDataset.filter((FilterFunction) record -> record.getYear() != null
- && (Long.valueOf(record.getYear()) > 2010 && Long.valueOf(record.getYear()) < 2017))
- .show();
+ Dataset filteredData = typedDataset.filter(
+ (FilterFunction) record -> record.getYear() != null
+ && (Long.parseLong(record.getYear()) > 2010 && Long.parseLong(record.getYear()) < 2017));
+
+ // uncomment to see output
+ // filteredData.show();
+
+ assertEquals(394, filteredData.count());
+ filteredData.foreach(record -> {
+ assertTrue(Integer.parseInt(record.getYear()) > 2010 && Integer.parseInt(record.getYear()) < 2017);
+ });
}
-
+
@Test
public void whenSumValue_thenRetreiveTotalValue() {
// Total tourist expenditure by country
- typedDataset.filter((FilterFunction) record -> record.getValue() != null
- && record.getSeries()
- .contains("expenditure"))
- .groupBy("country")
- .agg(sum("value"))
- .show();
+ Dataset filteredData = typedDataset.filter((FilterFunction) record -> record.getValue() != null
+ && record.getSeries().contains("expenditure"))
+ .groupBy("country")
+ .agg(sum("value"));
+
+ // uncomment to see output
+ // filteredData.show();
+
+ assertEquals(212, filteredData.count());
}
}
diff --git a/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java b/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java
index 01e7d3adfc..6de407f3b4 100644
--- a/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java
+++ b/apache-spark/src/test/java/com/baeldung/differences/rdd/TransformationsUnitTest.java
@@ -23,8 +23,11 @@ public class TransformationsUnitTest {
@BeforeClass
public static void init() {
- SparkConf conf = new SparkConf().setAppName("uppercaseCountries")
- .setMaster("local[*]");
+ SparkConf conf = new SparkConf()
+ .setAppName("uppercaseCountries")
+ .setMaster("local[*]")
+ .set("spark.driver.allowMultipleContexts", "true");
+
sc = new JavaSparkContext(conf);
tourists = sc.textFile("data/Tourist.csv")
.filter(line -> !line.startsWith("Region")); //filter header row
diff --git a/apache-tapestry/pom.xml b/apache-tapestry/pom.xml
index 7a4c2b53b5..201b807d9f 100644
--- a/apache-tapestry/pom.xml
+++ b/apache-tapestry/pom.xml
@@ -3,12 +3,17 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.baeldung
apache-tapestry
0.0.1-SNAPSHOT
apache-tapestry
war
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
-
- org.lucee
- jets3t
- ${jets3t-version}
-
-
- org.lucee
- commons-codec
- ${commons-codec-version}
-
@@ -89,6 +78,25 @@
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ ${maven-plugins-version}
+
+
+ copy
+ compile
+
+ copy-dependencies
+
+
+
+ so,dll,dylib
+ native-libs
+
+
+
+
@@ -110,6 +118,7 @@
1.10.L001
0.9.4.0006L
3.0.0
+ 3.1.1
\ No newline at end of file
diff --git a/aws/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java
rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java
diff --git a/aws/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java
rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java
diff --git a/aws/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java
rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java
diff --git a/aws/src/main/java/com/baeldung/ec2/EC2Application.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/ec2/EC2Application.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/ec2/EC2Application.java
rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/ec2/EC2Application.java
diff --git a/aws/src/main/java/com/baeldung/rds/AWSRDSService.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/rds/AWSRDSService.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/rds/AWSRDSService.java
rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/rds/AWSRDSService.java
diff --git a/aws/src/main/java/com/baeldung/sqs/SQSApplication.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SQSApplication.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/sqs/SQSApplication.java
rename to aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SQSApplication.java
diff --git a/aws/src/main/resources/db.properties b/aws-modules/aws-miscellaneous/src/main/resources/db.properties
similarity index 100%
rename from aws/src/main/resources/db.properties
rename to aws-modules/aws-miscellaneous/src/main/resources/db.properties
diff --git a/aws-lambda/lambda/src/main/resources/logback.xml b/aws-modules/aws-miscellaneous/src/main/resources/logback.xml
similarity index 100%
rename from aws-lambda/lambda/src/main/resources/logback.xml
rename to aws-modules/aws-miscellaneous/src/main/resources/logback.xml
diff --git a/aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java
similarity index 100%
rename from aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java
rename to aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java
diff --git a/aws/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java
similarity index 100%
rename from aws/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java
rename to aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java
diff --git a/aws/src/test/resources/test.properties b/aws-modules/aws-miscellaneous/src/test/resources/test.properties
similarity index 100%
rename from aws/src/test/resources/test.properties
rename to aws-modules/aws-miscellaneous/src/test/resources/test.properties
diff --git a/aws-reactive/README.md b/aws-modules/aws-reactive/README.md
similarity index 58%
rename from aws-reactive/README.md
rename to aws-modules/aws-reactive/README.md
index 1abf987b52..9164bd0ea6 100644
--- a/aws-reactive/README.md
+++ b/aws-modules/aws-reactive/README.md
@@ -1,3 +1,7 @@
+## AWS Reactive
+
+This module contains articles about reactive support with AWS
+
### Relevant Articles:
- [AWS S3 with Java – Reactive Support](https://www.baeldung.com/java-aws-s3-reactive)
diff --git a/aws-reactive/images/rective-upload.png b/aws-modules/aws-reactive/images/rective-upload.png
similarity index 100%
rename from aws-reactive/images/rective-upload.png
rename to aws-modules/aws-reactive/images/rective-upload.png
diff --git a/aws-reactive/images/rective-upload.txt b/aws-modules/aws-reactive/images/rective-upload.txt
similarity index 100%
rename from aws-reactive/images/rective-upload.txt
rename to aws-modules/aws-reactive/images/rective-upload.txt
diff --git a/aws-reactive/images/thread-per-client.png b/aws-modules/aws-reactive/images/thread-per-client.png
similarity index 100%
rename from aws-reactive/images/thread-per-client.png
rename to aws-modules/aws-reactive/images/thread-per-client.png
diff --git a/aws-reactive/images/thread-per-client.txt b/aws-modules/aws-reactive/images/thread-per-client.txt
similarity index 100%
rename from aws-reactive/images/thread-per-client.txt
rename to aws-modules/aws-reactive/images/thread-per-client.txt
diff --git a/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml
similarity index 98%
rename from aws-reactive/pom.xml
rename to aws-modules/aws-reactive/pom.xml
index 923e1361ab..7a9cefb9d1 100644
--- a/aws-reactive/pom.xml
+++ b/aws-modules/aws-reactive/pom.xml
@@ -10,7 +10,7 @@
com.baeldung
- parent-modules
+ aws-modules
1.0.0-SNAPSHOT
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java
diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java
similarity index 100%
rename from aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java
rename to aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java
diff --git a/aws-reactive/src/main/resources/application-minio.yml b/aws-modules/aws-reactive/src/main/resources/application-minio.yml
similarity index 100%
rename from aws-reactive/src/main/resources/application-minio.yml
rename to aws-modules/aws-reactive/src/main/resources/application-minio.yml
diff --git a/aws-reactive/src/main/resources/application.yml b/aws-modules/aws-reactive/src/main/resources/application.yml
similarity index 100%
rename from aws-reactive/src/main/resources/application.yml
rename to aws-modules/aws-reactive/src/main/resources/application.yml
diff --git a/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java b/aws-modules/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java
similarity index 100%
rename from aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java
rename to aws-modules/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java
diff --git a/aws-reactive/src/test/resources/testimage1.png b/aws-modules/aws-reactive/src/test/resources/testimage1.png
similarity index 100%
rename from aws-reactive/src/test/resources/testimage1.png
rename to aws-modules/aws-reactive/src/test/resources/testimage1.png
diff --git a/aws-reactive/src/test/resources/testimage2.png b/aws-modules/aws-reactive/src/test/resources/testimage2.png
similarity index 100%
rename from aws-reactive/src/test/resources/testimage2.png
rename to aws-modules/aws-reactive/src/test/resources/testimage2.png
diff --git a/aws-modules/aws-s3/.gitignore b/aws-modules/aws-s3/.gitignore
new file mode 100644
index 0000000000..bf11a4cc38
--- /dev/null
+++ b/aws-modules/aws-s3/.gitignore
@@ -0,0 +1,2 @@
+/target/
+.idea/
\ No newline at end of file
diff --git a/aws-modules/aws-s3/README.md b/aws-modules/aws-s3/README.md
new file mode 100644
index 0000000000..efebf7d933
--- /dev/null
+++ b/aws-modules/aws-s3/README.md
@@ -0,0 +1,9 @@
+## AWS S3
+
+This module contains articles about Simple Storage Service (S3) on AWS
+
+### Relevant articles
+
+- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java)
+- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload)
+- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3)
\ No newline at end of file
diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml
new file mode 100644
index 0000000000..e7e04782b1
--- /dev/null
+++ b/aws-modules/aws-s3/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+ aws-s3
+ 0.1.0-SNAPSHOT
+ aws-s3
+ jar
+
+
+ com.baeldung
+ aws-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.amazonaws
+ aws-java-sdk
+ ${aws-java-sdk.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ org.lucee
+ jets3t
+ ${jets3t-version}
+
+
+ org.lucee
+ commons-codec
+ ${commons-codec-version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+ false
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+
+ 1.11.290
+ 1.10.L001
+ 0.9.4.0006L
+ 3.0.0
+
+
+
\ No newline at end of file
diff --git a/aws/src/main/java/com/baeldung/s3/AWSS3Service.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/s3/AWSS3Service.java
rename to aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java
diff --git a/aws/src/main/java/com/baeldung/s3/MultipartUpload.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/MultipartUpload.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/s3/MultipartUpload.java
rename to aws-modules/aws-s3/src/main/java/com/baeldung/s3/MultipartUpload.java
diff --git a/aws/src/main/java/com/baeldung/s3/S3Application.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/s3/S3Application.java
rename to aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java
diff --git a/aws/src/main/resources/logback.xml b/aws-modules/aws-s3/src/main/resources/logback.xml
similarity index 100%
rename from aws/src/main/resources/logback.xml
rename to aws-modules/aws-s3/src/main/resources/logback.xml
diff --git a/aws/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java
similarity index 100%
rename from aws/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java
rename to aws-modules/aws-s3/src/test/java/com/baeldung/jets3t/JetS3tLiveTest.java
diff --git a/aws/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java
similarity index 100%
rename from aws/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java
rename to aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ServiceIntegrationTest.java
diff --git a/aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java
similarity index 100%
rename from aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java
rename to aws-modules/aws-s3/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java
diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml
new file mode 100644
index 0000000000..3c5459d46c
--- /dev/null
+++ b/aws-modules/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+ aws-modules
+ aws-modules
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ aws-app-sync
+ aws-lambda
+ aws-miscellaneous
+ aws-reactive
+ aws-s3
+
+
+
\ No newline at end of file
diff --git a/aws/README.md b/aws/README.md
deleted file mode 100644
index 9006c2d190..0000000000
--- a/aws/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-## AWS
-
-This module contains articles about Amazon Web Services (AWS)
-
-### Relevant articles
-
-- [AWS Lambda Using DynamoDB With Java](https://www.baeldung.com/aws-lambda-dynamodb-java)
-- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java)
-- [A Basic AWS Lambda Example With Java](https://www.baeldung.com/java-aws-lambda)
-- [Managing EC2 Instances in Java](https://www.baeldung.com/ec2-java)
-- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload)
-- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests)
-- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3)
-- [Managing Amazon SQS Queues in Java](https://www.baeldung.com/aws-queues-java)
-- [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java)
diff --git a/aws/native-libs/libsqlite4java-linux-amd64-1.0.392.so b/aws/native-libs/libsqlite4java-linux-amd64-1.0.392.so
deleted file mode 100644
index 884615789b..0000000000
Binary files a/aws/native-libs/libsqlite4java-linux-amd64-1.0.392.so and /dev/null differ
diff --git a/aws/native-libs/libsqlite4java-linux-i386-1.0.392.so b/aws/native-libs/libsqlite4java-linux-i386-1.0.392.so
deleted file mode 100644
index 15e7469e38..0000000000
Binary files a/aws/native-libs/libsqlite4java-linux-i386-1.0.392.so and /dev/null differ
diff --git a/aws/native-libs/sqlite4java-win32-x64-1.0.392.dll b/aws/native-libs/sqlite4java-win32-x64-1.0.392.dll
deleted file mode 100644
index 70d258f29b..0000000000
Binary files a/aws/native-libs/sqlite4java-win32-x64-1.0.392.dll and /dev/null differ
diff --git a/aws/native-libs/sqlite4java-win32-x86-1.0.392.dll b/aws/native-libs/sqlite4java-win32-x86-1.0.392.dll
deleted file mode 100644
index c988e5a697..0000000000
Binary files a/aws/native-libs/sqlite4java-win32-x86-1.0.392.dll and /dev/null differ
diff --git a/core-java-modules/README.md b/core-java-modules/README.md
index fa77846b45..d07dff8751 100644
--- a/core-java-modules/README.md
+++ b/core-java-modules/README.md
@@ -4,6 +4,6 @@ This module contains modules about core Java
## Relevant articles:
-- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms)
- [Understanding the NumberFormatException in Java](https://www.baeldung.com/java-number-format-exception)
-- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch)
+
+
diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md
index 2b0eda8d91..ebd857886d 100644
--- a/core-java-modules/core-java-11-2/README.md
+++ b/core-java-modules/core-java-11-2/README.md
@@ -11,3 +11,5 @@ This module contains articles about Java 11 core features
- [Invoking a SOAP Web Service in Java](https://www.baeldung.com/java-soap-web-service)
- [Java HTTPS Client Certificate Authentication](https://www.baeldung.com/java-https-client-certificate-authentication)
- [Call Methods at Runtime Using Java Reflection](https://www.baeldung.com/java-method-reflection)
+- [Java HttpClient Basic Authentication](https://www.baeldung.com/java-httpclient-basic-auth)
+- [Java HttpClient With SSL](https://www.baeldung.com/java-httpclient-ssl)
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java
new file mode 100644
index 0000000000..3ade3bd553
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpclient/basicauthentication/HttpClientBasicAuthentication.java
@@ -0,0 +1,67 @@
+package com.baeldung.httpclient.basicauthentication;
+
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.util.Base64;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HttpClientBasicAuthentication {
+
+ private static final Logger logger = LoggerFactory.getLogger(HttpClientBasicAuthentication.class);
+
+ public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
+ useClientWithAuthenticator();
+ useClientWithHeaders();
+ }
+
+ private static void useClientWithAuthenticator() throws URISyntaxException, IOException, InterruptedException {
+ HttpClient client = HttpClient.newBuilder()
+ .authenticator(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication("postman", "password".toCharArray());
+ }
+ })
+ .build();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .GET()
+ .uri(new URI("https://postman-echo.com/basic-auth"))
+ .build();
+
+ HttpResponse response = client.send(request, BodyHandlers.ofString());
+
+ logger.info("Status using authenticator {}", response.statusCode());
+ }
+
+ private static void useClientWithHeaders() throws IOException, InterruptedException, URISyntaxException {
+ HttpClient client = HttpClient.newBuilder()
+ .build();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .GET()
+ .uri(new URI("https://postman-echo.com/basic-auth"))
+ .header("Authorization", getBasicAuthenticationHeader("postman", "password"))
+ .build();
+
+ HttpResponse response = client.send(request, BodyHandlers.ofString());
+
+ logger.info("Status using headers: {}", response.statusCode());
+ }
+
+ private static final String getBasicAuthenticationHeader(String username, String password) {
+ String valueToEncode = username + ":" + password;
+ return "Basic " + Base64.getEncoder()
+ .encodeToString(valueToEncode.getBytes());
+ }
+
+}
diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java
new file mode 100644
index 0000000000..29c1538c85
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLBypassUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.httpclient.ssl;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.Properties;
+
+public class HttpClientSSLBypassUnitTest {
+
+ @Test
+ public void whenHttpsRequest_thenCorrect() throws IOException, InterruptedException {
+ final Properties props = System.getProperties();
+ props.setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.TRUE.toString());
+
+ HttpClient httpClient = HttpClient.newBuilder()
+ .build();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create("https://www.testingmcafeesites.com/"))
+ .build();
+
+ HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+ props.setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.FALSE.toString());
+
+ Assertions.assertEquals(200, response.statusCode());
+ }
+}
diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java
new file mode 100644
index 0000000000..8eddd2d329
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/httpclient/ssl/HttpClientSSLUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.httpclient.ssl;
+
+import org.junit.Test;
+
+import javax.net.ssl.SSLHandshakeException;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+import static org.junit.Assert.assertEquals;
+
+public class HttpClientSSLUnitTest {
+
+ @Test
+ public void whenValidHttpsRequest_thenCorrect() throws URISyntaxException, IOException, InterruptedException {
+ HttpClient httpClient = HttpClient.newHttpClient();
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://www.google.com/"))
+ .build();
+
+ HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertEquals(200, response.statusCode());
+ }
+
+ @Test(expected = SSLHandshakeException.class)
+ public void whenInvalidHttpsRequest_thenInCorrect() throws IOException, InterruptedException {
+ HttpClient httpClient = HttpClient.newHttpClient();
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create("https://expired.badssl.com/"))
+ .build();
+
+ HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertEquals(200, response.statusCode());
+ }
+
+}
diff --git a/core-java-modules/core-java-9-jigsaw/README.md b/core-java-modules/core-java-9-jigsaw/README.md
index b1a401d48c..cfffb86588 100644
--- a/core-java-modules/core-java-9-jigsaw/README.md
+++ b/core-java-modules/core-java-9-jigsaw/README.md
@@ -7,5 +7,6 @@ This module contains articles about Project Jigsaw and the Java Platform Module
- [Introduction to Project Jigsaw](http://www.baeldung.com/project-jigsaw-java-modularity)
- [A Guide to Java 9 Modularity](https://www.baeldung.com/java-9-modularity)
- [Java 9 java.lang.Module API](https://www.baeldung.com/java-9-module-api)
+- [Java 9 Illegal Reflective Access Warning](https://www.baeldung.com/java-illegal-reflective-access)
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh
new file mode 100644
index 0000000000..959fa66ec4
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A01-compile-and-package-baeldung-agent.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+DIR=baeldung-agent
+
+# compile
+mkdir -p out/${DIR}
+javac -d out/${DIR} $(find ${DIR} -type f -name "*.java")
+
+# package
+mkdir -p mods
+jar --create --file=mods/${DIR}.jar --manifest=${DIR}/manifest.txt -C out/${DIR} .
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh
new file mode 100644
index 0000000000..fa922c54df
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A02-compile-and-package-baeldung-reflected.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+DIR=baeldung-reflected
+
+# compile
+mkdir -p out/${DIR}
+javac -d out/${DIR} $(find ${DIR} -type f -name "*.java")
+
+# package
+mkdir -p mods
+jar --create --file=mods/${DIR}.jar -C out/${DIR} .
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh
new file mode 100644
index 0000000000..af76ff5a2e
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A03-compile-and-package-baeldung-intermedium.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+DIR=baeldung-intermedium
+
+# compile
+mkdir -p out/${DIR}
+javac -d out/${DIR} $(find ${DIR} -type f -name "*.java")
+
+# package
+mkdir -p mods
+jar --create --file=mods/${DIR}.jar -C out/${DIR} .
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh
new file mode 100644
index 0000000000..f3f91c9f04
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A04-compile-and-package-baeldung-reflecting-named.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+DIR=baeldung-reflecting-named
+
+# compile
+mkdir -p out/${DIR}
+javac -d out/${DIR} --module-path mods $(find ${DIR} -type f -name "*.java")
+
+# package
+mkdir -p mods
+jar --create --file=mods/${DIR}.jar -C out/${DIR} .
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh
new file mode 100644
index 0000000000..deb0a8aaea
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/A05-compile-and-package-baeldung-reflecting-unnamed.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+DIR=baeldung-reflecting-unnamed
+
+# compile
+mkdir -p out/${DIR}
+javac -d out/${DIR} $(find ${DIR} -type f -name "*.java")
+
+# package
+mkdir -p mods
+jar --create --file=mods/${DIR}.jar -C out/${DIR} .
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh
new file mode 100644
index 0000000000..720ad69003
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B01-runtime-baeldung-reflecting-named-using-add-opens.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+java --module-path mods \
+ --add-opens baeldung.reflected/com.baeldung.reflected.internal=baeldung.reflecting.named \
+ --module baeldung.reflecting.named/com.baeldung.reflecting.named.Main
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh
new file mode 100644
index 0000000000..9b5f9cb094
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B02-runtime-baeldung-reflecting-named-using-forward-opens.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+java --module-path mods \
+ --add-opens baeldung.reflected/com.baeldung.reflected.internal=baeldung.intermedium \
+ --module baeldung.reflecting.named/com.baeldung.reflecting.named.MainWithForwardOpen
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh
new file mode 100644
index 0000000000..cf66dd778f
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B03-runtime-baeldung-reflecting-named-using-java-agent.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+java --module-path mods \
+ -javaagent:mods/baeldung-agent.jar=com.baeldung.reflected.internal.InternalNonPublicClass,com.baeldung.reflecting.named.Main \
+ --module baeldung.reflecting.named/com.baeldung.reflecting.named.Main
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh
new file mode 100644
index 0000000000..525b8dc58c
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B04-runtime-baeldung-reflecting-unnamed-with-warning.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+java -cp "mods/*" com.baeldung.reflecting.unnamed.Main
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh
new file mode 100644
index 0000000000..f7f5f16237
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B05-runtime-baeldung-reflecting-unnamed-using-add-opens.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+java -cp "mods/*" --add-opens java.base/java.lang=ALL-UNNAMED com.baeldung.reflecting.unnamed.Main
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh
new file mode 100644
index 0000000000..4b30ae1a5c
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/B06-runtime-baeldung-reflecting-unnamed-using-java-agent.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+java -cp "mods/*" -javaagent:mods/baeldung-agent.jar com.baeldung.reflecting.unnamed.Main
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh
new file mode 100644
index 0000000000..98707f810f
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/C01-clean.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+rm -rf out
+rm -rf mods
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java
new file mode 100644
index 0000000000..33d9a231ea
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/com/baeldung/agent/LoadTimeAgent.java
@@ -0,0 +1,69 @@
+package com.baeldung.agent;
+
+import java.lang.instrument.Instrumentation;
+import java.util.*;
+
+public class LoadTimeAgent {
+ public static void premain(String agentArgs, Instrumentation inst) {
+ System.out.println("agentArgs: " + agentArgs);
+
+ if (agentArgs != null) {
+ addExportsAndOpensByClassName(inst, agentArgs);
+ }
+ else {
+ addExportsAndOpensToUnnamedModule(inst);
+ }
+ }
+
+ private static void addExportsAndOpensByClassName(Instrumentation inst, String agentArgs) {
+ String[] array = agentArgs.split(",");
+ try {
+ String className1 = array[0];
+ String className2 = array[1];
+ Class> clazz1 = Class.forName(className1);
+ Class> clazz2 = Class.forName(className2);
+
+ Module srcModule = clazz1.getModule();
+ Module targetModule = clazz2.getModule();
+ redefineModule(inst, srcModule, targetModule);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static void addExportsAndOpensToUnnamedModule(Instrumentation inst) {
+ Module unnamedModule = ClassLoader.getSystemClassLoader().getUnnamedModule();
+ Set modules = ModuleLayer.boot().modules();
+
+ for (Module m : modules) {
+ redefineModule(inst, m, unnamedModule);
+ }
+ }
+
+ private static void redefineModule(Instrumentation inst, Module src, Module target) {
+ // prepare extra reads
+ Set extraReads = Collections.singleton(target);
+
+ // prepare extra exports
+ Set packages = src.getPackages();
+ Map> extraExports = new HashMap<>();
+ for (String pkg : packages) {
+ extraExports.put(pkg, extraReads);
+ }
+
+ // prepare extra opens
+ Map> extraOpens = new HashMap<>();
+ for (String pkg : packages) {
+ extraOpens.put(pkg, extraReads);
+ }
+
+ // prepare extra uses
+ Set> extraUses = Collections.emptySet();
+
+ // prepare extra provides
+ Map, List>> extraProvides = Collections.emptyMap();
+
+ // redefine module
+ inst.redefineModule(src, extraReads, extraExports, extraOpens, extraUses, extraProvides);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt
new file mode 100644
index 0000000000..3dc9de7ba5
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/manifest.txt
@@ -0,0 +1,3 @@
+Premain-Class: com.baeldung.agent.LoadTimeAgent
+Can-Redefine-Classes: true
+Can-Retransform-Classes: true
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java
new file mode 100644
index 0000000000..c976de2881
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-agent/module-info.java
@@ -0,0 +1,3 @@
+module baeldung.agent {
+ requires java.instrument;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java
new file mode 100644
index 0000000000..db031e2cfc
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/com/baeldung/intermedium/ForwardOpen.java
@@ -0,0 +1,15 @@
+package com.baeldung.intermedium;
+
+public class ForwardOpen {
+ public static void addOpens(Class> clazz1, Class> clazz2) {
+ Module currentModule = ForwardOpen.class.getModule();
+ Module srcModule = clazz1.getModule();
+ Module targetModule = clazz2.getModule();
+
+ System.out.println("current module: " + currentModule.getName());
+ System.out.println("source module: " + srcModule.getName());
+ System.out.println("target module: " + targetModule.getName());
+
+ srcModule.addOpens(clazz1.getPackageName(), targetModule);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java
new file mode 100644
index 0000000000..9ca6cbce43
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-intermedium/module-info.java
@@ -0,0 +1,3 @@
+module baeldung.intermedium {
+ exports com.baeldung.intermedium;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java
new file mode 100644
index 0000000000..c95e17ec1f
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedNonPublicClass.java
@@ -0,0 +1,11 @@
+package com.baeldung.reflected.exported;
+
+class ExportedNonPublicClass {
+ public static void testPublicStaticMethod() {
+ System.out.println("ExportedNonPublicClass.testPublicStaticMethod()");
+ }
+
+ private static void testPrivateStaticMethod() {
+ System.out.println("ExportedNonPublicClass.testPrivateStaticMethod()");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java
new file mode 100644
index 0000000000..3bbfca209c
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/exported/ExportedPublicClass.java
@@ -0,0 +1,11 @@
+package com.baeldung.reflected.exported;
+
+public class ExportedPublicClass {
+ public static void testPublicStaticMethod() {
+ System.out.println("ExportedPublicClass.testPublicStaticMethod()");
+ }
+
+ private static void testPrivateStaticMethod() {
+ System.out.println("ExportedPublicClass.testPrivateStaticMethod()");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java
new file mode 100644
index 0000000000..052ecbea9e
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalNonPublicClass.java
@@ -0,0 +1,11 @@
+package com.baeldung.reflected.internal;
+
+class InternalNonPublicClass {
+ public static void testPublicStaticMethod() {
+ System.out.println("InternalNonPublicClass.testPublicStaticMethod()");
+ }
+
+ private static void testPrivateStaticMethod() {
+ System.out.println("InternalNonPublicClass.testPrivateStaticMethod()");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java
new file mode 100644
index 0000000000..8f7a20698f
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/internal/InternalPublicClass.java
@@ -0,0 +1,11 @@
+package com.baeldung.reflected.internal;
+
+public class InternalPublicClass {
+ public static void testPublicStaticMethod() {
+ System.out.println("InternalPublicClass.testPublicStaticMethod()");
+ }
+
+ private static void testPrivateStaticMethod() {
+ System.out.println("InternalPublicClass.testPrivateStaticMethod()");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java
new file mode 100644
index 0000000000..99f9850cc1
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedNonPublicClass.java
@@ -0,0 +1,11 @@
+package com.baeldung.reflected.opened;
+
+class OpenedNonPublicClass {
+ public static void testPublicStaticMethod() {
+ System.out.println("OpenedNonPublicClass.testPublicStaticMethod()");
+ }
+
+ private static void testPrivateStaticMethod() {
+ System.out.println("OpenedNonPublicClass.testPrivateStaticMethod()");
+ }
+}
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java
new file mode 100644
index 0000000000..f9a56ca26b
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/com/baeldung/reflected/opened/OpenedPublicClass.java
@@ -0,0 +1,11 @@
+package com.baeldung.reflected.opened;
+
+public class OpenedPublicClass {
+ public static void testPublicStaticMethod() {
+ System.out.println("OpenedPublicClass.testPublicStaticMethod()");
+ }
+
+ private static void testPrivateStaticMethod() {
+ System.out.println("OpenedPublicClass.testPrivateStaticMethod()");
+ }
+}
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java
new file mode 100644
index 0000000000..e2164415cf
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflected/module-info.java
@@ -0,0 +1,4 @@
+module baeldung.reflected {
+ exports com.baeldung.reflected.exported;
+ opens com.baeldung.reflected.opened;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java
new file mode 100644
index 0000000000..c0fa4010ab
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/Main.java
@@ -0,0 +1,12 @@
+package com.baeldung.reflecting.named;
+
+import java.lang.reflect.Method;
+
+public class Main {
+ public static void main(String[] args) throws Exception {
+ Class> clazz = Class.forName("com.baeldung.reflected.internal.InternalNonPublicClass");
+ Method method = clazz.getDeclaredMethod("testPrivateStaticMethod");
+ method.setAccessible(true);
+ method.invoke(null);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java
new file mode 100644
index 0000000000..fad8a9ddce
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/com/baeldung/reflecting/named/MainWithForwardOpen.java
@@ -0,0 +1,18 @@
+package com.baeldung.reflecting.named;
+
+import com.baeldung.intermedium.ForwardOpen;
+
+import java.lang.reflect.Method;
+
+public class MainWithForwardOpen {
+ public static void main(String[] args) throws Exception {
+ Class> currentClass = Main.class;
+ Class> clazz = Class.forName("com.baeldung.reflected.internal.InternalNonPublicClass");
+
+ ForwardOpen.addOpens(clazz, currentClass);
+
+ Method method = clazz.getDeclaredMethod("testPrivateStaticMethod");
+ method.setAccessible(true);
+ method.invoke(null);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java
new file mode 100644
index 0000000000..936f53cd6e
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-named/module-info.java
@@ -0,0 +1,4 @@
+module baeldung.reflecting.named {
+ requires baeldung.intermedium;
+ requires baeldung.reflected;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java
new file mode 100644
index 0000000000..37bdc57eaf
--- /dev/null
+++ b/core-java-modules/core-java-9-jigsaw/src/modules/com.baeldung.reflective.access/baeldung-reflecting-unnamed/com/baeldung/reflecting/unnamed/Main.java
@@ -0,0 +1,13 @@
+package com.baeldung.reflecting.unnamed;
+
+import java.lang.reflect.Field;
+
+public class Main {
+ public static void main(String[] args) throws Exception {
+ Class> clazz = StringBuilder.class;
+ Field f = clazz.getDeclaredField("serialVersionUID");
+ f.setAccessible(true);
+ Object value = f.get(null);
+ System.out.println(value);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md
index 8203755417..0fe2b857a4 100644
--- a/core-java-modules/core-java-9/README.md
+++ b/core-java-modules/core-java-9/README.md
@@ -11,3 +11,4 @@ This module contains articles about Java 9 core features
- [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list)
- [Easy Ways to Write a Java InputStream to an OutputStream](https://www.baeldung.com/java-inputstream-to-outputstream)
- [Private Methods in Java Interfaces](https://www.baeldung.com/java-interface-private-methods)
+- [Java Scanner useDelimiter with Examples](https://www.baeldung.com/java-scanner-usedelimiter)
diff --git a/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java
new file mode 100644
index 0000000000..edc0b91d02
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/delimiters/DelimiterDemo.java
@@ -0,0 +1,36 @@
+package com.baeldung.java9.delimiters;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+import java.util.regex.Pattern;
+
+public class DelimiterDemo {
+
+ public static List scannerWithDelimiter(String input, String delimiter) {
+ try (Scanner scan = new Scanner(input)) {
+ scan.useDelimiter(delimiter);
+ List result = new ArrayList();
+ scan.forEachRemaining(result::add);
+ return result;
+ }
+ }
+
+ public static List scannerWithDelimiterUsingPattern(String input, Pattern delimiter) {
+ try (Scanner scan = new Scanner(input)) {
+ scan.useDelimiter(delimiter);
+ List result = new ArrayList();
+ scan.forEachRemaining(result::add);
+ return result;
+ }
+ }
+
+ public static List baseScanner(String input) {
+ try (Scanner scan = new Scanner(input)) {
+ List result = new ArrayList();
+ scan.forEachRemaining(result::add);
+ return result;
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java
new file mode 100644
index 0000000000..1c1fffe362
--- /dev/null
+++ b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/delimiters/DelimiterDemoUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.java9.delimiters;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.regex.Pattern;
+
+import org.junit.jupiter.api.Test;
+
+class DelimiterDemoUnitTest {
+
+ @Test
+ void givenSimpleCharacterDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiter, "Welcome to Baeldung", "\\s", Arrays.asList("Welcome", "to", "Baeldung"));
+ }
+
+ @Test
+ void givenStringDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiter, "HelloBaeldungHelloWorld", "Hello", Arrays.asList("Baeldung", "World"));
+ }
+
+ @Test
+ void givenVariousPossibleDelimiters_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiter, "Welcome to Baeldung.\nThank you for reading.\nThe team", "\n|\\s", Arrays.asList("Welcome", "to", "Baeldung.", "Thank", "you", "for", "reading.", "The", "team"));
+ }
+
+ @Test
+ void givenWildcardRegexDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiter, "1aaaaaaa2aa3aaa4", "a+", Arrays.asList("1", "2", "3", "4"));
+ }
+
+ @Test
+ void givenSimpleCharacterDelimiter_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "Welcome to Baeldung", Pattern.compile("\\s"), Arrays.asList("Welcome", "to", "Baeldung"));
+ }
+
+ @Test
+ void givenStringDelimiter_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "HelloBaeldungHelloWorld", Pattern.compile("Hello"), Arrays.asList("Baeldung", "World"));
+ }
+
+ @Test
+ void givenVariousPossibleDelimiters_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "Welcome to Baeldung.\nThank you for reading.\nThe team", Pattern.compile("\n|\\s"), Arrays.asList("Welcome", "to", "Baeldung.", "Thank", "you", "for", "reading.", "The", "team"));
+ }
+
+ @Test
+ void givenWildcardRegexDelimiters_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() {
+ checkOutput(DelimiterDemo::scannerWithDelimiterUsingPattern, "1aaaaaaa2aa3aaa4", Pattern.compile("a*"), Arrays.asList("1", "2", "3", "4"));
+ }
+
+ void checkOutput(BiFunction> function, String input, String delimiter, List expectedOutput) {
+ assertEquals(expectedOutput, function.apply(input, delimiter));
+ }
+
+ void checkOutput(BiFunction> function, String input, Pattern delimiter, List expectedOutput) {
+ assertEquals(expectedOutput, function.apply(input, delimiter));
+ }
+
+ @Test
+ void whenBaseScanner_ThenWhitespacesAreUsedAsDelimiters() {
+ assertEquals(List.of("Welcome", "at", "Baeldung"), DelimiterDemo.baseScanner("Welcome at Baeldung"));
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md
index e5f6126811..d482ed7773 100644
--- a/core-java-modules/core-java-collections-2/README.md
+++ b/core-java-modules/core-java-collections-2/README.md
@@ -12,3 +12,4 @@
- [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)
+- [Differences Between Iterator and Iterable and How to Use Them?](https://www.baeldung.com/java-iterator-vs-iterable)
diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java
new file mode 100644
index 0000000000..14f7b18014
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/CustomIterableClient.java
@@ -0,0 +1,17 @@
+package com.baeldung.collections.iterable;
+
+class CustomIterableClient {
+
+ public static void main(String[] args) {
+
+ ShoppingCart shoppingCart = new ShoppingCart<>();
+ shoppingCart.add(new Product("Tuna", 42));
+ shoppingCart.add(new Product("Eggplant", 65));
+ shoppingCart.add(new Product("Salad", 45));
+ shoppingCart.add(new Product("Banana", 29));
+
+ for (Product product : shoppingCart) {
+ System.out.println(product.getName());
+ }
+ }
+}
diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java
new file mode 100644
index 0000000000..9110d6a15f
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/IterableExample.java
@@ -0,0 +1,32 @@
+package com.baeldung.collections.iterable;
+
+import java.util.Iterator;
+import java.util.List;
+
+public class IterableExample {
+
+ public void iterateUsingIterator(List numbers) {
+ Iterator iterator = numbers.iterator();
+ while (iterator.hasNext()) {
+ System.out.println(iterator.next());
+ }
+ }
+
+ public void iterateUsingEnhancedForLoop(List numbers) {
+ for (Integer number : numbers) {
+ System.out.println(number);
+ }
+ }
+
+ public void iterateUsingForEachLoop(List numbers) {
+ numbers.forEach(System.out::println);
+ }
+
+ public void removeElementsUsingIterator(List numbers) {
+ Iterator iterator = numbers.iterator();
+ while (iterator.hasNext()) {
+ iterator.next();
+ iterator.remove();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java
new file mode 100644
index 0000000000..b29088f6f0
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/Product.java
@@ -0,0 +1,28 @@
+package com.baeldung.collections.iterable;
+
+class Product {
+
+ private String name;
+ private double price;
+
+ public Product(String code, double price) {
+ this.name = code;
+ this.price = price;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+}
diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java
new file mode 100644
index 0000000000..f1b481da08
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterable/ShoppingCart.java
@@ -0,0 +1,72 @@
+package com.baeldung.collections.iterable;
+
+import java.util.Arrays;
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public class ShoppingCart implements Iterable {
+
+ private E[] elementData;
+ private int size;
+
+ public ShoppingCart() {
+ this.elementData = (E[]) new Object[]{};
+ }
+
+ public void add(E element) {
+ ensureCapacity(size + 1);
+ elementData[size++] = element;
+ }
+
+ private void ensureCapacity(int minCapacity) {
+ int oldCapacity = elementData.length;
+ int newCapacity = oldCapacity + (oldCapacity >> 1);
+ if (newCapacity - minCapacity < 0) {
+ newCapacity = minCapacity;
+ }
+ elementData = Arrays.copyOf(elementData, newCapacity);
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new ShoppingCartIterator();
+ }
+
+ public class ShoppingCartIterator implements Iterator {
+ int cursor;
+ int lastReturned = -1;
+
+ public boolean hasNext() {
+ return cursor != size;
+ }
+
+ public E next() {
+ return getNextElement();
+ }
+
+ private E getNextElement() {
+ int current = cursor;
+ exist(current);
+
+ E[] elements = ShoppingCart.this.elementData;
+ validate(elements, current);
+
+ cursor = current + 1;
+ lastReturned = current;
+ return elements[lastReturned];
+ }
+
+ private void exist(int current) {
+ if (current >= size) {
+ throw new NoSuchElementException();
+ }
+ }
+
+ private void validate(E[] elements, int current) {
+ if (current >= elements.length) {
+ throw new ConcurrentModificationException();
+ }
+ }
+ }
+}
diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java
new file mode 100644
index 0000000000..30c8f57c0b
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/CustomIteratorClient.java
@@ -0,0 +1,14 @@
+package com.baeldung.collections.iterator;
+
+import java.util.Iterator;
+
+class CustomIteratorClient {
+
+ public static void main(String[] args) {
+ Iterator iterator = Numbers.iterator();
+
+ while (iterator.hasNext()) {
+ System.out.println(iterator.next());
+ }
+ }
+}
diff --git a/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java
new file mode 100644
index 0000000000..23b3344c08
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterator/Numbers.java
@@ -0,0 +1,60 @@
+package com.baeldung.collections.iterator;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+class Numbers {
+
+ private static final List NUMBER_LIST = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+
+ private Numbers() {
+ }
+
+ public static Iterator iterator() {
+ return new PrimeIterator();
+ }
+
+ private static class PrimeIterator implements Iterator {
+
+ private int cursor;
+
+ @Override
+ public Integer next() {
+ exist(cursor);
+ return NUMBER_LIST.get(cursor++);
+ }
+
+ private void exist(int current) {
+ if (current >= NUMBER_LIST.size()) {
+ throw new NoSuchElementException();
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (cursor > NUMBER_LIST.size()) {
+ return false;
+ }
+
+ for (int i = cursor; i < NUMBER_LIST.size(); i++) {
+ if (isPrime(NUMBER_LIST.get(i))) {
+ cursor = i;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isPrime(int number) {
+ for (int i = 2; i <= number / 2; ++i) {
+ if (number % i == 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+}
diff --git a/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java
new file mode 100644
index 0000000000..745dcf52b7
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterable/IterableUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.collections.iterable;
+
+import com.baeldung.collections.iterable.IterableExample;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class IterableUnitTest {
+
+ private static List getNumbers() {
+ List numbers = new ArrayList<>();
+ numbers.add(10);
+ numbers.add(20);
+ numbers.add(30);
+ numbers.add(40);
+ return numbers;
+ }
+
+ @Test
+ void givenNumbers_whenUsingIterator_thenCorrectSize() {
+ List numbers = getNumbers();
+ IterableExample iterableExample = new IterableExample();
+ iterableExample.iterateUsingIterator(numbers);
+ assertEquals(4, numbers.size());
+ }
+
+ @Test
+ void givenNumbers_whenRemoveElements_thenEmptyList() {
+ List numbers = getNumbers();
+ IterableExample iterableExample = new IterableExample();
+ iterableExample.removeElementsUsingIterator(numbers);
+ assertEquals(0, numbers.size());
+ }
+
+ @Test
+ void givenNumbers_whenIterateUsingEnhancedForLoop_thenCorrectSize() {
+ List numbers = getNumbers();
+ IterableExample iterableExample = new IterableExample();
+ iterableExample.iterateUsingEnhancedForLoop(numbers);
+ assertEquals(4, numbers.size());
+ }
+
+ @Test
+ void givenNumbers_whenIterateUsingForEachLoop_thenCorrectSize() {
+ List numbers = getNumbers();
+ IterableExample iterableExample = new IterableExample();
+ iterableExample.iterateUsingForEachLoop(numbers);
+ assertEquals(4, numbers.size());
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml
index 2193b5118a..8060e4f606 100644
--- a/core-java-modules/core-java-collections-4/pom.xml
+++ b/core-java-modules/core-java-collections-4/pom.xml
@@ -14,4 +14,15 @@
0.0.1-SNAPSHOT
+
+
+ commons-lang
+ commons-lang
+ ${commons-lang.version}
+
+
+
+
+ 2.2
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java
new file mode 100644
index 0000000000..a9e7bc8a38
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java
@@ -0,0 +1,51 @@
+package com.baeldung.collections.sorting;
+
+import java.util.Date;
+
+public class Employee implements Comparable{
+
+ private String name;
+ private Date joiningDate;
+
+ public Employee(String name, Date joiningDate) {
+ this.name = name;
+ this.joiningDate = joiningDate;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Date getJoiningDate() {
+ return joiningDate;
+ }
+
+ public void setJoiningDate(Date joiningDate) {
+ this.joiningDate = joiningDate;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return ((Employee) obj).getName()
+ .equals(getName());
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuffer().append("(")
+ .append(getName())
+ .append(",")
+ .append(getJoiningDate())
+ .append(")")
+ .toString();
+ }
+
+ @Override
+ public int compareTo(Employee employee) {
+ return getJoiningDate().compareTo(employee.getJoiningDate());
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java
new file mode 100644
index 0000000000..250fb7b62b
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java
@@ -0,0 +1,145 @@
+package com.baeldung.collections.sorting;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import org.apache.commons.lang.time.DateUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EmployeeSortingByDateUnitTest {
+
+ private List employees = new ArrayList<>();
+ private List employeesSortedByDateAsc = new ArrayList<>();
+ private List employeesSortedByDateDesc = new ArrayList<>();
+
+ @Before
+ public void initVariables() {
+
+ Collections.addAll(employees,
+ new Employee("Earl", DateUtils.addMonths(new Date(), -2)),
+ new Employee("Frank", DateUtils.addDays(new Date(), -20)),
+ new Employee("Steve", DateUtils.addDays(new Date(), -10)),
+ new Employee("Jessica", DateUtils.addMonths(new Date(), -6)),
+ new Employee("Pearl", DateUtils.addYears(new Date(), -1)),
+ new Employee("John", new Date())
+ );
+
+ Collections.addAll(employeesSortedByDateDesc,
+ new Employee("John", new Date()),
+ new Employee("Steve", DateUtils.addDays(new Date(), -10)),
+ new Employee("Frank", DateUtils.addDays(new Date(), -20)),
+ new Employee("Earl", DateUtils.addMonths(new Date(), -2)),
+ new Employee("Jessica", DateUtils.addMonths(new Date(), -6)),
+ new Employee("Pearl", DateUtils.addYears(new Date(), -1))
+ );
+
+ Collections.addAll(employeesSortedByDateAsc,
+ new Employee("Pearl", DateUtils.addYears(new Date(), -1)),
+ new Employee("Jessica", DateUtils.addMonths(new Date(), -6)),
+ new Employee("Earl", DateUtils.addMonths(new Date(), -2)),
+ new Employee("Frank", DateUtils.addDays(new Date(), -20)),
+ new Employee("Steve", DateUtils.addDays(new Date(), -10)),
+ new Employee("John", new Date())
+ );
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenSortedListinNaturalOrder() {
+ Collections.sort(employees);
+ System.out.println(employees);
+
+ assertEquals(employees, employeesSortedByDateAsc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedList() {
+
+ Collections.sort(employees, new Comparator() {
+ public int compare(Employee o1, Employee o2) {
+ return o1.getJoiningDate().compareTo(o2.getJoiningDate());
+ }
+ });
+
+ assertEquals(employees, employeesSortedByDateAsc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedListV1() {
+
+ Collections.sort(employees, new Comparator() {
+ public int compare(Employee emp1, Employee emp2) {
+ if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null)
+ return 0;
+ return emp1.getJoiningDate().compareTo(emp2.getJoiningDate());
+ }
+ });
+
+ assertEquals(employees, employeesSortedByDateAsc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenSortedListinDescOrder() {
+ Collections.sort(employees, Collections.reverseOrder());
+
+ assertEquals(employees, employeesSortedByDateDesc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedListAsc() {
+
+ Collections.sort(employees, new Comparator() {
+ public int compare(Employee emp1, Employee emp2) {
+ return emp2.getJoiningDate().compareTo(emp1.getJoiningDate());
+ }
+ });
+
+ assertEquals(employees, employeesSortedByDateDesc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedListDescV1() {
+
+ Collections.sort(employees, new Comparator() {
+ public int compare(Employee emp1, Employee emp2) {
+ return emp2.getJoiningDate().compareTo(emp1.getJoiningDate());
+ }
+ });
+
+ assertEquals(employees, employeesSortedByDateDesc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedListDescLambda() {
+
+ Collections.sort(employees,
+ (emp1, emp2) -> emp2.getJoiningDate().compareTo(emp1.getJoiningDate()));
+
+ assertEquals(employees, employeesSortedByDateDesc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedListDescLambdaV1() {
+
+ Collections.sort(employees, (emp1, emp2) -> {
+ if (emp1.getJoiningDate() == null || emp2.getJoiningDate() == null)
+ return 0;
+ return emp2.getJoiningDate().compareTo(emp1.getJoiningDate());
+ });
+
+ assertEquals(employees, employeesSortedByDateDesc);
+ }
+
+ @Test
+ public void givenEmpList_SortEmpList_thenCheckSortedListAscLambda() {
+ Collections.sort(employees,
+ Comparator.comparing(Employee::getJoiningDate));
+ assertEquals(employees, employeesSortedByDateAsc);
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md
index 967e148a99..6d0a3c7037 100644
--- a/core-java-modules/core-java-collections-list-3/README.md
+++ b/core-java-modules/core-java-collections-list-3/README.md
@@ -11,4 +11,7 @@ This module contains articles about the Java List collection
- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list)
- [How to Count Duplicate Elements in Arraylist](https://www.baeldung.com/java-count-duplicate-elements-arraylist)
- [Finding the Differences Between Two Lists in Java](https://www.baeldung.com/java-lists-difference)
+- [List vs. ArrayList in Java](https://www.baeldung.com/java-list-vs-arraylist)
+- [How to Store HashMap Inside a List](https://www.baeldung.com/java-hashmap-inside-list)
+- [Working With a List of Lists in Java](https://www.baeldung.com/java-list-of-lists)
- [[<-- Prev]](/core-java-modules/core-java-collections-list-2)
diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java
new file mode 100644
index 0000000000..f425f19189
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ArrayListDemo.java
@@ -0,0 +1,51 @@
+package com.baeldung.list.listvsarraylist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class ArrayListDemo {
+
+ private ArrayList passengers = new ArrayList<>(20);
+// private LinkedList passengers = new LinkedList<>(); // compile time error
+
+ public ArrayList addPassenger(Passenger passenger) {
+ passengers.add(passenger);
+ return passengers;
+ }
+
+ public ArrayList removePassenger(Passenger passenger) {
+ passengers.remove(passenger);
+ return passengers;
+ }
+
+ public ArrayList getPassengersBySource(String source) {
+ return new ArrayList(passengers.stream()
+ .filter(it -> it.getSource().equals(source))
+ .collect(Collectors.toList()));
+ }
+
+ public ArrayList getPassengersByDestination(String destination) {
+ return new ArrayList (passengers.stream()
+ .filter(it -> it.getDestination().equals(destination))
+ .collect(Collectors.toList()));
+ }
+
+ public long getKidsCount(ArrayList passengerList) {
+ return passengerList.stream()
+ .filter(it -> (it.getAge() <= 10))
+ .count();
+ }
+
+ public ArrayList getFinalPassengersList() {
+ return new ArrayList (Collections.unmodifiableList(passengers));
+ }
+
+ public ArrayList getServicedCountries() {
+ return new ArrayList (Stream.of(Locale.getISOCountries())
+ .collect(Collectors.toList()));
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java
new file mode 100644
index 0000000000..a9a182d21e
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/ListDemo.java
@@ -0,0 +1,53 @@
+package com.baeldung.list.listvsarraylist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class ListDemo {
+
+ private List passengers = new ArrayList<>(20);
+// private List passengers = new LinkedList<>(); // No compile time error
+
+ public List addPassenger(Passenger passenger) {
+ passengers.add(passenger);
+ return passengers;
+ }
+
+ public List removePassenger(Passenger passenger) {
+ passengers.remove(passenger);
+ return passengers;
+ }
+
+ public List getPassengersBySource(String source) {
+ return passengers.stream()
+ .filter(it -> it.getSource().equals(source))
+ .collect(Collectors.toList());
+ }
+
+ public List getPassengersByDestination(String destination) {
+ return passengers.stream()
+ .filter(it -> it.getDestination().equals(destination))
+ .collect(Collectors.toList());
+ }
+
+ public long getKidsCount(List passengerList) {
+ return passengerList.stream()
+ .filter(it -> (it.getAge() <= 10))
+ .count();
+ }
+
+ public List getFinalPassengersList() {
+ return Collections.unmodifiableList(passengers);
+ }
+
+ public List getServicedCountries() {
+ return Stream.of(Locale.getISOCountries())
+ .collect(Collectors.toList());
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java
new file mode 100644
index 0000000000..9c61b70aa6
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/listvsarraylist/Passenger.java
@@ -0,0 +1,49 @@
+package com.baeldung.list.listvsarraylist;
+
+public class Passenger {
+
+ private String name;
+ private int age;
+ private String source;
+ private String destination;
+
+ public Passenger(String name, int age, String source, String destination) {
+ this.name = name;
+ this.age = age;
+ this.source = source;
+ this.destination = destination;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public String getDestination() {
+ return destination;
+ }
+
+ public void setDestination(String destination) {
+ this.destination = destination;
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java
new file mode 100644
index 0000000000..59094ab562
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ArrayListDemoUnitTest.java
@@ -0,0 +1,91 @@
+package com.baeldung.list.listvsarraylist;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class ArrayListDemoUnitTest {
+
+ ArrayListDemo application = new ArrayListDemo();
+
+ Passenger passenger1;
+ Passenger passenger2;
+ Passenger passenger3;
+
+ @BeforeEach
+ protected void setUp() {
+ passenger1 = new Passenger("Anna", 25, "London", "New York");
+ passenger2 = new Passenger("Binny", 35, "New York", "London");
+ passenger3 = new Passenger("Chandra", 8, "Paris", "New Delhi");
+ application.addPassenger(passenger1);
+ application.addPassenger(passenger2);
+ application.addPassenger(passenger3);
+ }
+
+ @Test
+ public void givenEmptyList_whenAddedPassenger_thenReturnCurrentPassengerList() {
+ ArrayList list = application.addPassenger(new Passenger("David", 54, "Milan", "Paris"));
+
+ assertNotNull(list);
+ assertThat(list).hasSize(4);
+ }
+
+ @Test
+ public void givenPassengerList_whenRemovedPassenger_thenReturnCurrentPassengerList() {
+ ArrayList list = application.removePassenger(passenger3);
+
+ assertNotNull(list);
+ assertThat(list).hasSize(2);
+ }
+
+ @Test
+ public void givenPassengerList_whenPassedWithSourceCity_thenReturnMatchingPassengerList() {
+ ArrayList list = application.getPassengersBySource("Singapore");
+ ArrayList list2 = application.getPassengersBySource("London");
+
+ assertThat(list).isEmpty();
+ assertThat(list2.get(0)).isEqualTo(passenger1);
+ }
+
+ @Test
+ public void givenPassengerList_whenPassedWithDestinationCity_thenReturnMatchingPassengerList() {
+ ArrayList list = application.getPassengersByDestination("Singapore");
+ ArrayList list2 = application.getPassengersByDestination("London");
+
+ assertThat(list).isEmpty();
+ assertThat(list2.get(0)).isEqualTo(passenger2);
+ }
+
+ @Test
+ public void givenPassengerList_whenFindKidsByAge_thenReturnKidsList() {
+ ArrayList list = new ArrayList<>();
+ list.add(passenger1);
+ list.add(passenger2);
+ list.add(passenger3);
+ long count = application.getKidsCount(list);
+
+ assertThat(count).isEqualTo(1);
+ }
+
+ @Test
+ public void givenPassengerList_whenCalledWithCollectionsFunction_thenReturnsListType() {
+ ArrayList list = application.getFinalPassengersList();
+
+ assertNotNull(list);
+ assertThat(list).hasSize(3);
+ }
+
+ @Test
+ public void givenCurrentLocale_whenUsingStreams_thenReturnsListType() {
+ ArrayList servicedCountries = application.getServicedCountries();
+
+ assertNotNull(servicedCountries);
+ assertThat(servicedCountries).hasSize(Locale.getISOCountries().length);
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java
new file mode 100644
index 0000000000..cf239a79ce
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listvsarraylist/ListDemoUnitTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.list.listvsarraylist;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class ListDemoUnitTest {
+
+ ListDemo application = new ListDemo();
+
+ Passenger passenger1;
+ Passenger passenger2;
+ Passenger passenger3;
+
+ @BeforeEach
+ protected void setUp() {
+ passenger1 = new Passenger("Anna", 25, "London", "New York");
+ passenger2 = new Passenger("Binny", 35, "New York", "London");
+ passenger3 = new Passenger("Chandra", 8, "Paris", "New Delhi");
+ application.addPassenger(passenger1);
+ application.addPassenger(passenger2);
+ application.addPassenger(passenger3);
+ }
+
+ @Test
+ public void givenEmptyList_whenAddedPassenger_thenReturnCurrentPassengerList() {
+ List list = application.addPassenger(new Passenger("David", 54, "Milan", "Paris"));
+
+ assertNotNull(list);
+ assertThat(list).hasSize(4);
+ }
+
+ @Test
+ public void givenPresentList_whenRemovedPassenger_thenReturnCurrentPassengerList() {
+ List list = application.removePassenger(passenger3);
+
+ assertNotNull(list);
+ assertThat(list).hasSize(2);
+ }
+
+ @Test
+ public void givenPresentList_whenPassedWithSourceCity_thenReturnMatchingPassengerList() {
+ List list = application.getPassengersBySource("Singapore");
+ List list2 = application.getPassengersBySource("London");
+
+ assertThat(list).isEmpty();
+ assertThat(list2.get(0)).isEqualTo(passenger1);
+ }
+
+ @Test
+ public void givenPresentList_whenPassedWithDestinationCity_thenReturnMatchingPassengerList() {
+ List list = application.getPassengersByDestination("Singapore");
+ List list2 = application.getPassengersByDestination("London");
+
+ assertThat(list).isEmpty();
+ assertThat(list2.get(0)).isEqualTo(passenger2);
+ }
+
+ @Test
+ public void givenPassengerList_whenFindKidsByAge_thenReturnKidsList() {
+ List list = new ArrayList<>();
+ list.add(passenger1);
+ list.add(passenger2);
+ list.add(passenger3);
+ long count = application.getKidsCount(list);
+
+ assertThat(count).isEqualTo(1);
+ }
+
+ @Test
+ public void givenPresentList_whenCalledWithCollectionsFunction_thenReturnsListType() {
+ List list = application.getFinalPassengersList();
+
+ assertNotNull(list);
+ assertThat(list).hasSize(3);
+ }
+
+ @Test
+ public void givenCurrentLocale_whenUsingStreams_thenReturnsListType() {
+ List servicedCountries = application.getServicedCountries();
+
+ assertNotNull(servicedCountries);
+ assertThat(servicedCountries).hasSize(Locale.getISOCountries().length);
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-4/README.md b/core-java-modules/core-java-collections-list-4/README.md
new file mode 100644
index 0000000000..3a90b3d813
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-4/README.md
@@ -0,0 +1,7 @@
+## Core Java Collections List (Part 4)
+
+This module contains articles about the Java List collection
+
+### Relevant Articles:
+- [Working With a List of Lists in Java](https://www.baeldung.com/java-list-of-lists)
+- [[<-- Prev]](/core-java-modules/core-java-collections-list-3)
diff --git a/core-java-modules/core-java-collections-list-4/pom.xml b/core-java-modules/core-java-collections-list-4/pom.xml
new file mode 100644
index 0000000000..8c1d3a881e
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-4/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+ core-java-collections-list-4
+ 0.1.0-SNAPSHOT
+ core-java-collections-list-4
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ net.sf.trove4j
+ trove4j
+ ${trove4j.version}
+
+
+ it.unimi.dsi
+ fastutil
+ ${fastutil.version}
+
+
+ colt
+ colt
+ ${colt.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+
+
+ 3.0.2
+ 8.1.0
+ 1.2.0
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java
new file mode 100644
index 0000000000..321fa475f6
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.list.listoflists;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.api.Test;
+
+public class ListOfListsUnitTest {
+
+ private List> getListOfListsFromCsv() throws URISyntaxException, IOException {
+
+ List lines = Files.readAllLines(Paths.get(getClass().getResource("/listoflists/example.csv")
+ .toURI()));
+ List> listOfLists = new ArrayList<>();
+
+ lines.forEach(line -> {
+ List innerList = new ArrayList<>(Arrays.asList(line.split(", ")));
+ listOfLists.add(innerList);
+ });
+ return listOfLists;
+ }
+
+ private void printListOfLists(List> listOfLists) {
+ System.out.println("\n List of Lists ");
+ System.out.println("-------------------------------------");
+ listOfLists.forEach(innerList -> {
+ String line = String.join(", ", innerList);
+ System.out.println(line);
+ });
+ }
+
+ @Test
+ void givenCsv_whenInitListOfLists_thenGetExpectedResults() throws URISyntaxException, IOException {
+ List> listOfLists = getListOfListsFromCsv();
+ assertThat(listOfLists).hasSize(3);
+ assertThat(listOfLists.stream()
+ .map(List::size)
+ .collect(Collectors.toSet())).hasSize(1)
+ .containsExactly(4);
+ printListOfLists(listOfLists);
+ }
+
+ @Test
+ void givenListOfLists_whenRemoveElementFromInnerLists_thenGetExpectedResults() throws URISyntaxException, IOException {
+ List> listOfLists = getListOfListsFromCsv();
+
+ listOfLists.forEach(innerList -> innerList.remove("Delete Me"));
+ assertThat(listOfLists.stream()
+ .map(List::size)
+ .collect(Collectors.toSet())).hasSize(1)
+ .containsExactly(3);
+
+ printListOfLists(listOfLists);
+ }
+
+ @Test
+ void givenListOfLists_whenAddNewInnerList_thenGetExpectedResults() throws URISyntaxException, IOException {
+ List> listOfLists = getListOfListsFromCsv();
+ List newList = new ArrayList<>(Arrays.asList("Slack", "Zoom", "Microsoft Teams", "Telegram"));
+ listOfLists.add(2, newList);
+
+ assertThat(listOfLists).hasSize(4);
+ assertThat(listOfLists.get(2)).containsExactly("Slack", "Zoom", "Microsoft Teams", "Telegram");
+ printListOfLists(listOfLists);
+ }
+}
diff --git a/core-java-modules/core-java-collections-list-4/src/test/resources/listoflists/example.csv b/core-java-modules/core-java-collections-list-4/src/test/resources/listoflists/example.csv
new file mode 100644
index 0000000000..e275848e19
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-4/src/test/resources/listoflists/example.csv
@@ -0,0 +1,3 @@
+Linux, Microsoft Windows, Mac OS, Delete Me
+Kotlin, Delete Me, Java, Python
+Delete Me, Mercurial, Git, Subversion
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java
new file mode 100644
index 0000000000..39110aedd3
--- /dev/null
+++ b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/listOfHashMaps/ListOfHashMapsUnitTest.java
@@ -0,0 +1,36 @@
+package test.java.com.baeldung.list.listOfHashMaps;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertTrue;
+
+public class ListOfHashMapsUnitTest {
+ List>> booksAuthorsMapsList = new ArrayList<>();
+
+ @Test
+ public void givenMaps_whenAddToList_thenListContainsMaps() {
+ HashMap> javaBooksAuthorsMap = new HashMap<>();
+ HashMap> phpBooksAuthorsMap = new HashMap<>();
+ javaBooksAuthorsMap.put("Head First Java", Arrays.asList("Kathy Sierra", "Bert Bates"));
+ javaBooksAuthorsMap.put("Effective Java", Arrays.asList("Joshua Bloch"));
+ javaBooksAuthorsMap.put("OCA Java SE 8",
+ Arrays.asList("Kathy Sierra", "Bert Bates", "Elisabeth Robson"));
+ phpBooksAuthorsMap.put("The Joy of PHP", Arrays.asList("Alan Forbes"));
+ phpBooksAuthorsMap.put("Head First PHP & MySQL",
+ Arrays.asList("Lynn Beighley", "Michael Morrison"));
+
+ booksAuthorsMapsList.add(javaBooksAuthorsMap);
+ booksAuthorsMapsList.add(phpBooksAuthorsMap);
+
+ assertTrue(booksAuthorsMapsList.get(0).keySet().containsAll
+ (javaBooksAuthorsMap.keySet().stream().collect(Collectors.toList())));
+ assertTrue(booksAuthorsMapsList.get(1).keySet().containsAll
+ (phpBooksAuthorsMap.keySet().stream().collect(Collectors.toList())));
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-4/README.md b/core-java-modules/core-java-concurrency-advanced-4/README.md
index 808db89b12..d9207644b3 100644
--- a/core-java-modules/core-java-concurrency-advanced-4/README.md
+++ b/core-java-modules/core-java-concurrency-advanced-4/README.md
@@ -6,3 +6,4 @@
- [Volatile Variables and Thread Safety](https://www.baeldung.com/java-volatile-variables-thread-safety)
- [Producer-Consumer Problem With Example in Java](https://www.baeldung.com/java-producer-consumer-problem)
- [Acquire a Lock by a Key in Java](https://www.baeldung.com/java-acquire-lock-by-key)
+- [Differences Between set() and lazySet() in Java Atomic Variables](https://www.baeldung.com/java-atomic-set-vs-lazyset)
diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java
new file mode 100644
index 0000000000..37424147a7
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/setvslazyset/Application.java
@@ -0,0 +1,35 @@
+package com.baeldung.setvslazyset;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Application {
+
+ AtomicInteger atomic = new AtomicInteger(0);
+
+ public static void main(String[] args) {
+ Application app = new Application();
+ new Thread(() -> {
+ for (int i = 0; i < 10; i++) {
+ //app.atomic.set(i);
+ app.atomic.lazySet(i);
+ System.out.println("Set: " + i);
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ }).start();
+
+ new Thread(() -> {
+ for (int i = 0; i < 10; i++) {
+ synchronized (app.atomic) {
+ int counter = app.atomic.get();
+ System.out.println("Get: " + counter);
+ }
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ }).start();
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java
new file mode 100644
index 0000000000..9ac20d73dd
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/FixedTimeTask.java
@@ -0,0 +1,28 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.TimeUnit;
+
+public class FixedTimeTask implements Runnable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(FixedTimeTask.class);
+
+ final int fixedTime; // milliseconds
+
+ public FixedTimeTask(int fixedTime) {
+ this.fixedTime = fixedTime;
+ }
+
+ @Override
+ public void run() {
+ LOG.info(fixedTime + " milliseconds running task");
+ try {
+ TimeUnit.MILLISECONDS.sleep(fixedTime);
+ } catch (InterruptedException e) {
+ LOG.info("interrupted");
+ }
+ LOG.info("finished");
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java
new file mode 100644
index 0000000000..7167859308
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/LongRunningTask.java
@@ -0,0 +1,21 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LongRunningTask implements Runnable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LongRunningTask.class);
+
+ @Override
+ public void run() {
+ LOG.info("running");
+ for (int i = 0; i < Long.MAX_VALUE; i++) {
+ if (Thread.interrupted()) {
+ LOG.info("stopping");
+ return;
+ }
+ }
+ LOG.info("finished");
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java
new file mode 100644
index 0000000000..d6d8c8c036
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/Step.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.stopexecution;
+
+import java.util.Random;
+
+public class Step {
+
+ private static int MAX = Integer.MAX_VALUE / 2;
+ int number;
+
+ public Step(int number) {
+ this.number = number;
+ }
+
+ public void perform() throws InterruptedException {
+ Random rnd = new Random();
+ int target = rnd.nextInt(MAX);
+ while (rnd.nextInt(MAX) != target) {
+ if (Thread.interrupted()) {
+ throw new InterruptedException();
+ }
+ }
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java
new file mode 100644
index 0000000000..5b2b0c445a
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/SteppedTask.java
@@ -0,0 +1,31 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class SteppedTask implements Runnable {
+ private static final Logger LOG = LoggerFactory.getLogger(SteppedTask.class);
+
+ private List steps;
+
+ public SteppedTask(List steps) {
+ this.steps = steps;
+ }
+
+ @Override
+ public void run() {
+ LOG.info("running stepped process");
+ for (Step step : steps) {
+ LOG.info("running step " + step.number);
+ try {
+ step.perform();
+ } catch (InterruptedException e) {
+ LOG.info("interrupting task");
+ return;
+ }
+ }
+ LOG.info("stepped process finished");
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java
new file mode 100644
index 0000000000..ac4af8adc4
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/StoppingExecution.java
@@ -0,0 +1,95 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Timer;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class StoppingExecution {
+
+ private static final Logger LOG = LoggerFactory.getLogger(StoppingExecution.class);
+
+ public static void main(String[] args) {
+ StoppingExecution.testUsingLoop();
+ StoppingExecution.testUsingTimer();
+ StoppingExecution.testUsingFuture();
+ StoppingExecution.testScheduledExecutor();
+ StoppingExecution.testSteppedProcess();
+ }
+
+ public static void testUsingLoop() {
+ LOG.info("using loop started");
+ long start = System.currentTimeMillis();
+ long end = start + 30 * 1000; // 30 seconds
+ while (System.currentTimeMillis() < end) {
+ LOG.info("running task");
+ new FixedTimeTask(7 * 1000).run(); // 7 seconds
+ }
+ LOG.info("using loop ended");
+ }
+
+ public static void testUsingTimer() {
+ LOG.info("using timer started");
+ Thread thread = new Thread(new LongRunningTask());
+ thread.start();
+
+ Timer timer = new Timer();
+ TimeOutTask timeOutTask = new TimeOutTask(thread, timer);
+
+ LOG.info("scheduling timeout in 3 seconds");
+ timer.schedule(timeOutTask, 3000);
+ LOG.info("using timer ended");
+ }
+
+ public static void testUsingFuture() {
+ LOG.info("using future started");
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Future future = executor.submit(new LongRunningTask());
+ try {
+ LOG.info("future get with 7 seconds timeout");
+ future.get(7, TimeUnit.SECONDS);
+ } catch (TimeoutException e) {
+ LOG.info("future timeout");
+ future.cancel(true);
+ } catch (Exception e) {
+ LOG.info("future exception", e);
+ } finally {
+ executor.shutdownNow();
+ }
+ LOG.info("using future ended");
+ }
+
+ public static void testScheduledExecutor() {
+ LOG.info("using future schedule executor started");
+
+ ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
+ Future future = executor.submit(new LongRunningTask());
+ Runnable cancelTask = () -> future.cancel(true);
+
+ LOG.info("cancel task in 3 seconds");
+ executor.schedule(cancelTask, 3000, TimeUnit.MILLISECONDS);
+ executor.shutdown();
+ LOG.info("using future schedule executor ended");
+ }
+
+ public static void testSteppedProcess() {
+ List steps = Stream.of(new Step(1), new Step(2), new Step(3), new Step(4)).collect(Collectors.toList());
+
+ LOG.info("stepped process started");
+ Thread thread = new Thread(new SteppedTask(steps));
+ thread.start();
+
+ Timer timer = new Timer();
+ TimeOutTask timeOutTask = new TimeOutTask(thread, timer);
+ timer.schedule(timeOutTask, 10000);
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java
new file mode 100644
index 0000000000..e27e64476e
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/stopexecution/TimeOutTask.java
@@ -0,0 +1,22 @@
+package com.baeldung.concurrent.stopexecution;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class TimeOutTask extends TimerTask {
+ private Thread thread;
+ private Timer timer;
+
+ public TimeOutTask(Thread thread, Timer timer) {
+ this.thread = thread;
+ this.timer = timer;
+ }
+
+ @Override
+ public void run() {
+ if (thread != null && thread.isAlive()) {
+ thread.interrupt();
+ timer.cancel();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java
new file mode 100644
index 0000000000..bbb8d0571a
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/FixedTimeTaskUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+public class FixedTimeTaskUnitTest {
+
+ @Test
+ public void run() throws InterruptedException {
+ long start = System.currentTimeMillis();
+ Thread thread = new Thread(new FixedTimeTask(10));
+ thread.start();
+ thread.join();
+ long end = System.currentTimeMillis();
+ assertTrue(end - start >= 10);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java
new file mode 100644
index 0000000000..c9bcb75e6d
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/LongRunningTaskUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class LongRunningTaskUnitTest {
+
+ @Test
+ public void run() {
+ Thread thread = new Thread(new LongRunningTask());
+ thread.start();
+ assertTrue(thread.isAlive());
+
+ thread.interrupt();
+ assertTrue(thread.isInterrupted());
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java
new file mode 100644
index 0000000000..ab9ac2732a
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/SteppedTaskUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.*;
+
+public class SteppedTaskUnitTest {
+
+ @Test
+ public void run() throws InterruptedException {
+ List steps = Stream.of(
+ new Step(1),
+ new Step(2),
+ new Step(3))
+ .collect(Collectors.toList());
+
+ Thread thread = new Thread(new SteppedTask(steps));
+ thread.start();
+ thread.interrupt();
+ thread.join();
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java
new file mode 100644
index 0000000000..39ec9f7d26
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/stopexecution/TimeOutTaskUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.concurrent.stopexecution;
+
+import org.junit.Test;
+
+import java.util.Timer;
+
+import static org.junit.Assert.assertTrue;
+
+public class TimeOutTaskUnitTest {
+
+ @Test
+ public void run() {
+ Thread thread = new Thread(new LongRunningTask());
+ Timer timer = new Timer();
+ TimeOutTask timeOutTask = new TimeOutTask(thread, timer);
+ thread.start();
+ timeOutTask.run();
+ assertTrue(thread.isInterrupted());
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java
index 9afb6e8db0..91cd29cd54 100644
--- a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java
+++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/subtractdays/SubtractDaysFromDateUnitTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
@@ -15,7 +16,7 @@ public class SubtractDaysFromDateUnitTest {
@Test
public void givenLocalDateTime_whenSubtractingFiveDays_dateIsChangedCorrectly() {
- LocalDate localDateTime = LocalDate.of(2022, 4, 20);
+ LocalDateTime localDateTime = LocalDateTime.of(2022, 4, 20, 0, 0);
localDateTime = localDateTime.minusDays(5);
diff --git a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
index b0243ae48f..629f15b2dd 100644
--- a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
@@ -7,7 +7,7 @@ import java.util.regex.Pattern;
public class February29thMatcher implements DateMatcher {
private static final Pattern DATE_PATTERN = Pattern.compile(
- "^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$");
+ "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$");
@Override
public boolean matches(String date) {
diff --git a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
index fc8abdb201..13be452910 100644
--- a/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
@@ -7,7 +7,7 @@ import java.util.regex.Pattern;
class GregorianDateMatcher implements DateMatcher {
private static final Pattern DATE_PATTERN = Pattern.compile(
- "^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$"
+ "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$"
+ "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$"
+ "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$"
+ "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$");
diff --git a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
index 6429e4fe2d..b7fb267077 100644
--- a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
@@ -37,6 +37,8 @@ public class GregorianDateTestHelper {
}
public void assertFebruary29th() {
+ Assert.assertTrue(matcher.matches("1904-02-29"));
+ Assert.assertTrue(matcher.matches("1996-02-29"));
Assert.assertTrue(matcher.matches("2000-02-29"));
Assert.assertTrue(matcher.matches("2400-02-29"));
Assert.assertTrue(matcher.matches("2800-02-29"));
@@ -44,6 +46,8 @@ public class GregorianDateTestHelper {
Assert.assertTrue(matcher.matches("2024-02-29"));
Assert.assertTrue(matcher.matches("2028-02-29"));
+ Assert.assertFalse(matcher.matches("1900-02-29"));
+ Assert.assertFalse(matcher.matches("1999-02-29"));
Assert.assertFalse(matcher.matches("2017-02-29"));
Assert.assertFalse(matcher.matches("2018-02-29"));
Assert.assertFalse(matcher.matches("2019-02-29"));
diff --git a/core-java-modules/core-java-exceptions-3/pom.xml b/core-java-modules/core-java-exceptions-3/pom.xml
index 455f769757..7eaa57edf1 100644
--- a/core-java-modules/core-java-exceptions-3/pom.xml
+++ b/core-java-modules/core-java-exceptions-3/pom.xml
@@ -32,8 +32,8 @@
3.8.1
-
-
+
+
diff --git a/core-java-modules/core-java-exceptions-4/pom.xml b/core-java-modules/core-java-exceptions-4/pom.xml
index cc81fdc40b..e9a2d05180 100644
--- a/core-java-modules/core-java-exceptions-4/pom.xml
+++ b/core-java-modules/core-java-exceptions-4/pom.xml
@@ -32,8 +32,8 @@
3.8.1
-
-
+
+
diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md
index 5f47aa69fb..b74ede51e8 100644
--- a/core-java-modules/core-java-exceptions/README.md
+++ b/core-java-modules/core-java-exceptions/README.md
@@ -13,4 +13,5 @@ This module contains articles about core java exceptions
- [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error)
- [Checked and Unchecked Exceptions in Java](https://www.baeldung.com/java-checked-unchecked-exceptions)
- [Common Java Exceptions](https://www.baeldung.com/java-common-exceptions)
+- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch)
- [[Next -->]](/core-java-modules/core-java-exceptions-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-httpclient/README.md b/core-java-modules/core-java-httpclient/README.md
new file mode 100644
index 0000000000..712328a123
--- /dev/null
+++ b/core-java-modules/core-java-httpclient/README.md
@@ -0,0 +1,6 @@
+## Java HttpClient
+
+This module contains articles about Java HttpClient
+
+### Relevant articles
+- [Posting with Java HttpClient](https://www.baeldung.com/java-httpclient-post)
diff --git a/core-java-modules/core-java-httpclient/pom.xml b/core-java-modules/core-java-httpclient/pom.xml
new file mode 100644
index 0000000000..57b23e96c1
--- /dev/null
+++ b/core-java-modules/core-java-httpclient/pom.xml
@@ -0,0 +1,58 @@
+
+
+ 4.0.0
+ core-java-httpclient
+ 0.1.0-SNAPSHOT
+ core-java-httpclient
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../pom.xml
+
+
+
+
+ org.mock-server
+ mockserver-netty
+ ${mockserver.version}
+
+
+ org.mock-server
+ mockserver-client-java
+ ${mockserver.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source.version}
+ ${maven.compiler.target.version}
+
+
+
+
+
+
+ 11
+ 11
+ 3.22.0
+ 5.11.2
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java
new file mode 100644
index 0000000000..43e6587ed4
--- /dev/null
+++ b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientHeader.java
@@ -0,0 +1,46 @@
+package com.baeldung.httpclient;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+public class HttpClientHeader {
+
+ public static HttpResponse callWithCustomHeader(String url) throws URISyntaxException, IOException, InterruptedException {
+ HttpClient httpClient = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .header("X-Our-Header-1", "value1")
+ .header("X-Our-Header-1", "value2")
+ .header("X-Our-Header-2", "value2")
+ .uri(new URI(url)).build();
+
+ return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+ }
+
+ public static HttpResponse callWithCustomHeaderV2(String url) throws URISyntaxException, IOException, InterruptedException {
+ HttpClient httpClient = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .headers("X-Our-Header-1", "value1", "X-Our-Header-1", "value2")
+ .uri(new URI(url)).build();
+
+ return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+ }
+
+ public static HttpResponse callWithCustomHeaderV3(String url) throws URISyntaxException, IOException, InterruptedException {
+ HttpClient httpClient = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .setHeader("X-Our-Header-1", "value1")
+ .setHeader("X-Our-Header-1", "value2")
+ .uri(new URI(url)).build();
+
+ return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+ }
+
+
+}
diff --git a/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java
new file mode 100644
index 0000000000..d08a7bf183
--- /dev/null
+++ b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java
@@ -0,0 +1,162 @@
+package com.baeldung.httpclient;
+
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
+public class HttpClientPost {
+
+ public static HttpResponse sendSynchronousPost(String serviceUrl) throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.noBody())
+ .build();
+
+ HttpResponse response = client
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ return response;
+ }
+
+ public static CompletableFuture> sendAsynchronousPost(String serviceUrl) {
+ HttpClient client = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.noBody())
+ .build();
+
+ CompletableFuture> futureResponse = client
+ .sendAsync(request, HttpResponse.BodyHandlers.ofString());
+
+ return futureResponse;
+ }
+
+ public static List>> sendConcurrentPost(List serviceUrls) {
+ HttpClient client = HttpClient.newHttpClient();
+
+ List>> completableFutures = serviceUrls.stream()
+ .map(URI::create)
+ .map(HttpRequest::newBuilder)
+ .map(builder -> builder.POST(HttpRequest.BodyPublishers.noBody()))
+ .map(HttpRequest.Builder::build)
+ .map(request -> client.sendAsync(request, HttpResponse.BodyHandlers.ofString()))
+ .collect(Collectors.toList());
+
+ return completableFutures;
+ }
+
+ public static HttpResponse sendPostWithAuthHeader(String serviceUrl) throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.noBody())
+ .header("Authorization", "Basic " + Base64.getEncoder()
+ .encodeToString(("baeldung:123456").getBytes()))
+ .build();
+
+ HttpResponse response = client
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ return response;
+ }
+
+ public static HttpResponse sendPostWithAuthClient(String serviceUrl) throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newBuilder()
+ .authenticator(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(
+ "baeldung",
+ "123456".toCharArray());
+ }
+ })
+ .build();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.noBody())
+ .build();
+
+ HttpResponse response = client
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ return response;
+ }
+
+ public static HttpResponse sendPostWithJsonBody(String serviceUrl) throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.ofString("{\"action\":\"hello\"}"))
+ .build();
+
+ HttpResponse response = client
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ return response;
+ }
+
+ public static HttpResponse sendPostWithFormData(String serviceUrl) throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+
+ Map formData = new HashMap<>();
+ formData.put("username", "baeldung");
+ formData.put("message", "hello");
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData)))
+ .build();
+
+ HttpResponse response = client
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ return response;
+ }
+
+ public static HttpResponse sendPostWithFileData(String serviceUrl, Path file) throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(serviceUrl))
+ .POST(HttpRequest.BodyPublishers.ofFile(file))
+ .build();
+
+ HttpResponse response = client
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ return response;
+ }
+
+ private static String getFormDataAsString(Map formData) {
+ StringBuilder formBodyBuilder = new StringBuilder();
+ for (Map.Entry singleEntry : formData.entrySet()) {
+ if (formBodyBuilder.length() > 0) {
+ formBodyBuilder.append("&");
+ }
+ formBodyBuilder.append(URLEncoder.encode(singleEntry.getKey(), StandardCharsets.UTF_8));
+ formBodyBuilder.append("=");
+ formBodyBuilder.append(URLEncoder.encode(singleEntry.getValue(), StandardCharsets.UTF_8));
+ }
+ return formBodyBuilder.toString();
+ }
+
+}
diff --git a/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java
new file mode 100644
index 0000000000..b43cf08649
--- /dev/null
+++ b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientPostUnitTest.java
@@ -0,0 +1,99 @@
+package com.baeldung.httpclient;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import java.io.IOException;
+import java.net.http.HttpResponse;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+import static org.assertj.core.api.Assertions.*;
+
+class HttpClientPostUnitTest extends PostRequestMockServer {
+
+ @Test
+ void givenSyncPostRequest_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException {
+ HttpResponse response = HttpClientPost.sendSynchronousPost(serviceUrl);
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+ @Test
+ void givenAsyncPostRequest_whenServerIsAvailable_thenOkStatusIsReceived() throws ExecutionException, InterruptedException {
+ CompletableFuture> futureResponse = HttpClientPost.sendAsynchronousPost(serviceUrl);
+ HttpResponse response = futureResponse.get();
+
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+ @Test
+ void givenConcurrentPostRequests_whenServerIsAvailable_thenOkStatusIsReceived() throws ExecutionException, InterruptedException {
+ List>> completableFutures = HttpClientPost
+ .sendConcurrentPost(List.of(serviceUrl, serviceUrl));
+
+ CompletableFuture>> combinedFutures = CompletableFuture
+ .allOf(completableFutures.toArray(new CompletableFuture[0]))
+ .thenApply(future ->
+ completableFutures.stream()
+ .map(CompletableFuture::join)
+ .collect(Collectors.toList()));
+
+ List> responses = combinedFutures.get();
+ responses.forEach((response) -> {
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ });
+ }
+
+ @Test
+ void givenPostRequestWithAuthClient_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException {
+ HttpResponse response = HttpClientPost.sendPostWithAuthClient(serviceUrl);
+
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+ @Test
+ void givenPostRequestWithAuthHeader_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException {
+ HttpResponse response = HttpClientPost.sendPostWithAuthHeader(serviceUrl);
+
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+ @Test
+ void givenPostRequestWithJsonBody_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException {
+ HttpResponse response = HttpClientPost.sendPostWithJsonBody(serviceUrl);
+
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+ @Test
+ void givenPostRequestWithFormData_whenServerIsAvailable_thenOkStatusIsReceived() throws IOException, InterruptedException {
+ HttpResponse response = HttpClientPost.sendPostWithFormData(serviceUrl);
+
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+ @Test
+ void givenPostRequestWithFileData_whenServerIsAvailable_thenOkStatusIsReceived(@TempDir Path tempDir) throws IOException, InterruptedException {
+ Path file = tempDir.resolve("temp.txt");
+ List lines = Arrays.asList("1", "2", "3");
+ Files.write(file, lines);
+
+ HttpResponse response = HttpClientPost.sendPostWithFileData(serviceUrl, file);
+
+ assertThat(response.statusCode()).isEqualTo(200);
+ assertThat(response.body()).isEqualTo("{\"message\":\"ok\"}");
+ }
+
+}
diff --git a/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java
new file mode 100644
index 0000000000..fa594897a3
--- /dev/null
+++ b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/PostRequestMockServer.java
@@ -0,0 +1,61 @@
+package com.baeldung.httpclient;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.mockserver.client.MockServerClient;
+import org.mockserver.integration.ClientAndServer;
+import org.mockserver.model.HttpStatusCode;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.URISyntaxException;
+
+import static org.mockserver.integration.ClientAndServer.startClientAndServer;
+import static org.mockserver.model.HttpRequest.request;
+import static org.mockserver.model.HttpResponse.response;
+
+public abstract class PostRequestMockServer {
+
+ public static ClientAndServer mockServer;
+ public static String serviceUrl;
+
+ private static int serverPort;
+
+ public static final String SERVER_ADDRESS = "127.0.0.1";
+ public static final String PATH = "/test1";
+ public static final String METHOD = "POST";
+
+ @BeforeAll
+ static void startServer() throws IOException, URISyntaxException {
+ serverPort = getFreePort();
+ serviceUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH;
+ mockServer = startClientAndServer(serverPort);
+ mockBasicPostRequest();
+ }
+
+ @AfterAll
+ static void stopServer() {
+ mockServer.stop();
+ }
+
+ private static void mockBasicPostRequest() {
+ new MockServerClient(SERVER_ADDRESS, serverPort)
+ .when(
+ request()
+ .withPath(PATH)
+ .withMethod(METHOD)
+ )
+ .respond(
+ response()
+ .withStatusCode(HttpStatusCode.OK_200.code())
+ .withBody("{\"message\":\"ok\"}")
+ );
+ }
+
+ private static int getFreePort () throws IOException {
+ try (ServerSocket serverSocket = new ServerSocket(0)) {
+ return serverSocket.getLocalPort();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md
index 65a46eeed3..c05618afbd 100644
--- a/core-java-modules/core-java-io-4/README.md
+++ b/core-java-modules/core-java-io-4/README.md
@@ -9,4 +9,5 @@ This module contains articles about core Java input and output (IO)
- [SequenceInputStream Class in Java](https://www.baeldung.com/java-sequenceinputstream)
- [Read a File Into a Map in Java](https://www.baeldung.com/java-read-file-into-map)
- [Read User Input Until a Condition is Met](https://www.baeldung.com/java-read-input-until-condition)
+- [Java Scanner.skip method with examples](https://www.baeldung.com/java-scanner-skip)
- [[<-- Prev]](/core-java-modules/core-java-io-3)
diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java
new file mode 100644
index 0000000000..cb6ce5fb2d
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/scanner/ScannerUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.scanner;
+
+import org.junit.Test;
+
+import java.util.*;
+import java.util.regex.*;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ScannerUnitTest {
+ @Test public void givenScannerWithPattern_thenSkipUsingPattern() {
+ String str = "Java scanner skip tutorial";
+ // Instantiates Scanner
+ Scanner sc = new Scanner(str);
+ // By using skip(Pattern) method is to skip that meets the given pattern
+ sc.skip(Pattern.compile(".ava"));
+
+ assertEquals(" scanner skip tutorial", sc.nextLine());
+ // Scanner closed
+ sc.close();
+ }
+
+ @Test public void givenScannerWithString_thenSkipUsingStringPattern() {
+ String str = "Java scanner skip tutorial";
+ // Instantiates Scanner
+ Scanner sc = new Scanner(str);
+ // By using skip(String) method is to skip that meets the given
+ // pattern constructed from the given String
+ sc.skip("Java");
+
+ assertEquals(" scanner skip tutorial", sc.nextLine());
+ // Scanner closed
+ sc.close();
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md
index 832d4783f2..53414eb14c 100644
--- a/core-java-modules/core-java-lambdas/README.md
+++ b/core-java-modules/core-java-lambdas/README.md
@@ -6,4 +6,5 @@
- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
- [Method References in Java](https://www.baeldung.com/java-method-references)
-- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator)
\ No newline at end of file
+- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator)
+- [Serialize a Lambda in Java](https://www.baeldung.com/java-serialize-lambda)
diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java
new file mode 100644
index 0000000000..38f87e4ba9
--- /dev/null
+++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/NotSerializableLambdaExpression.java
@@ -0,0 +1,8 @@
+package com.baeldung.java8.lambda.serialization;
+
+public class NotSerializableLambdaExpression {
+ public static Object getLambdaExpressionObject() {
+ Runnable r = () -> System.out.println("please serialize this message");
+ return r;
+ }
+}
diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java
new file mode 100644
index 0000000000..74541013bb
--- /dev/null
+++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/serialization/SerializableLambdaExpression.java
@@ -0,0 +1,10 @@
+package com.baeldung.java8.lambda.serialization;
+
+import java.io.Serializable;
+
+public class SerializableLambdaExpression {
+ public static Object getLambdaExpressionObject() {
+ Runnable r = (Runnable & Serializable) () -> System.out.println("please serialize this message");
+ return r;
+ }
+}
diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java
new file mode 100644
index 0000000000..bb71e3bdb9
--- /dev/null
+++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/serialization/LambdaSerializationUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.java8.lambda.serialization;
+
+import org.junit.Test;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import static org.junit.Assert.assertTrue;
+
+public class LambdaSerializationUnitTest {
+ @Test(expected = NotSerializableException.class)
+ public void givenRunnable_whenNoCapturing_thenSerializationFailed() throws IOException, ClassNotFoundException {
+ Object obj = NotSerializableLambdaExpression.getLambdaExpressionObject();
+ writeAndReadObject(obj, Runnable.class);
+ }
+
+ @Test
+ public void givenIntersectionType_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
+ Object obj = SerializableLambdaExpression.getLambdaExpressionObject();
+ writeAndReadObject(obj, Runnable.class);
+ }
+
+ @Test
+ public void givenSerializableRunnable_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
+ SerializableRunnable obj = () -> System.out.println("please serialize this message");
+ writeAndReadObject(obj, SerializableRunnable.class);
+ }
+
+ @Test
+ public void givenSerializableFunction_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
+ SerializableFunction obj = message -> String.format("Hello %s", message);
+ writeAndReadObject(obj, SerializableFunction.class);
+ }
+
+ @Test
+ public void givenSerializableConsumer_whenNoCapturing_thenSerializationSuccess() throws IOException, ClassNotFoundException {
+ SerializableConsumer obj = message -> System.out.println(message);
+ writeAndReadObject(obj, SerializableConsumer.class);
+ }
+
+ @Test(expected = NotSerializableException.class)
+ public void givenSerializableConsumer_whenCapturingNotSerializable_thenSerializationFailed() throws IOException, ClassNotFoundException {
+ SerializableConsumer obj = System.out::println;
+ writeAndReadObject(obj, SerializableConsumer.class);
+ }
+
+ private void writeAndReadObject(Object obj, Class clazz) throws IOException, ClassNotFoundException {
+ File file = Files.createTempFile("lambda", "ser").toFile();
+ try (
+ FileOutputStream fos = new FileOutputStream(file);
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(obj);
+ }
+
+ try (
+ FileInputStream fis = new FileInputStream(file);
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ Object newObj = ois.readObject();
+ boolean isInstance = clazz.isInstance(newObj);
+
+ assertTrue(isInstance);
+ }
+ }
+
+ interface SerializableRunnable extends Runnable, Serializable {
+ }
+
+ interface SerializableFunction extends Function, Serializable {
+ }
+
+ interface SerializableConsumer extends Consumer, Serializable {
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/README.md b/core-java-modules/core-java-lang-4/README.md
index a145633d2b..befef0b6eb 100644
--- a/core-java-modules/core-java-lang-4/README.md
+++ b/core-java-modules/core-java-lang-4/README.md
@@ -11,3 +11,4 @@ This module contains articles about core features in the Java language
- [Fixing the “Declared package does not match the expected package” Error](https://www.baeldung.com/java-declared-expected-package-error)
- [Chaining Constructors in Java](https://www.baeldung.com/java-chain-constructors)
- [Difference Between POJO, JavaBeans, DTO and VO](https://www.baeldung.com/java-pojo-javabeans-dto-vo)
+- [Implements vs. Extends in Java](https://www.baeldung.com/java-implements-vs-extends)
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java
index 7a1775f79d..3d2c61aa3d 100644
--- a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/employee/EmployeeVO.java
@@ -28,9 +28,15 @@ public class EmployeeVO {
@Override
public boolean equals(Object obj) {
- return Objects.equals(firstName, this.firstName)
- && Objects.equals(lastName, this.lastName)
- && Objects.equals(startDate, this.startDate);
+
+ if (this == obj) return true;
+ if (obj == null || getClass() != obj.getClass()) return false;
+
+ EmployeeVO emp = (EmployeeVO) obj;
+
+ return Objects.equals(firstName, emp.firstName)
+ && Objects.equals(lastName, emp.lastName)
+ && Objects.equals(startDate, emp.startDate);
}
@Override
diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md
new file mode 100644
index 0000000000..8920e9c231
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/README.md
@@ -0,0 +1,7 @@
+## Core Java Lang (Part 5)
+
+This module contains articles about core features in the Java language
+
+### Relevant Articles:
+
+- [Difference Between == and equals() in Java](https://www.baeldung.com/java-equals-method-operator-difference)
diff --git a/core-java-modules/core-java-lang-5/pom.xml b/core-java-modules/core-java-lang-5/pom.xml
new file mode 100644
index 0000000000..6d3771bd31
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/pom.xml
@@ -0,0 +1,27 @@
+
+
+ 4.0.0
+ core-java-lang-5
+ 0.1.0-SNAPSHOT
+ core-java-lang-5
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+ core-java-lang-5
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java
new file mode 100644
index 0000000000..12b3db734d
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/nullchecks/NullChecksUnitTest.java
@@ -0,0 +1,125 @@
+package com.baeldung.nullchecks;
+
+import org.junit.Test;
+
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class NullChecksUnitTest {
+
+ @Test
+ public void whenReferenceEqualityOnPrimitives_thenCompareValues() {
+ int a = 10;
+ int b = 15;
+ int c = 10;
+ int d = a;
+
+ // different values check
+ assertFalse(a == b);
+
+ // same values check
+ assertTrue(a == c);
+
+ // same references check
+ assertTrue(a == d);
+ }
+
+ @Test
+ public void whenReferenceEqualityOnObjects_thenCompareReferences() {
+ Person a = new Person("Bob", 20);
+ Person b = new Person("Mike", 40);
+ Person c = new Person("Bob", 20);
+ Person d = a;
+ Person e = null;
+
+ // different values check
+ assertFalse(a == b);
+
+ // same values check
+ assertFalse(a == c);
+
+ // same references check
+ assertTrue(a == d);
+
+ // same references check - for nulls
+ assertTrue(e == null);
+ }
+
+ @Test
+ public void whenValueEqualityOnPrimitives_thenCompareValues() {
+ int a = 10;
+ Integer b = a;
+
+ assertTrue(b.equals(10));
+ }
+
+ @Test
+ public void whenValueEqualityOnObjects_thenCompareValues() {
+ Person a = new Person("Bob", 20);
+ Person b = new Person("Mike", 40);
+ Person c = new Person("Bob", 20);
+ Person d = a;
+ Person e = null;
+
+ // different values check
+ assertFalse(a.equals(b));
+
+ // same values check
+ assertTrue(a.equals(c));
+
+ // same references check
+ assertTrue(a.equals(d));
+
+ // null checks
+ assertFalse(a.equals(e));
+ assertThrows(NullPointerException.class, () -> e.equals(a));
+
+ // null checks fixed
+ assertFalse(e != null && e.equals(a));
+
+ // using Objects.equals
+ assertFalse(Objects.equals(e, a));
+ assertTrue(Objects.equals(null, e));
+
+ }
+
+ private class Person {
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Person person = (Person) o;
+ return age == person.age && Objects.equals(name, person.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, age);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-lang-math-3/README.md b/core-java-modules/core-java-lang-math-3/README.md
index 1dd3a3c7e0..3ddaddae39 100644
--- a/core-java-modules/core-java-lang-math-3/README.md
+++ b/core-java-modules/core-java-lang-math-3/README.md
@@ -5,4 +5,5 @@
### Relevant articles:
- [Evaluating a Math Expression in Java](https://www.baeldung.com/java-evaluate-math-expression-string)
+- [Swap Two Variables in Java](https://www.baeldung.com/java-swap-two-variables)
- More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2)
diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java
new file mode 100644
index 0000000000..bbfa0ee4f1
--- /dev/null
+++ b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/swap/SwappingVariablesUnitTest.java
@@ -0,0 +1,157 @@
+package com.baeldung.math.swap;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class SwappingVariablesUnitTest {
+
+ @Test
+ public void givenTwoStrings_whenSwappingInMethod_thenFails() {
+
+ String a = "a";
+ String b = "b";
+
+ swap(a, b);
+
+ Assertions.assertFalse(a.equals("b"));
+ Assertions.assertFalse(b.equals("a"));
+ }
+
+ @Test
+ public void givenTwoWrappers_whenSwappingInMethod_thenSuccess() {
+
+ Wrapper a = new Wrapper("a");
+ Wrapper b = new Wrapper("b");
+
+ swap(a, b);
+
+ Assertions.assertTrue(a.string.equals("b"));
+ Assertions.assertTrue(b.string.equals("a"));
+ }
+
+ @Test
+ public void givenTwoIntegers_whenSwappingUsingAdditionSubstraction_thenSuccess() {
+
+ int a = 5;
+ int b = 10;
+
+ a = a + b;
+ b = a - b;
+ a = a - b;
+
+ Assertions.assertTrue(a == 10);
+ Assertions.assertTrue(b == 5);
+ }
+
+ @Test
+ public void givenTwoIntegers_whenSwappingUsingMultiplicationDivision_thenSuccess() {
+
+ int a = 5;
+ int b = 10;
+
+ a = a * b;
+ b = a / b;
+ a = a / b;
+
+ Assertions.assertTrue(a == 10);
+ Assertions.assertTrue(b == 5);
+ }
+
+ @Test
+ public void givenTwoIntegers_whenSwappingWithOverflow_thenFails() {
+
+ int a = Integer.MAX_VALUE;
+ int b = 10;
+
+ a = a * b;
+ b = a / b;
+ a = a / b;
+
+ Assertions.assertTrue(a == 10);
+ Assertions.assertFalse(b == Integer.MAX_VALUE);
+ }
+
+ @Test
+ public void givenTwoChars_whenSwappingWithCast_thenSuccess() {
+
+ char a = 'a';
+ char b = 'b';
+
+ a = (char)(a * b);
+ b = (char)(a / b);
+ a = (char)(a / b);
+
+ Assertions.assertTrue(a == 'b');
+ Assertions.assertTrue(b == 'a');
+ }
+
+ @Test
+ public void givenTwoIntegers_whenSwappingUsingXor_thenSuccess() {
+
+ int a = 5;
+ int b = 10;
+
+ a = a ^ b;
+ b = a ^ b;
+ a = a ^ b;
+
+ Assertions.assertTrue(a == 10);
+ Assertions.assertTrue(b == 5);
+ }
+
+ @Test
+ public void givenTwoIntegers_whenSwappingUsingSingleLineXor_thenSuccess() {
+
+ int a = 5;
+ int b = 10;
+
+ a = a ^ b ^ (b = a);
+
+ Assertions.assertTrue(a == 10);
+ Assertions.assertTrue(b == 5);
+ }
+
+ @Test
+ public void givenTwoIntegers_whenSwappingUsingAdditionSubstractionSingleLine_thenSuccess() {
+
+ int a = 5;
+ int b = 10;
+
+ b = (a + b) - (a = b);
+
+ Assertions.assertTrue(a == 10);
+ Assertions.assertTrue(b == 5);
+ }
+
+ /**
+ * Illustrates that swapping in a method doesn't work
+ */
+ private void swap(String a, String b) {
+
+ String temp = b;
+ b = a;
+ a = temp;
+ }
+
+ /**
+ * Illustrates swapping in a method with Wrapper class
+ */
+ private void swap(Wrapper a, Wrapper b) {
+
+ String temp = b.string;
+ b.string = a.string;
+ a.string = temp;
+ }
+
+ class Wrapper {
+
+ public String string;
+
+ public Wrapper(String string) {
+
+ this.string = string;
+ }
+
+
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java
new file mode 100644
index 0000000000..05b398371c
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/Direction.java
@@ -0,0 +1,22 @@
+package com.baeldung.enums.randomenum;
+
+import java.util.Random;
+
+/**
+ * Represents directions.
+ */
+public enum Direction {
+ EAST, WEST, SOUTH, NORTH;
+
+ private static final Random PRNG = new Random();
+
+ /**
+ * Generate a random direction.
+ *
+ * @return a random direction
+ */
+ public static Direction randomDirection() {
+ Direction[] directions = values();
+ return directions[PRNG.nextInt(directions.length)];
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java
new file mode 100644
index 0000000000..33d793062d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/randomenum/RandomEnumGenerator.java
@@ -0,0 +1,17 @@
+package com.baeldung.enums.randomenum;
+
+import java.util.Random;
+
+public class RandomEnumGenerator> {
+
+ private static final Random PRNG = new Random();
+ private final T[] values;
+
+ public RandomEnumGenerator(Class e) {
+ values = e.getEnumConstants();
+ }
+
+ public T randomEnum() {
+ return values[PRNG.nextInt(values.length)];
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/randomenum/RandomEnumUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/randomenum/RandomEnumUnitTest.java
new file mode 100644
index 0000000000..76b4bf1e74
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/randomenum/RandomEnumUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.enums.randomenum;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class RandomEnumUnitTest {
+
+ @Test
+ public void givenEnumType_whenUsingStaticMethod_valueIsRandomlyGenerated() {
+ Direction direction = Direction.randomDirection();
+ assertThat(direction).isNotNull();
+ assertThat(direction instanceof Direction);
+ }
+
+ @Test
+ public void givenEnumType_whenGeneratingRandomValue_valueIsOfClassAndNotNull() {
+ RandomEnumGenerator reg = new RandomEnumGenerator(Direction.class);
+ Object direction = reg.randomEnum();
+ assertThat(direction).isNotNull();
+ assertThat(direction instanceof Direction);
+ }
+}
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
index 987a69582f..0aba09a539 100644
--- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
@@ -19,7 +19,7 @@ public class FileDownloadIntegrationTest {
static String FILE_URL = "https://s3.amazonaws.com/baeldung.com/Do+JSON+with+Jackson+by+Baeldung.pdf";
static String FILE_NAME = "file.dat";
- static String FILE_MD5_HASH = "c959feb066b37f5c4f0e0f45bbbb4f86";
+ static String FILE_MD5_HASH = "753197aa27f162faa3e3c2e48ee5eb07";
@Test
public void givenJavaIO_whenDownloadingFile_thenDownloadShouldBeCorrect() throws NoSuchAlgorithmException, IOException {
diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md
index 82e75820ba..03c2dcfa89 100644
--- a/core-java-modules/core-java-networking-3/README.md
+++ b/core-java-modules/core-java-networking-3/README.md
@@ -10,4 +10,6 @@ This module contains articles about networking in Java
- [Find Whether an IP Address Is in the Specified Range or Not in Java](https://www.baeldung.com/java-check-ip-address-range)
- [Find the IP Address of a Client Connected to a Server](https://www.baeldung.com/java-client-get-ip-address)
- [Unix Domain Socket in Java 16](https://www.baeldung.com/java-unix-domain-socket)
+- [Get the IP Address of the Current Machine Using Java](https://www.baeldung.com/java-get-ip-address)
+- [Get Domain Name From Given URL in Java](https://www.baeldung.com/java-domain-name-from-url)
- [[<-- Prev]](/core-java-modules/core-java-networking-2)
diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml
index 297d665544..63385c2334 100644
--- a/core-java-modules/core-java-networking-3/pom.xml
+++ b/core-java-modules/core-java-networking-3/pom.xml
@@ -52,6 +52,12 @@
java-ipv6
${googlecode.ipv6.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
@@ -84,6 +90,7 @@
1.32
0.17
1.6.2
+ 31.0-jre
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/domain_name/DomainNameClient.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/domain_name/DomainNameClient.java
new file mode 100644
index 0000000000..1b2cb636fe
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/domain_name/DomainNameClient.java
@@ -0,0 +1,34 @@
+package com.baeldung.domain_name;
+
+import com.google.common.net.InternetDomainName;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class DomainNameClient {
+
+ public String getHost(String url) throws URISyntaxException {
+ URI uri = new URI(url);
+ return uri.getHost();
+ }
+
+ public String getTopPrivateDomain(String url) {
+ InternetDomainName internetDomainName = InternetDomainName.from(url)
+ .topPrivateDomain();
+ return internetDomainName.toString();
+ }
+
+ public String getName(String url) {
+ InternetDomainName internetDomainName = InternetDomainName.from(url)
+ .topPrivateDomain();
+ String publicSuffix = internetDomainName.publicSuffix()
+ .toString();
+ String domainName = internetDomainName.toString();
+ return domainName.substring(0, domainName.lastIndexOf("." + publicSuffix));
+ }
+
+ public String getDomainName(String url) {
+ String regex = "http(s)?://|www\\.|/.*";
+ return url.replaceAll(regex, "");
+ }
+}
diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java
new file mode 100644
index 0000000000..d7ab002e77
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/http/JavaHttpClientTimeout.java
@@ -0,0 +1,12 @@
+package com.baeldung.http;
+
+import java.net.http.HttpClient;
+import java.time.Duration;
+
+public class JavaHttpClientTimeout {
+ static HttpClient getHttpClientWithTimeout(int seconds) {
+ return HttpClient.newBuilder()
+ .connectTimeout(Duration.ofSeconds(seconds))
+ .build();
+ }
+}
diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java
new file mode 100644
index 0000000000..30ad5a503d
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/iplookup/IPAddressLookup.java
@@ -0,0 +1,50 @@
+package com.baeldung.iplookup;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketException;
+import java.net.URL;
+import java.net.UnknownHostException;
+
+public class IPAddressLookup {
+ public static void main(String[] args) {
+ System.out.println("UDP connection IP lookup: " + getLocalIpAddressUdp());
+ System.out.println("Socket connection IP lookup: " + getLocalIpAddressSocket());
+ System.out.println("AWS connection IP lookup: " + getPublicIpAddressAws());
+ }
+
+ public static String getLocalIpAddressUdp() {
+ try (final DatagramSocket datagramSocket = new DatagramSocket()) {
+ datagramSocket.connect(InetAddress.getByName("8.8.8.8"), 12345);
+ return datagramSocket.getLocalAddress().getHostAddress();
+ } catch (SocketException | UnknownHostException exception) {
+ throw new RuntimeException(exception);
+ }
+ }
+
+ public static String getLocalIpAddressSocket() {
+ try (Socket socket = new Socket()) {
+ socket.connect(new InetSocketAddress("google.com", 80));
+ return socket.getLocalAddress().getHostAddress();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static String getPublicIpAddressAws() {
+ try {
+ String urlString = "http://checkip.amazonaws.com/";
+ URL url = new URL(urlString);
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
+ return br.readLine();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/domain_name/DomainNameClientUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/domain_name/DomainNameClientUnitTest.java
new file mode 100644
index 0000000000..d69e7c0333
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/domain_name/DomainNameClientUnitTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.domain_name;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class DomainNameClientUnitTest {
+
+ DomainNameClient domainNameClient = new DomainNameClient();
+
+ @Test
+ void givenUrl_whenGetHost_thenReturnSubdomainAndDomainName() {
+ Assertions.assertAll(() -> {
+ assertEquals("www.baeldung.com", domainNameClient.getHost("https://www.baeldung.com/domain"));
+ assertEquals("www.google.co.uk", domainNameClient.getHost("https://www.google.co.uk/domain"));
+ assertEquals("jira.baeldung.com", domainNameClient.getHost("https://jira.baeldung.com/secure"));
+ });
+ }
+
+ @Test
+ void givenUrl_whenGetTopPrivateDomain_thenReturnDomainName() {
+ assertEquals("baeldung.com", domainNameClient.getTopPrivateDomain("www.baeldung.com"));
+ }
+
+ @Test
+ void givenUrlWithPublicSuffix_whenGetTopPrivateDomain_thenReturnDomainName() {
+ assertEquals("google.co.uk", domainNameClient.getTopPrivateDomain("www.google.co.uk"));
+ assertEquals("baeldung.blogspot.com", domainNameClient.getTopPrivateDomain("www.baeldung.blogspot.com"));
+ }
+
+ @Test
+ void givenUrlWithPublicSuffix_whenGetName_thenReturnSecondLevelDomain() {
+ assertEquals("baeldung", domainNameClient.getName("jira.baeldung.com"));
+ }
+
+ @Test
+ void givenUrlWithPublicSuffix_whenGetName_thenReturnThirdLevelDomain() {
+ assertEquals("baeldung", domainNameClient.getName("www.baeldung.co.uk"));
+ assertEquals("google", domainNameClient.getName("www.google.co.uk"));
+ }
+
+ @Test
+ void givenUrl_whenGetDomainNameRegex_thenReturnDomainName() {
+ assertEquals("google.com", domainNameClient.getDomainName("www.google.com"));
+ assertEquals("google.co.uk", domainNameClient.getDomainName("www.google.co.uk"));
+ assertEquals("jira.baeldung.com", domainNameClient.getDomainName("jira.baeldung.com"));
+ assertEquals("baeldung.com", domainNameClient.getDomainName("www.baeldung.com/test"));
+ }
+
+}
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java
new file mode 100644
index 0000000000..df635621ad
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutIntegrationTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.http;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpConnectTimeoutException;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.time.Duration;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import static com.baeldung.http.JavaHttpClientTimeout.getHttpClientWithTimeout;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class JavaHttpClientTimeoutIntegrationTest {
+
+ private HttpClient httpClient;
+ private HttpRequest httpRequest;
+
+ @BeforeEach
+ public void setUp() {
+ httpClient = getHttpClientWithTimeout(3);
+ httpClient.connectTimeout().map(Duration::toSeconds)
+ .ifPresent(sec -> System.out.println("Timeout in seconds: " + sec));
+
+ httpRequest = HttpRequest.newBuilder().uri(URI.create("http://10.255.255.1")).GET().build();
+ }
+
+ @Test
+ void shouldThrowExceptionWhenMakingSyncCall() {
+ HttpConnectTimeoutException thrown = assertThrows(
+ HttpConnectTimeoutException.class,
+ () -> httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()),
+ "Expected doThing() to throw, but it didn't"
+ );
+ assertTrue(thrown.getMessage().contains("timed out"));
+ }
+
+ @Test
+ void shouldThrowExceptionWhenMakingASyncCall() throws ExecutionException, InterruptedException, TimeoutException {
+ CompletableFuture completableFuture =
+ httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString())
+ .thenApply(HttpResponse::body)
+ .exceptionally(Throwable::getMessage);
+ String response = completableFuture.get(5, TimeUnit.SECONDS);
+ assertTrue(response.contains("timed out"));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java
new file mode 100644
index 0000000000..d693b9075c
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/http/JavaHttpClientTimeoutOnRequestIntegrationTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.http;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpConnectTimeoutException;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.time.Duration;
+import java.time.LocalTime;
+
+import static com.baeldung.http.JavaHttpClientTimeout.getHttpClientWithTimeout;
+import static java.time.LocalTime.now;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class JavaHttpClientTimeoutOnRequestIntegrationTest {
+
+ private HttpClient httpClient;
+ private HttpRequest httpRequest;
+
+ @BeforeEach
+ public void setUp() {
+ httpClient = getHttpClientWithTimeout(3);
+ httpClient.connectTimeout().map(Duration::toSeconds)
+ .ifPresent(sec -> System.out.println("Timeout in seconds: " + sec));
+
+ httpRequest = HttpRequest.newBuilder()
+ .uri(URI.create("http://10.255.255.1"))
+ .timeout(Duration.ofSeconds(1))
+ .GET()
+ .build();
+ }
+
+ @Test
+ void shouldThrowExceptionWhithin1SecondWhenMakingSyncCall() {
+ LocalTime beforeHttpCall = now();
+ HttpConnectTimeoutException thrown = assertThrows(
+ HttpConnectTimeoutException.class,
+ () -> httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()),
+ "Expected doThing() to throw, but it didn't"
+ );
+ LocalTime afterHttpCall = now();
+ assertTrue(thrown.getMessage().contains("timed out"));
+ assertEquals(1, Duration.between(beforeHttpCall, afterHttpCall).getSeconds());
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/README.md b/core-java-modules/core-java-nio-2/README.md
index c405cb7c77..527600779a 100644
--- a/core-java-modules/core-java-nio-2/README.md
+++ b/core-java-modules/core-java-nio-2/README.md
@@ -13,4 +13,5 @@ This module contains articles about core Java non-blocking input and output (IO)
- [Java – Path vs File](https://www.baeldung.com/java-path-vs-file)
- [What Is the Difference Between NIO and NIO.2?](https://www.baeldung.com/java-nio-vs-nio-2)
- [Guide to ByteBuffer](https://www.baeldung.com/java-bytebuffer)
+- [Find Files that Match Wildcard Strings in Java](https://www.baeldung.com/java-files-match-wildcard-strings)
- [[<-- Prev]](/core-java-modules/core-java-nio)
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java
new file mode 100644
index 0000000000..2deaa60ec6
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcard.java
@@ -0,0 +1,37 @@
+package com.baeldung.searchfilesbywildcards;
+
+import java.io.IOException;
+
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SearchFileByWildcard {
+ public static List matchesList = new ArrayList();
+ public List searchWithWc(Path rootDir, String pattern) throws IOException {
+ matchesList.clear();
+ FileVisitor matcherVisitor = new SimpleFileVisitor() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
+ FileSystem fs = FileSystems.getDefault();
+ PathMatcher matcher = fs.getPathMatcher(pattern);
+ Path name = file.getFileName();
+ if (matcher.matches(name)) {
+ matchesList.add(name.toString());
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ };
+ Files.walkFileTree(rootDir, matcherVisitor);
+ return matchesList;
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java
new file mode 100644
index 0000000000..71cee036ec
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/searchfilesbywildcards/SearchFileByWildcardUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.searchfilesbywildcards;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+
+import java.nio.file.Paths;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+public class SearchFileByWildcardUnitTest {
+ @Test
+ public void whenFourFilenameMatch_thenListOfFour() throws IOException {
+ SearchFileByWildcard sfbw = new SearchFileByWildcard();
+ List actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}");
+
+ assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")), new HashSet<>(actual));
+ }
+ @Test
+ public void whenOneFilenameMatch_thenListOfOne() throws IOException {
+ SearchFileByWildcard sfbw = new SearchFileByWildcard();
+ List actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}");
+
+ assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/five.csv b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/five.csv
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/four.xlsx b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/four.xlsx
new file mode 100644
index 0000000000..1091dafe75
Binary files /dev/null and b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/four.xlsx differ
diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/one.txt b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/one.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/test2/six.txt b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/test2/six.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/three.txt b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/three.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/two.docx b/core-java-modules/core-java-nio-2/src/test/resources/sfbw/test/two.docx
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-reflection-2/README.md b/core-java-modules/core-java-reflection-2/README.md
index c1966dd63d..a3c9d00b0a 100644
--- a/core-java-modules/core-java-reflection-2/README.md
+++ b/core-java-modules/core-java-reflection-2/README.md
@@ -7,3 +7,4 @@
- [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method)
- [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package)
- [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection)
+- [What Is the JDK com.sun.proxy.$Proxy Class?](https://www.baeldung.com/jdk-com-sun-proxy)
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java
new file mode 100644
index 0000000000..b3f0dc8ec0
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/AdvancedOperation.java
@@ -0,0 +1,7 @@
+package com.baeldung.reflection.proxy;
+
+public interface AdvancedOperation {
+ int multiply(int a, int b);
+
+ int divide(int a, int b);
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java
new file mode 100644
index 0000000000..168367b690
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/proxy/BasicOperation.java
@@ -0,0 +1,7 @@
+package com.baeldung.reflection.proxy;
+
+public interface BasicOperation {
+ int add(int a, int b);
+
+ int subtract(int a, int b);
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java
new file mode 100644
index 0000000000..ef6c481778
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/proxy/DollarProxyUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.reflection.proxy;
+
+import org.junit.Test;
+
+import java.lang.reflect.Proxy;
+import java.util.function.Consumer;
+
+import static org.junit.Assert.assertTrue;
+
+public class DollarProxyUnitTest {
+ @Test
+ public void givenProxy_whenInvokingGetProxyClass_thenGeneratingProxyClass() {
+ // Java 8: -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true
+ // Java 9 or later: -Djdk.proxy.ProxyGenerator.saveGeneratedFiles=true
+ // Note: System.setProperty() doesn't work here
+ // because ProxyGenerator.saveGeneratedFiles read its property only once.
+ // The @Test annotation in this method will generate a $Proxy class.
+
+ ClassLoader classLoader = ClassLoader.getSystemClassLoader();
+ Class>[] interfaces = {BasicOperation.class, AdvancedOperation.class};
+ Class> proxyClass = Proxy.getProxyClass(classLoader, interfaces);
+
+ boolean isProxyClass = Proxy.isProxyClass(proxyClass);
+ assertTrue(isProxyClass);
+ }
+
+ @Test
+ public void givenReflection_whenReadingAnnotation_thenGeneratingProxyClass() {
+ FunctionalInterface instance = Consumer.class.getDeclaredAnnotation(FunctionalInterface.class);
+ Class> clazz = instance.getClass();
+
+ boolean isProxyClass = Proxy.isProxyClass(clazz);
+ assertTrue(isProxyClass);
+ }
+}
diff --git a/core-java-modules/core-java-regex-2/README.md b/core-java-modules/core-java-regex-2/README.md
index 6dafc74d41..453e2cc419 100644
--- a/core-java-modules/core-java-regex-2/README.md
+++ b/core-java-modules/core-java-regex-2/README.md
@@ -4,4 +4,5 @@
- [Lookahead and Lookbehind in Java Regex](https://www.baeldung.com/java-regex-lookahead-lookbehind)
- [Converting Camel Case and Title Case to Words in Java](https://www.baeldung.com/java-camel-case-title-case-to-words)
- [How to Use Regular Expressions to Replace Tokens in Strings in Java](https://www.baeldung.com/java-regex-token-replacement)
-- More articles: [[<-- prev]](/core-java-modules/core-java-regex)
\ No newline at end of file
+- [Creating a Java Array from Regular Expression Matches](https://www.baeldung.com/java-array-regex-matches)
+- More articles: [[<-- prev]](/core-java-modules/core-java-regex)
diff --git a/core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java b/core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java
new file mode 100644
index 0000000000..d7b50d95ca
--- /dev/null
+++ b/core-java-modules/core-java-regex-2/regexMatchToArray/src/regex/array/RegexMatches.java
@@ -0,0 +1,24 @@
+package regex.array;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.*;
+
+class RegexMatches {
+
+ String[] regexMatch(String strSearch)
+ {
+ List matchesList = new ArrayList();
+ String stringToSearch = strSearch;
+ Pattern p1 = Pattern.compile("780{1}\\d{7}");
+ Matcher m1 = p1.matcher(stringToSearch);
+ while (m1.find())
+ {
+ matchesList.add(m1.group());
+ }
+ int sizeOfNewArray = matchesList.size();
+ String newArrayOfMatches[] = new String[sizeOfNewArray];
+ matchesList.toArray(newArrayOfMatches);
+ return newArrayOfMatches;
+ }
+}
diff --git a/core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java b/core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java
new file mode 100644
index 0000000000..3e8f23c4bb
--- /dev/null
+++ b/core-java-modules/core-java-regex-2/regexMatchToArray/test/regex/array/RegexMatchesUnitTest.java
@@ -0,0 +1,33 @@
+package regex.array;
+
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.Test;
+
+import regex.array.RegexMatches;
+
+class RegexMatchesUnitTest {
+
+ @Test
+ void whenFourNums_thenFourMatches() {
+ RegexMatches rm = new RegexMatches();
+ String actual[] = rm.regexMatch("7801111211fsdafasdfa 7802222222 sadfsadfsda7803333333 sadfdasfasd 7804444444");
+
+ assertArrayEquals(new String[] {"7801111211", "7802222222", "7803333333", "7804444444"}, actual, "success");
+ }
+
+ @Test
+ void whenThreeNums_thenThreeMatches() {
+ RegexMatches rm = new RegexMatches();
+ String actual[] = rm.regexMatch("7801111211fsdafasdfa 780222222 sadfsadfsda7803333333 sadfdasfasd 7804444444");
+
+ assertArrayEquals(new String[] {"7801111211", "7803333333", "7804444444"}, actual, "success");
+ }
+
+ @Test
+ void whenZeroNums_thenZeroMatches() {
+ RegexMatches rm = new RegexMatches();
+ String actual[] = rm.regexMatch("78011111fsdafasdfa 780222222 sadfsadfsda78033333 sadfdasfasd 7804444");
+
+ assertArrayEquals(new String[] {}, actual, "success");
+ }
+}
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
index 77052b79ac..f6c5f35f37 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
@@ -104,7 +104,7 @@ public class RegexUnitTest {
@Test
public void givenNumberRange_whenMatchesAccurately_thenCorrect2() {
- int matches = runTest("[30-35]", "Two Uppercase alphabets 34 overall");
+ int matches = runTest("3[0-5]", "Two Uppercase alphabets 34 overall");
assertTrue(matches > 0);
assertEquals(matches, 1);
}
diff --git a/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java
index fa38aca272..5653f47734 100644
--- a/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java
+++ b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java
@@ -17,7 +17,7 @@ public class AvailableCiphersUnitTest {
public void whenGetServices_thenGetAllCipherAlgorithms() {
for (Provider provider : Security.getProviders()) {
for (Provider.Service service : provider.getServices()) {
- logger.info(service.getAlgorithm());
+ logger.debug(service.getAlgorithm());
}
}
}
@@ -30,6 +30,6 @@ public class AvailableCiphersUnitTest {
.map(Provider.Service::getAlgorithm)
.collect(Collectors.toList());
- algorithms.forEach(logger::info);
+ algorithms.forEach(logger::debug);
}
}
diff --git a/immutables/src/main/resources/logback.xml b/core-java-modules/core-java-security-algorithms/src/test/resources/logback.xml
similarity index 100%
rename from immutables/src/main/resources/logback.xml
rename to core-java-modules/core-java-security-algorithms/src/test/resources/logback.xml
diff --git a/core-java-modules/core-java-string-operations-4/README.md b/core-java-modules/core-java-string-operations-4/README.md
index 0e6c9e7e2c..ff6d887154 100644
--- a/core-java-modules/core-java-string-operations-4/README.md
+++ b/core-java-modules/core-java-string-operations-4/README.md
@@ -6,4 +6,5 @@
- [Split a String Every n Characters in Java](https://www.baeldung.com/java-string-split-every-n-characters)
- [String equals() Vs contentEquals() in Java](https://www.baeldung.com/java-string-equals-vs-contentequals)
- [Check if a String Ends with a Certain Pattern in Java](https://www.baeldung.com/java-string-ends-pattern)
+- [Check if a Character is a Vowel in Java](https://www.baeldung.com/java-check-character-vowel)
diff --git a/core-java-modules/core-java-string-operations-4/pom.xml b/core-java-modules/core-java-string-operations-4/pom.xml
index 7f71ea8da5..0f1e377d18 100644
--- a/core-java-modules/core-java-string-operations-4/pom.xml
+++ b/core-java-modules/core-java-string-operations-4/pom.xml
@@ -30,6 +30,12 @@
commons-lang3
${apache-commons-lang3.version}
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java
new file mode 100644
index 0000000000..fd60427a4e
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/checkvowels/CheckVowels.java
@@ -0,0 +1,38 @@
+package com.baeldung.checkvowels;
+
+import java.util.regex.Pattern;
+
+public class CheckVowels {
+ private static final String VOWELS = "aeiouAEIOU";
+ private static final Pattern VOWELS_PATTERN = Pattern.compile("[aeiou]", Pattern.CASE_INSENSITIVE);
+
+ public static boolean isInVowelsString(char c) {
+ return VOWELS.indexOf(c) != -1;
+ }
+
+ public static boolean isInVowelsString(String c) {
+ return VOWELS.contains(c);
+ }
+
+ public static boolean isVowelBySwitch(char c) {
+ switch (c) {
+ case 'a':
+ case 'e':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'A':
+ case 'E':
+ case 'I':
+ case 'O':
+ case 'U':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static boolean isVowelByRegex(String c) {
+ return VOWELS_PATTERN.matcher(c).matches();
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java
new file mode 100644
index 0000000000..52b0e55692
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/checkvowels/CheckVowelsUnitTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.checkvowels;
+
+import org.junit.jupiter.api.Test;
+
+import static com.baeldung.checkvowels.CheckVowels.*;
+import static org.assertj.core.api.Assertions.*;
+
+class CheckVowelsUnitTest {
+
+ @Test
+ void givenAVowelCharacter_thenInVowelString() {
+ assertThat(isInVowelsString('e')).isTrue();
+ }
+
+ @Test
+ void givenAConsonantCharacter_thenNotInVowelString() {
+ assertThat(isInVowelsString('z')).isFalse();
+ }
+
+ @Test
+ void givenAVowelString_thenInVowelString() {
+ assertThat(isInVowelsString("e")).isTrue();
+ }
+
+ @Test
+ void givenAConsonantString_thenNotInVowelString() {
+ assertThat(isInVowelsString("z")).isFalse();
+ }
+
+ @Test
+ void givenAVowelCharacter_thenInVowelSwitch() {
+ assertThat(isVowelBySwitch('e')).isTrue();
+ }
+
+ @Test
+ void givenAConsonantCharacter_thenNotInVowelSwitch() {
+ assertThat(isVowelBySwitch('z')).isFalse();
+ }
+
+ @Test
+ void givenAVowelString_thenInVowelPattern() {
+ assertThat(isVowelByRegex("e")).isTrue();
+ assertThat(isVowelByRegex("E")).isTrue();
+ }
+
+ @Test
+ void givenAVowelCharacter_thenInVowelPattern() {
+ assertThat(isVowelByRegex(Character.toString('e'))).isTrue();
+ assertThat(isVowelByRegex("E")).isTrue();
+ }
+}
diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java
index 8e9d3afdde..90335b4aba 100644
--- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java
+++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringperformance/StringPerformance.java
@@ -125,6 +125,8 @@ public class StringPerformance {
stringSplit.add(longString.substring(pos, end));
pos = end + 1;
}
+ //Add last token of string
+ stringSplit.add(longString.substring(pos));
return stringSplit;
}
diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml
index 28519a1a68..7d851292f5 100644
--- a/core-java-modules/core-java-uuid/pom.xml
+++ b/core-java-modules/core-java-uuid/pom.xml
@@ -35,7 +35,6 @@
true
-
org.apache.maven.plugins
diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md
index a75805e0c2..087c5d356e 100644
--- a/core-java-modules/core-java/README.md
+++ b/core-java-modules/core-java/README.md
@@ -1,9 +1,11 @@
## Core Java Cookbooks and Examples
### Relevant Articles:
+
- [Getting Started with Java Properties](http://www.baeldung.com/java-properties)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac)
- [Introduction to Javadoc](http://www.baeldung.com/javadoc)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
+- [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error)
diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml
index bb19b525d0..87abe6c007 100644
--- a/core-java-modules/core-java/pom.xml
+++ b/core-java-modules/core-java/pom.xml
@@ -59,6 +59,16 @@
spring-core
${spring.core.version}
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ com.google.gdata
+ core
+ ${gdata.version}
+
@@ -183,6 +193,7 @@
1.8
1.8
4.3.20.RELEASE
+ 1.47.1
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java
new file mode 100644
index 0000000000..4a08daa271
--- /dev/null
+++ b/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.illegalcharacter;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Objects;
+
+import org.apache.commons.io.ByteOrderMark;
+import org.apache.commons.io.input.BOMInputStream;
+import org.junit.Test;
+
+import com.google.gdata.util.io.base.UnicodeReader;
+
+public class IllegalCharacterUnitTest {
+
+ final String RESOURCE_FILE_NAME = "bom-file.txt";
+ final InputStream ioStream = this.getClass()
+ .getClassLoader()
+ .getResourceAsStream(RESOURCE_FILE_NAME);
+ final String expected = "Hello world with BOM.";
+
+ @Test
+ public void whenInputFileHasBOM_thenUseInputStream() throws IOException {
+ String line;
+ String actual = "";
+
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(ioStream))) {
+ while ((line = br.readLine()) != null) {
+ actual += line;
+ }
+ }
+
+ assertNotEquals(expected, actual);
+ }
+
+ @Test
+ public void whenInputFileHasBOM_thenUseInputStreamWithReplace() throws IOException {
+ String line;
+ String actual = "";
+
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(Objects.requireNonNull(ioStream)))) {
+ while ((line = br.readLine()) != null) {
+ actual += line.replace("\uFEFF", "");
+ }
+ }
+
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void whenInputFileHasBOM_thenUseBOMInputStream() throws IOException {
+ String line;
+ String actual = "";
+
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(new BOMInputStream(ioStream, false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE)))) {
+ while ((line = br.readLine()) != null) {
+ actual += line;
+ }
+ }
+
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void whenInputFileHasBOM_thenUseGoogleGdata() throws IOException {
+ char[] actual = new char[21];
+
+ try (Reader r = new UnicodeReader(ioStream, null)) {
+ r.read(actual);
+ }
+
+ assertEquals(expected, String.valueOf(actual));
+ }
+}
diff --git a/core-java-modules/core-java/src/test/resources/bom-file.txt b/core-java-modules/core-java/src/test/resources/bom-file.txt
new file mode 100644
index 0000000000..b2037fded6
--- /dev/null
+++ b/core-java-modules/core-java/src/test/resources/bom-file.txt
@@ -0,0 +1 @@
+Hello world with BOM.
\ No newline at end of file
diff --git a/java-collections-conversions-2/README.md b/core-java-modules/java-collections-conversions-2/README.md
similarity index 100%
rename from java-collections-conversions-2/README.md
rename to core-java-modules/java-collections-conversions-2/README.md
diff --git a/java-collections-conversions-2/pom.xml b/core-java-modules/java-collections-conversions-2/pom.xml
similarity index 84%
rename from java-collections-conversions-2/pom.xml
rename to core-java-modules/java-collections-conversions-2/pom.xml
index 9f8ef7addc..510921c35e 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/core-java-modules/java-collections-conversions-2/pom.xml
@@ -9,10 +9,9 @@
jar
- com.baeldung
- parent-java
+ com.baeldung.core-java-modules
+ core-java-modules
0.0.1-SNAPSHOT
- ../parent-java
@@ -29,7 +28,7 @@
io.vavr
vavr
- 0.10.3
+ ${vavr.version}
@@ -43,4 +42,8 @@
+
+ 0.10.3
+
+
\ No newline at end of file
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/convertlisttomap/ListToMapConverter.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/MapperUtil.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/User.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserDTO.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserListDTO.java
diff --git a/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java b/core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
similarity index 100%
rename from java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
rename to core-java-modules/java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UsersListConverter.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/arrayconversion/ArrayToListConversionUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/convertlisttomap/ListToMapUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java b/core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
similarity index 100%
rename from java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
rename to core-java-modules/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
diff --git a/java-collections-conversions/README.md b/core-java-modules/java-collections-conversions/README.md
similarity index 100%
rename from java-collections-conversions/README.md
rename to core-java-modules/java-collections-conversions/README.md
diff --git a/java-collections-conversions/pom.xml b/core-java-modules/java-collections-conversions/pom.xml
similarity index 89%
rename from java-collections-conversions/pom.xml
rename to core-java-modules/java-collections-conversions/pom.xml
index 7f5ba38e3e..2751e0100a 100644
--- a/java-collections-conversions/pom.xml
+++ b/core-java-modules/java-collections-conversions/pom.xml
@@ -9,10 +9,9 @@
jar
- com.baeldung
- parent-java
+ com.baeldung.core-java-modules
+ core-java-modules
0.0.1-SNAPSHOT
- ../parent-java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/Book.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
similarity index 100%
rename from java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
rename to core-java-modules/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
diff --git a/java-collections-conversions/src/main/resources/logback.xml b/core-java-modules/java-collections-conversions/src/main/resources/logback.xml
similarity index 100%
rename from java-collections-conversions/src/main/resources/logback.xml
rename to core-java-modules/java-collections-conversions/src/main/resources/logback.xml
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertToMap/ConvertToMapUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/IterableToCollectionUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
diff --git a/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java b/core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
similarity index 100%
rename from java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
rename to core-java-modules/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
diff --git a/java-collections-maps-3/README.md b/core-java-modules/java-collections-maps-3/README.md
similarity index 100%
rename from java-collections-maps-3/README.md
rename to core-java-modules/java-collections-maps-3/README.md
diff --git a/java-collections-maps-3/pom.xml b/core-java-modules/java-collections-maps-3/pom.xml
similarity index 87%
rename from java-collections-maps-3/pom.xml
rename to core-java-modules/java-collections-maps-3/pom.xml
index 729b357b76..ab80a9e2fd 100644
--- a/java-collections-maps-3/pom.xml
+++ b/core-java-modules/java-collections-maps-3/pom.xml
@@ -9,10 +9,9 @@
jar
- com.baeldung
- parent-java
+ com.baeldung.core-java-modules
+ core-java-modules
0.0.1-SNAPSHOT
- ../parent-java
@@ -20,7 +19,7 @@
org.junit.jupiter
junit-jupiter-api
- 5.8.1
+ ${junit-jupiter.version}
org.springframework
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/bytearrays/BytesKey.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/Book.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryEfficiencyExample.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/entry/MapEntryTupleExample.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/Member.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithBadHashing.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithGuavaHashing.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithId.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithIdAndName.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/hashing/MemberWithObjects.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/identity/IdentityHashMapDemonstrator.java
diff --git a/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java b/core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java
similarity index 100%
rename from java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java
rename to core-java-modules/java-collections-maps-3/src/main/java/com/baeldung/map/invert/InvertHashMapExample.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/bytearrays/ByteArrayKeyUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/entry/MapEntryUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashMapUpdateUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/hashing/HashingUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/identity/IdentityHashMapDemonstratorUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/invert/InvertHashMapUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/EntrySetExampleUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/KeySetExampleUnitTest.java
diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java b/core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java
similarity index 100%
rename from java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java
rename to core-java-modules/java-collections-maps-3/src/test/java/com/baeldung/map/keysetValuesEntrySet/ValuesExampleUnitTest.java
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 2f684beea0..15347d0fe9 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -35,6 +35,7 @@
core-java-collections-list
core-java-collections-list-2
core-java-collections-list-3
+ core-java-collections-list-4
core-java-collections-maps
core-java-collections-maps-2
core-java-collections-maps-3
@@ -73,6 +74,7 @@
core-java-lang-2
core-java-lang-3
core-java-lang-4
+ core-java-lang-5
core-java-lang-math
core-java-lang-math-2
core-java-lang-math-3
@@ -117,6 +119,9 @@
core-java-regex
core-java-regex-2
core-java-uuid
+ java-collections-conversions
+ java-collections-conversions-2
+ java-collections-maps-3
pre-jpms
diff --git a/ddd-modules/README.md b/ddd-contexts/README.md
similarity index 100%
rename from ddd-modules/README.md
rename to ddd-contexts/README.md
diff --git a/ddd-modules/infrastructure/pom.xml b/ddd-contexts/infrastructure/pom.xml
similarity index 79%
rename from ddd-modules/infrastructure/pom.xml
rename to ddd-contexts/infrastructure/pom.xml
index 232e5ff4b4..6107991ceb 100644
--- a/ddd-modules/infrastructure/pom.xml
+++ b/ddd-contexts/infrastructure/pom.xml
@@ -3,31 +3,31 @@
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
- com.baeldung.dddmodules.infrastructure
+ com.baeldung.dddcontexts.infrastructure
infrastructure
1.0
jar
- com.baeldung.dddmodules
- ddd-modules
+ com.baeldung.dddcontexts
+ ddd-contexts
1.0
../
- com.baeldung.dddmodules.shippingcontext
+ com.baeldung.dddcontexts.shippingcontext
shippingcontext
${appmodules.version}
- com.baeldung.dddmodules.ordercontext
+ com.baeldung.dddcontexts.ordercontext
ordercontext
${appmodules.version}
- com.baeldung.dddmodules.sharedkernel
+ com.baeldung.dddcontexts.sharedkernel
sharedkernel
${appmodules.version}
diff --git a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/db/InMemoryOrderStore.java b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java
similarity index 85%
rename from ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/db/InMemoryOrderStore.java
rename to ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java
index 13deb2471e..8424afff79 100644
--- a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/db/InMemoryOrderStore.java
+++ b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java
@@ -1,10 +1,10 @@
-package com.baeldung.dddmodules.infrastructure.db;
+package com.baeldung.dddcontexts.infrastructure.db;
-import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
-import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
-import com.baeldung.dddmodules.shippingcontext.model.PackageItem;
-import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder;
-import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
+import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder;
+import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository;
+import com.baeldung.dddcontexts.shippingcontext.model.PackageItem;
+import com.baeldung.dddcontexts.shippingcontext.model.ShippableOrder;
+import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository;
import java.util.HashMap;
import java.util.List;
diff --git a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/events/SimpleEventBus.java b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java
similarity index 82%
rename from ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/events/SimpleEventBus.java
rename to ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java
index 6aea7ff6e9..1cbcf13749 100644
--- a/ddd-modules/infrastructure/src/main/java/com/baeldung/dddmodules/infrastructure/events/SimpleEventBus.java
+++ b/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java
@@ -1,8 +1,8 @@
-package com.baeldung.dddmodules.infrastructure.events;
+package com.baeldung.dddcontexts.infrastructure.events;
-import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent;
-import com.baeldung.dddmodules.sharedkernel.events.EventBus;
-import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber;
+import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent;
+import com.baeldung.dddcontexts.sharedkernel.events.EventBus;
+import com.baeldung.dddcontexts.sharedkernel.events.EventSubscriber;
import java.util.Map;
import java.util.Set;
diff --git a/ddd-contexts/infrastructure/src/main/java/module-info.java b/ddd-contexts/infrastructure/src/main/java/module-info.java
new file mode 100644
index 0000000000..1387de16c2
--- /dev/null
+++ b/ddd-contexts/infrastructure/src/main/java/module-info.java
@@ -0,0 +1,14 @@
+import com.baeldung.dddcontexts.infrastructure.db.InMemoryOrderStore;
+import com.baeldung.dddcontexts.infrastructure.events.SimpleEventBus;
+
+module com.baeldung.dddcontexts.infrastructure {
+ requires transitive com.baeldung.dddcontexts.sharedkernel;
+ requires transitive com.baeldung.dddcontexts.ordercontext;
+ requires transitive com.baeldung.dddcontexts.shippingcontext;
+ provides com.baeldung.dddcontexts.sharedkernel.events.EventBus
+ with SimpleEventBus;
+ provides com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository
+ with InMemoryOrderStore;
+ provides com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository
+ with InMemoryOrderStore;
+}
diff --git a/ddd-modules/mainapp/pom.xml b/ddd-contexts/mainapp/pom.xml
similarity index 86%
rename from ddd-modules/mainapp/pom.xml
rename to ddd-contexts/mainapp/pom.xml
index a2d3b8f3ea..8046ae4e7d 100644
--- a/ddd-modules/mainapp/pom.xml
+++ b/ddd-contexts/mainapp/pom.xml
@@ -3,21 +3,21 @@
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
- com.baeldung.dddmodules.mainapp
+ com.baeldung.dddcontexts.mainapp
mainapp
1.0
jar
- com.baeldung.dddmodules
- ddd-modules
+ com.baeldung.dddcontexts
+ ddd-contexts
1.0
../
- com.baeldung.dddmodules.infrastructure
+ com.baeldung.dddcontexts.infrastructure
infrastructure
${appmodules.version}
diff --git a/ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules/mainapp/Application.java b/ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java
similarity index 80%
rename from ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules/mainapp/Application.java
rename to ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java
index 05e27abe30..ff866e49dd 100644
--- a/ddd-modules/mainapp/src/main/java/com/baeldung/dddmodules/mainapp/Application.java
+++ b/ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java
@@ -1,12 +1,12 @@
-package com.baeldung.dddmodules.mainapp;
+package com.baeldung.dddcontexts.mainapp;
-import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
-import com.baeldung.dddmodules.ordercontext.model.OrderItem;
-import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
-import com.baeldung.dddmodules.ordercontext.service.OrderService;
-import com.baeldung.dddmodules.sharedkernel.events.EventBus;
-import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
-import com.baeldung.dddmodules.shippingcontext.service.ShippingService;
+import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder;
+import com.baeldung.dddcontexts.ordercontext.model.OrderItem;
+import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository;
+import com.baeldung.dddcontexts.ordercontext.service.OrderService;
+import com.baeldung.dddcontexts.sharedkernel.events.EventBus;
+import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository;
+import com.baeldung.dddcontexts.shippingcontext.service.ShippingService;
import java.util.*;
diff --git a/ddd-contexts/mainapp/src/main/java/module-info.java b/ddd-contexts/mainapp/src/main/java/module-info.java
new file mode 100644
index 0000000000..b71e474111
--- /dev/null
+++ b/ddd-contexts/mainapp/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module com.baeldung.dddcontexts.mainapp {
+ uses com.baeldung.dddcontexts.sharedkernel.events.EventBus;
+ uses com.baeldung.dddcontexts.ordercontext.service.OrderService;
+ uses com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository;
+ uses com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository;
+ uses com.baeldung.dddcontexts.shippingcontext.service.ShippingService;
+ requires transitive com.baeldung.dddcontexts.infrastructure;
+}
\ No newline at end of file
diff --git a/ddd-modules/ordercontext/pom.xml b/ddd-contexts/ordercontext/pom.xml
similarity index 84%
rename from ddd-modules/ordercontext/pom.xml
rename to ddd-contexts/ordercontext/pom.xml
index eaf44badd3..e29f109b71 100644
--- a/ddd-modules/ordercontext/pom.xml
+++ b/ddd-contexts/ordercontext/pom.xml
@@ -3,20 +3,20 @@
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
- com.baeldung.dddmodules.ordercontext
+ com.baeldung.dddcontexts.ordercontext
ordercontext
1.0
jar
- com.baeldung.dddmodules
- ddd-modules
+ com.baeldung.dddcontexts
+ ddd-contexts
1.0
- com.baeldung.dddmodules.sharedkernel
+ com.baeldung.dddcontexts.sharedkernel
sharedkernel
${appmodules.version}
diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/CustomerOrder.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java
similarity index 95%
rename from ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/CustomerOrder.java
rename to ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java
index ee87de56bd..8a69e8b805 100644
--- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/CustomerOrder.java
+++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.ordercontext.model;
+package com.baeldung.dddcontexts.ordercontext.model;
import java.util.List;
diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/OrderItem.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java
similarity index 95%
rename from ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/OrderItem.java
rename to ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java
index aaad0777e4..87b8fea260 100644
--- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/model/OrderItem.java
+++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.ordercontext.model;
+package com.baeldung.dddcontexts.ordercontext.model;
public class OrderItem {
private int productId;
diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java
new file mode 100644
index 0000000000..15d1e70981
--- /dev/null
+++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.dddcontexts.ordercontext.repository;
+
+import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder;
+
+public interface CustomerOrderRepository {
+ void saveCustomerOrder(CustomerOrder order);
+}
diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/CustomerOrderService.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java
similarity index 76%
rename from ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/CustomerOrderService.java
rename to ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java
index b9d26e6212..c017f36ca5 100644
--- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/CustomerOrderService.java
+++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java
@@ -1,9 +1,9 @@
-package com.baeldung.dddmodules.ordercontext.service;
+package com.baeldung.dddcontexts.ordercontext.service;
-import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
-import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
-import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent;
-import com.baeldung.dddmodules.sharedkernel.events.EventBus;
+import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder;
+import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository;
+import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent;
+import com.baeldung.dddcontexts.sharedkernel.events.EventBus;
import java.util.HashMap;
import java.util.Map;
diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java
new file mode 100644
index 0000000000..94e9dcc7fc
--- /dev/null
+++ b/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java
@@ -0,0 +1,11 @@
+package com.baeldung.dddcontexts.ordercontext.service;
+
+import com.baeldung.dddcontexts.ordercontext.model.CustomerOrder;
+import com.baeldung.dddcontexts.ordercontext.repository.CustomerOrderRepository;
+import com.baeldung.dddcontexts.sharedkernel.service.ApplicationService;
+
+public interface OrderService extends ApplicationService {
+ void placeOrder(CustomerOrder order);
+
+ void setOrderRepository(CustomerOrderRepository orderRepository);
+}
diff --git a/ddd-contexts/ordercontext/src/main/java/module-info.java b/ddd-contexts/ordercontext/src/main/java/module-info.java
new file mode 100644
index 0000000000..681565ab4d
--- /dev/null
+++ b/ddd-contexts/ordercontext/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module com.baeldung.dddcontexts.ordercontext {
+ requires com.baeldung.dddcontexts.sharedkernel;
+ exports com.baeldung.dddcontexts.ordercontext.service;
+ exports com.baeldung.dddcontexts.ordercontext.model;
+ exports com.baeldung.dddcontexts.ordercontext.repository;
+ provides com.baeldung.dddcontexts.ordercontext.service.OrderService
+ with com.baeldung.dddcontexts.ordercontext.service.CustomerOrderService;
+}
\ No newline at end of file
diff --git a/ddd-modules/pom.xml b/ddd-contexts/pom.xml
similarity index 94%
rename from ddd-modules/pom.xml
rename to ddd-contexts/pom.xml
index d2932ee515..1a764a65b9 100644
--- a/ddd-modules/pom.xml
+++ b/ddd-contexts/pom.xml
@@ -3,10 +3,10 @@
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
- com.baeldung.dddmodules
- ddd-modules
+ com.baeldung.dddcontexts
+ ddd-contexts
1.0
- ddd-modules
+ ddd-contexts
pom
diff --git a/ddd-modules/sharedkernel/pom.xml b/ddd-contexts/sharedkernel/pom.xml
similarity index 85%
rename from ddd-modules/sharedkernel/pom.xml
rename to ddd-contexts/sharedkernel/pom.xml
index 3966e1c26e..5d31973c92 100644
--- a/ddd-modules/sharedkernel/pom.xml
+++ b/ddd-contexts/sharedkernel/pom.xml
@@ -3,14 +3,14 @@
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
- com.baeldung.dddmodules.sharedkernel
+ com.baeldung.dddcontexts.sharedkernel
sharedkernel
1.0
jar
- com.baeldung.dddmodules
- ddd-modules
+ com.baeldung.dddcontexts
+ ddd-contexts
1.0
diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/ApplicationEvent.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java
similarity index 88%
rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/ApplicationEvent.java
rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java
index e3c3ebaf0e..7db89e36e0 100644
--- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/ApplicationEvent.java
+++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.sharedkernel.events;
+package com.baeldung.dddcontexts.sharedkernel.events;
import java.util.Map;
diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventBus.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java
similarity index 83%
rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventBus.java
rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java
index b128b959e9..be95de674d 100644
--- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventBus.java
+++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.sharedkernel.events;
+package com.baeldung.dddcontexts.sharedkernel.events;
public interface EventBus {
void publish(E event);
diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventSubscriber.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java
similarity index 63%
rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventSubscriber.java
rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java
index 0d6d48cc33..f941514024 100644
--- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/events/EventSubscriber.java
+++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.sharedkernel.events;
+package com.baeldung.dddcontexts.sharedkernel.events;
public interface EventSubscriber {
void onEvent(E event);
diff --git a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/service/ApplicationService.java b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java
similarity index 76%
rename from ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/service/ApplicationService.java
rename to ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java
index 5ef57ae269..a9f4488d90 100644
--- a/ddd-modules/sharedkernel/src/main/java/com/baeldung/dddmodules/sharedkernel/service/ApplicationService.java
+++ b/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java
@@ -1,8 +1,8 @@
-package com.baeldung.dddmodules.sharedkernel.service;
+package com.baeldung.dddcontexts.sharedkernel.service;
-import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent;
-import com.baeldung.dddmodules.sharedkernel.events.EventBus;
-import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber;
+import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent;
+import com.baeldung.dddcontexts.sharedkernel.events.EventBus;
+import com.baeldung.dddcontexts.sharedkernel.events.EventSubscriber;
public interface ApplicationService {
diff --git a/ddd-contexts/sharedkernel/src/main/java/module-info.java b/ddd-contexts/sharedkernel/src/main/java/module-info.java
new file mode 100644
index 0000000000..f093924aed
--- /dev/null
+++ b/ddd-contexts/sharedkernel/src/main/java/module-info.java
@@ -0,0 +1,4 @@
+module com.baeldung.dddcontexts.sharedkernel {
+ exports com.baeldung.dddcontexts.sharedkernel.events;
+ exports com.baeldung.dddcontexts.sharedkernel.service;
+}
diff --git a/ddd-modules/shippingcontext/pom.xml b/ddd-contexts/shippingcontext/pom.xml
similarity index 82%
rename from ddd-modules/shippingcontext/pom.xml
rename to ddd-contexts/shippingcontext/pom.xml
index a6e6167b69..2fb9e83645 100644
--- a/ddd-modules/shippingcontext/pom.xml
+++ b/ddd-contexts/shippingcontext/pom.xml
@@ -3,20 +3,20 @@
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
- com.baeldung.dddmodules.shippingcontext
+ com.baeldung.dddcontexts.shippingcontext
shippingcontext
1.0
jar
- com.baeldung.dddmodules
- ddd-modules
+ com.baeldung.dddcontexts
+ ddd-contexts
1.0
- com.baeldung.dddmodules.sharedkernel
+ com.baeldung.dddcontexts.sharedkernel
sharedkernel
${appmodules.version}
diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/PackageItem.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java
similarity index 93%
rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/PackageItem.java
rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java
index ed09a0f2a2..0e4da42cec 100644
--- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/PackageItem.java
+++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.shippingcontext.model;
+package com.baeldung.dddcontexts.shippingcontext.model;
public class PackageItem {
private int productId;
diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/Parcel.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java
similarity index 95%
rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/Parcel.java
rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java
index 70c4f06ac6..ee24818fb0 100644
--- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/Parcel.java
+++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.shippingcontext.model;
+package com.baeldung.dddcontexts.shippingcontext.model;
import java.util.List;
diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/ShippableOrder.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java
similarity index 93%
rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/ShippableOrder.java
rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java
index afeea2f472..97daaf681e 100644
--- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/model/ShippableOrder.java
+++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java
@@ -1,4 +1,4 @@
-package com.baeldung.dddmodules.shippingcontext.model;
+package com.baeldung.dddcontexts.shippingcontext.model;
import java.util.List;
diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/repository/ShippingOrderRepository.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java
similarity index 51%
rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/repository/ShippingOrderRepository.java
rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java
index b1a643f989..ba01d8e39c 100644
--- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/repository/ShippingOrderRepository.java
+++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java
@@ -1,6 +1,6 @@
-package com.baeldung.dddmodules.shippingcontext.repository;
+package com.baeldung.dddcontexts.shippingcontext.repository;
-import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder;
+import com.baeldung.dddcontexts.shippingcontext.model.ShippableOrder;
import java.util.Optional;
diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ParcelShippingService.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java
similarity index 78%
rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ParcelShippingService.java
rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java
index 05f261612e..70c0970e8b 100644
--- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ParcelShippingService.java
+++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java
@@ -1,11 +1,11 @@
-package com.baeldung.dddmodules.shippingcontext.service;
+package com.baeldung.dddcontexts.shippingcontext.service;
-import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent;
-import com.baeldung.dddmodules.sharedkernel.events.EventBus;
-import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber;
-import com.baeldung.dddmodules.shippingcontext.model.Parcel;
-import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder;
-import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
+import com.baeldung.dddcontexts.sharedkernel.events.ApplicationEvent;
+import com.baeldung.dddcontexts.sharedkernel.events.EventBus;
+import com.baeldung.dddcontexts.sharedkernel.events.EventSubscriber;
+import com.baeldung.dddcontexts.shippingcontext.model.Parcel;
+import com.baeldung.dddcontexts.shippingcontext.model.ShippableOrder;
+import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository;
import java.util.HashMap;
import java.util.Map;
diff --git a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ShippingService.java b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java
similarity index 50%
rename from ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ShippingService.java
rename to ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java
index a2f0095c43..b78a0f9fb2 100644
--- a/ddd-modules/shippingcontext/src/main/java/com/baeldung/dddmodules/shippingcontext/service/ShippingService.java
+++ b/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java
@@ -1,8 +1,8 @@
-package com.baeldung.dddmodules.shippingcontext.service;
+package com.baeldung.dddcontexts.shippingcontext.service;
-import com.baeldung.dddmodules.sharedkernel.service.ApplicationService;
-import com.baeldung.dddmodules.shippingcontext.model.Parcel;
-import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
+import com.baeldung.dddcontexts.sharedkernel.service.ApplicationService;
+import com.baeldung.dddcontexts.shippingcontext.model.Parcel;
+import com.baeldung.dddcontexts.shippingcontext.repository.ShippingOrderRepository;
import java.util.Optional;
diff --git a/ddd-contexts/shippingcontext/src/main/java/module-info.java b/ddd-contexts/shippingcontext/src/main/java/module-info.java
new file mode 100644
index 0000000000..c53cbedf8a
--- /dev/null
+++ b/ddd-contexts/shippingcontext/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module com.baeldung.dddcontexts.shippingcontext {
+ requires com.baeldung.dddcontexts.sharedkernel;
+ exports com.baeldung.dddcontexts.shippingcontext.service;
+ exports com.baeldung.dddcontexts.shippingcontext.model;
+ exports com.baeldung.dddcontexts.shippingcontext.repository;
+ provides com.baeldung.dddcontexts.shippingcontext.service.ShippingService
+ with com.baeldung.dddcontexts.shippingcontext.service.ParcelShippingService;
+}
diff --git a/ddd-modules/infrastructure/src/main/java/module-info.java b/ddd-modules/infrastructure/src/main/java/module-info.java
deleted file mode 100644
index 19f7b36548..0000000000
--- a/ddd-modules/infrastructure/src/main/java/module-info.java
+++ /dev/null
@@ -1,11 +0,0 @@
-module com.baeldung.dddmodules.infrastructure {
- requires transitive com.baeldung.dddmodules.sharedkernel;
- requires transitive com.baeldung.dddmodules.ordercontext;
- requires transitive com.baeldung.dddmodules.shippingcontext;
- provides com.baeldung.dddmodules.sharedkernel.events.EventBus
- with com.baeldung.dddmodules.infrastructure.events.SimpleEventBus;
- provides com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository
- with com.baeldung.dddmodules.infrastructure.db.InMemoryOrderStore;
- provides com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository
- with com.baeldung.dddmodules.infrastructure.db.InMemoryOrderStore;
-}
diff --git a/ddd-modules/mainapp/src/main/java/module-info.java b/ddd-modules/mainapp/src/main/java/module-info.java
deleted file mode 100644
index 356b03731c..0000000000
--- a/ddd-modules/mainapp/src/main/java/module-info.java
+++ /dev/null
@@ -1,8 +0,0 @@
-module com.baeldung.dddmodules.mainapp {
- uses com.baeldung.dddmodules.sharedkernel.events.EventBus;
- uses com.baeldung.dddmodules.ordercontext.service.OrderService;
- uses com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
- uses com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
- uses com.baeldung.dddmodules.shippingcontext.service.ShippingService;
- requires transitive com.baeldung.dddmodules.infrastructure;
-}
\ No newline at end of file
diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java b/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java
deleted file mode 100644
index 771bbf3301..0000000000
--- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/repository/CustomerOrderRepository.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.dddmodules.ordercontext.repository;
-
-import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
-
-public interface CustomerOrderRepository {
- void saveCustomerOrder(CustomerOrder order);
-}
diff --git a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java b/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java
deleted file mode 100644
index 1bbb8b8398..0000000000
--- a/ddd-modules/ordercontext/src/main/java/com/baeldung/dddmodules/ordercontext/service/OrderService.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.baeldung.dddmodules.ordercontext.service;
-
-import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
-import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
-import com.baeldung.dddmodules.sharedkernel.service.ApplicationService;
-
-public interface OrderService extends ApplicationService {
- void placeOrder(CustomerOrder order);
-
- void setOrderRepository(CustomerOrderRepository orderRepository);
-}
diff --git a/ddd-modules/ordercontext/src/main/java/module-info.java b/ddd-modules/ordercontext/src/main/java/module-info.java
deleted file mode 100644
index e9b7cf9535..0000000000
--- a/ddd-modules/ordercontext/src/main/java/module-info.java
+++ /dev/null
@@ -1,8 +0,0 @@
-module com.baeldung.dddmodules.ordercontext {
- requires com.baeldung.dddmodules.sharedkernel;
- exports com.baeldung.dddmodules.ordercontext.service;
- exports com.baeldung.dddmodules.ordercontext.model;
- exports com.baeldung.dddmodules.ordercontext.repository;
- provides com.baeldung.dddmodules.ordercontext.service.OrderService
- with com.baeldung.dddmodules.ordercontext.service.CustomerOrderService;
-}
\ No newline at end of file
diff --git a/ddd-modules/sharedkernel/src/main/java/module-info.java b/ddd-modules/sharedkernel/src/main/java/module-info.java
deleted file mode 100644
index aeb64f52c9..0000000000
--- a/ddd-modules/sharedkernel/src/main/java/module-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-module com.baeldung.dddmodules.sharedkernel {
- exports com.baeldung.dddmodules.sharedkernel.events;
- exports com.baeldung.dddmodules.sharedkernel.service;
-}
diff --git a/ddd-modules/shippingcontext/src/main/java/module-info.java b/ddd-modules/shippingcontext/src/main/java/module-info.java
deleted file mode 100644
index a5ec1ca435..0000000000
--- a/ddd-modules/shippingcontext/src/main/java/module-info.java
+++ /dev/null
@@ -1,8 +0,0 @@
-module com.baeldung.dddmodules.shippingcontext {
- requires com.baeldung.dddmodules.sharedkernel;
- exports com.baeldung.dddmodules.shippingcontext.service;
- exports com.baeldung.dddmodules.shippingcontext.model;
- exports com.baeldung.dddmodules.shippingcontext.repository;
- provides com.baeldung.dddmodules.shippingcontext.service.ShippingService
- with com.baeldung.dddmodules.shippingcontext.service.ParcelShippingService;
-}
diff --git a/docker/docker-caching/multi-module-caching/core/pom.xml b/docker/docker-caching/multi-module-caching/core/pom.xml
index eeeb5a6e5b..bcfc4b5783 100644
--- a/docker/docker-caching/multi-module-caching/core/pom.xml
+++ b/docker/docker-caching/multi-module-caching/core/pom.xml
@@ -1,7 +1,7 @@
+ 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
core
@@ -22,4 +22,5 @@
8
8
+
\ No newline at end of file
diff --git a/docker/docker-caching/multi-module-caching/pom.xml b/docker/docker-caching/multi-module-caching/pom.xml
index 7968114385..7e279dc334 100644
--- a/docker/docker-caching/multi-module-caching/pom.xml
+++ b/docker/docker-caching/multi-module-caching/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung
multi-module-caching
@@ -8,22 +9,24 @@
Multi-module Maven caching example
pom
+
+ runner
+ core
+
+
com.google.guava
guava
- 31.0.1-jre
+ ${guava.version}
1.8
+ 31.0.1-jre
-
- runner
- core
-
-
+
\ No newline at end of file
diff --git a/docker/docker-caching/multi-module-caching/runner/pom.xml b/docker/docker-caching/multi-module-caching/runner/pom.xml
index e3654bff17..e3f234bac0 100644
--- a/docker/docker-caching/multi-module-caching/runner/pom.xml
+++ b/docker/docker-caching/multi-module-caching/runner/pom.xml
@@ -1,7 +1,7 @@
+ 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
runner
@@ -53,4 +53,5 @@
8
8
+
\ No newline at end of file
diff --git a/docker/docker-caching/single-module-caching/pom.xml b/docker/docker-caching/single-module-caching/pom.xml
index 386b040138..d7f96e1e7e 100644
--- a/docker/docker-caching/single-module-caching/pom.xml
+++ b/docker/docker-caching/single-module-caching/pom.xml
@@ -1,9 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung
single-module-caching
1.0-SNAPSHOT
@@ -12,7 +11,7 @@
com.google.guava
guava
- 31.0.1-jre
+ ${guava.version}
@@ -49,5 +48,7 @@
8
8
+ 31.0.1-jre
+
\ No newline at end of file
diff --git a/docker/docker-internal-dto/pom.xml b/docker/docker-internal-dto/pom.xml
index 55cef257fe..09013d2fc3 100644
--- a/docker/docker-internal-dto/pom.xml
+++ b/docker/docker-internal-dto/pom.xml
@@ -3,13 +3,13 @@
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
+ docker-internal-dto
+ docker-internal-dto
+
com.baeldung.docker
docker
0.0.1
- docker-internal-dto
- docker-internal-dto
-
diff --git a/docker/docker-push-to-private-repo/.gitignore b/docker/docker-push-to-private-repo/.gitignore
new file mode 100644
index 0000000000..549e00a2a9
--- /dev/null
+++ b/docker/docker-push-to-private-repo/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/docker/docker-push-to-private-repo/Dockerfile b/docker/docker-push-to-private-repo/Dockerfile
new file mode 100644
index 0000000000..42a13e2a93
--- /dev/null
+++ b/docker/docker-push-to-private-repo/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:11
+ARG JAR_FILE=target/*.jar
+COPY ${JAR_FILE} app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
\ No newline at end of file
diff --git a/docker/docker-push-to-private-repo/README.md b/docker/docker-push-to-private-repo/README.md
new file mode 100644
index 0000000000..61fe00e016
--- /dev/null
+++ b/docker/docker-push-to-private-repo/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Pushing a Docker Image to a Private Repository](https://www.baeldung.com/ops/docker-push-image-to-private-repository)
diff --git a/docker/docker-push-to-private-repo/pom.xml b/docker/docker-push-to-private-repo/pom.xml
new file mode 100644
index 0000000000..19be098794
--- /dev/null
+++ b/docker/docker-push-to-private-repo/pom.xml
@@ -0,0 +1,47 @@
+
+
+ 4.0.0
+ docker-push-to-private-repo
+ 0.0.1-SNAPSHOT
+ docker-push-to-private-repo
+ Example application to showcase how to push a docker image to a private repository
+
+
+ com.baeldung.docker
+ docker
+ 0.0.1
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+ 11
+
+
+
\ No newline at end of file
diff --git a/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java
new file mode 100644
index 0000000000..58486c3086
--- /dev/null
+++ b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/HelloWorldController.java
@@ -0,0 +1,12 @@
+package com.baeldung.docker.push;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloWorldController {
+ @GetMapping("/helloworld")
+ String helloWorld() {
+ return "Hello World!";
+ }
+}
\ No newline at end of file
diff --git a/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java
new file mode 100644
index 0000000000..7f516b3158
--- /dev/null
+++ b/docker/docker-push-to-private-repo/src/main/java/com/baeldung/docker/push/PushToPrivateRepoApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.push;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class PushToPrivateRepoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PushToPrivateRepoApplication.class, args);
+ }
+
+}
diff --git a/docker/docker-push-to-private-repo/src/main/resources/application.properties b/docker/docker-push-to-private-repo/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/docker/docker-push-to-private-repo/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/docker/docker-sample-app/pom.xml b/docker/docker-sample-app/pom.xml
index 6841fabcee..24fede56fd 100644
--- a/docker/docker-sample-app/pom.xml
+++ b/docker/docker-sample-app/pom.xml
@@ -1,21 +1,18 @@
-
+
4.0.0
+ docker-sample-app
+ docker-sample-app
+ Demo project for Spring Boot and Docker
+
com.baeldung.docker
docker
0.0.1
- docker-sample-app
- docker-sample-app
- Demo project for Spring Boot and Docker
-
-
- 11
-
-
org.springframework.boot
@@ -42,4 +39,8 @@
-
+
+ 11
+
+
+
\ No newline at end of file
diff --git a/docker/docker-spring-boot-postgres/pom.xml b/docker/docker-spring-boot-postgres/pom.xml
index d08ae130db..7a4ed1db3c 100644
--- a/docker/docker-spring-boot-postgres/pom.xml
+++ b/docker/docker-spring-boot-postgres/pom.xml
@@ -1,13 +1,14 @@
-
- 4.0.0
- com.baeldung.docker
- docker-spring-boot-postgres
- 0.0.1-SNAPSHOT
- docker-spring-boot-postgres
- Demo project showing Spring Boot, PostgreSQL, and Docker
-
+
+ 4.0.0
+ com.baeldung.docker
+ docker-spring-boot-postgres
+ 0.0.1-SNAPSHOT
+ docker-spring-boot-postgres
+ Demo project showing Spring Boot, PostgreSQL, and Docker
+
com.baeldung
parent-boot-2
@@ -15,33 +16,32 @@
../../parent-boot-2
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
-
- org.postgresql
- postgresql
- runtime
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
11
diff --git a/docker/docker-spring-boot/README.md b/docker/docker-spring-boot/README.md
index 4af9378290..0fc9d2b6b5 100644
--- a/docker/docker-spring-boot/README.md
+++ b/docker/docker-spring-boot/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [Creating Docker Images with Spring Boot](https://www.baeldung.com/spring-boot-docker-images)
+- [Starting Spring Boot Application in Docker With Profile](https://www.baeldung.com/spring-boot-docker-start-with-profile)
diff --git a/docker/docker-spring-boot/mvnw b/docker/docker-spring-boot/mvnw
deleted file mode 100755
index a16b5431b4..0000000000
--- a/docker/docker-spring-boot/mvnw
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-# Maven Start Up Batch script
-#
-# Required ENV vars:
-# ------------------
-# JAVA_HOME - location of a JDK home dir
-#
-# Optional ENV vars
-# -----------------
-# M2_HOME - location of maven2's installed home dir
-# MAVEN_OPTS - parameters passed to the Java VM when running Maven
-# e.g. to debug Maven itself, use
-# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-# ----------------------------------------------------------------------------
-
-if [ -z "$MAVEN_SKIP_RC" ] ; then
-
- if [ -f /etc/mavenrc ] ; then
- . /etc/mavenrc
- fi
-
- if [ -f "$HOME/.mavenrc" ] ; then
- . "$HOME/.mavenrc"
- fi
-
-fi
-
-# OS specific support. $var _must_ be set to either true or false.
-cygwin=false;
-darwin=false;
-mingw=false
-case "`uname`" in
- CYGWIN*) cygwin=true ;;
- MINGW*) mingw=true;;
- Darwin*) darwin=true
- # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
- # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
- if [ -z "$JAVA_HOME" ]; then
- if [ -x "/usr/libexec/java_home" ]; then
- export JAVA_HOME="`/usr/libexec/java_home`"
- else
- export JAVA_HOME="/Library/Java/Home"
- fi
- fi
- ;;
-esac
-
-if [ -z "$JAVA_HOME" ] ; then
- if [ -r /etc/gentoo-release ] ; then
- JAVA_HOME=`java-config --jre-home`
- fi
-fi
-
-if [ -z "$M2_HOME" ] ; then
- ## resolve links - $0 may be a link to maven's home
- PRG="$0"
-
- # need this for relative symlinks
- while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG="`dirname "$PRG"`/$link"
- fi
- done
-
- saveddir=`pwd`
-
- M2_HOME=`dirname "$PRG"`/..
-
- # make it fully qualified
- M2_HOME=`cd "$M2_HOME" && pwd`
-
- cd "$saveddir"
- # echo Using m2 at $M2_HOME
-fi
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched
-if $cygwin ; then
- [ -n "$M2_HOME" ] &&
- M2_HOME=`cygpath --unix "$M2_HOME"`
- [ -n "$JAVA_HOME" ] &&
- JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
- [ -n "$CLASSPATH" ] &&
- CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
-fi
-
-# For Mingw, ensure paths are in UNIX format before anything is touched
-if $mingw ; then
- [ -n "$M2_HOME" ] &&
- M2_HOME="`(cd "$M2_HOME"; pwd)`"
- [ -n "$JAVA_HOME" ] &&
- JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
-fi
-
-if [ -z "$JAVA_HOME" ]; then
- javaExecutable="`which javac`"
- if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
- # readlink(1) is not available as standard on Solaris 10.
- readLink=`which readlink`
- if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
- if $darwin ; then
- javaHome="`dirname \"$javaExecutable\"`"
- javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
- else
- javaExecutable="`readlink -f \"$javaExecutable\"`"
- fi
- javaHome="`dirname \"$javaExecutable\"`"
- javaHome=`expr "$javaHome" : '\(.*\)/bin'`
- JAVA_HOME="$javaHome"
- export JAVA_HOME
- fi
- fi
-fi
-
-if [ -z "$JAVACMD" ] ; then
- if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- else
- JAVACMD="`which java`"
- fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
- echo "Error: JAVA_HOME is not defined correctly." >&2
- echo " We cannot execute $JAVACMD" >&2
- exit 1
-fi
-
-if [ -z "$JAVA_HOME" ] ; then
- echo "Warning: JAVA_HOME environment variable is not set."
-fi
-
-CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
-
-# traverses directory structure from process work directory to filesystem root
-# first directory with .mvn subdirectory is considered project base directory
-find_maven_basedir() {
-
- if [ -z "$1" ]
- then
- echo "Path not specified to find_maven_basedir"
- return 1
- fi
-
- basedir="$1"
- wdir="$1"
- while [ "$wdir" != '/' ] ; do
- if [ -d "$wdir"/.mvn ] ; then
- basedir=$wdir
- break
- fi
- # workaround for JBEAP-8937 (on Solaris 10/Sparc)
- if [ -d "${wdir}" ]; then
- wdir=`cd "$wdir/.."; pwd`
- fi
- # end of workaround
- done
- echo "${basedir}"
-}
-
-# concatenates all lines of a file
-concat_lines() {
- if [ -f "$1" ]; then
- echo "$(tr -s '\n' ' ' < "$1")"
- fi
-}
-
-BASE_DIR=`find_maven_basedir "$(pwd)"`
-if [ -z "$BASE_DIR" ]; then
- exit 1;
-fi
-
-##########################################################################################
-# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
-# This allows using the maven wrapper in projects that prohibit checking in binary data.
-##########################################################################################
-if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
- if [ "$MVNW_VERBOSE" = true ]; then
- echo "Found .mvn/wrapper/maven-wrapper.jar"
- fi
-else
- if [ "$MVNW_VERBOSE" = true ]; then
- echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
- fi
- if [ -n "$MVNW_REPOURL" ]; then
- jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
- else
- jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
- fi
- while IFS="=" read key value; do
- case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
- esac
- done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
- if [ "$MVNW_VERBOSE" = true ]; then
- echo "Downloading from: $jarUrl"
- fi
- wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
- if $cygwin; then
- wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
- fi
-
- if command -v wget > /dev/null; then
- if [ "$MVNW_VERBOSE" = true ]; then
- echo "Found wget ... using wget"
- fi
- if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
- wget "$jarUrl" -O "$wrapperJarPath"
- else
- wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
- fi
- elif command -v curl > /dev/null; then
- if [ "$MVNW_VERBOSE" = true ]; then
- echo "Found curl ... using curl"
- fi
- if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
- curl -o "$wrapperJarPath" "$jarUrl" -f
- else
- curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
- fi
-
- else
- if [ "$MVNW_VERBOSE" = true ]; then
- echo "Falling back to using Java to download"
- fi
- javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
- # For Cygwin, switch paths to Windows format before running javac
- if $cygwin; then
- javaClass=`cygpath --path --windows "$javaClass"`
- fi
- if [ -e "$javaClass" ]; then
- if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
- if [ "$MVNW_VERBOSE" = true ]; then
- echo " - Compiling MavenWrapperDownloader.java ..."
- fi
- # Compiling the Java class
- ("$JAVA_HOME/bin/javac" "$javaClass")
- fi
- if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
- # Running the downloader
- if [ "$MVNW_VERBOSE" = true ]; then
- echo " - Running MavenWrapperDownloader.java ..."
- fi
- ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
- fi
- fi
- fi
-fi
-##########################################################################################
-# End of extension
-##########################################################################################
-
-export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
-if [ "$MVNW_VERBOSE" = true ]; then
- echo $MAVEN_PROJECTBASEDIR
-fi
-MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin; then
- [ -n "$M2_HOME" ] &&
- M2_HOME=`cygpath --path --windows "$M2_HOME"`
- [ -n "$JAVA_HOME" ] &&
- JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
- [ -n "$CLASSPATH" ] &&
- CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
- [ -n "$MAVEN_PROJECTBASEDIR" ] &&
- MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
-fi
-
-# Provide a "standardized" way to retrieve the CLI args that will
-# work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
-export MAVEN_CMD_LINE_ARGS
-
-WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-exec "$JAVACMD" \
- $MAVEN_OPTS \
- -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
- "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
- ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/docker/docker-spring-boot/mvnw.cmd b/docker/docker-spring-boot/mvnw.cmd
deleted file mode 100644
index c8d43372c9..0000000000
--- a/docker/docker-spring-boot/mvnw.cmd
+++ /dev/null
@@ -1,182 +0,0 @@
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements. See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership. The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License. You may obtain a copy of the License at
-@REM
-@REM https://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied. See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Maven Start Up Batch script
-@REM
-@REM Required ENV vars:
-@REM JAVA_HOME - location of a JDK home dir
-@REM
-@REM Optional ENV vars
-@REM M2_HOME - location of maven2's installed home dir
-@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
-@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
-@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
-@REM e.g. to debug Maven itself, use
-@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-@REM ----------------------------------------------------------------------------
-
-@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
-@echo off
-@REM set title of command window
-title %0
-@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
-@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
-
-@REM set %HOME% to equivalent of $HOME
-if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
-
-@REM Execute a user defined script before this one
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
-@REM check for pre script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
-if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
-:skipRcPre
-
-@setlocal
-
-set ERROR_CODE=0
-
-@REM To isolate internal variables from possible post scripts, we use another setlocal
-@setlocal
-
-@REM ==== START VALIDATION ====
-if not "%JAVA_HOME%" == "" goto OkJHome
-
-echo.
-echo Error: JAVA_HOME not found in your environment. >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-:OkJHome
-if exist "%JAVA_HOME%\bin\java.exe" goto init
-
-echo.
-echo Error: JAVA_HOME is set to an invalid directory. >&2
-echo JAVA_HOME = "%JAVA_HOME%" >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-@REM ==== END VALIDATION ====
-
-:init
-
-@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
-@REM Fallback to current working directory if not found.
-
-set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
-IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
-
-set EXEC_DIR=%CD%
-set WDIR=%EXEC_DIR%
-:findBaseDir
-IF EXIST "%WDIR%"\.mvn goto baseDirFound
-cd ..
-IF "%WDIR%"=="%CD%" goto baseDirNotFound
-set WDIR=%CD%
-goto findBaseDir
-
-:baseDirFound
-set MAVEN_PROJECTBASEDIR=%WDIR%
-cd "%EXEC_DIR%"
-goto endDetectBaseDir
-
-:baseDirNotFound
-set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
-cd "%EXEC_DIR%"
-
-:endDetectBaseDir
-
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
-
-@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
-@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
-
-:endReadAdditionalConfig
-
-SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
-set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
-set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
-
-FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
- IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
-)
-
-@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
-@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
-if exist %WRAPPER_JAR% (
- if "%MVNW_VERBOSE%" == "true" (
- echo Found %WRAPPER_JAR%
- )
-) else (
- if not "%MVNW_REPOURL%" == "" (
- SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
- )
- if "%MVNW_VERBOSE%" == "true" (
- echo Couldn't find %WRAPPER_JAR%, downloading it ...
- echo Downloading from: %DOWNLOAD_URL%
- )
-
- powershell -Command "&{"^
- "$webclient = new-object System.Net.WebClient;"^
- "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
- "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
- "}"^
- "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
- "}"
- if "%MVNW_VERBOSE%" == "true" (
- echo Finished downloading %WRAPPER_JAR%
- )
-)
-@REM End of extension
-
-@REM Provide a "standardized" way to retrieve the CLI args that will
-@REM work with both Windows and non-Windows executions.
-set MAVEN_CMD_LINE_ARGS=%*
-
-%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
-if ERRORLEVEL 1 goto error
-goto end
-
-:error
-set ERROR_CODE=1
-
-:end
-@endlocal & set ERROR_CODE=%ERROR_CODE%
-
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
-@REM check for post script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
-if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
-:skipRcPost
-
-@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
-if "%MAVEN_BATCH_PAUSE%" == "on" pause
-
-if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
-
-exit /B %ERROR_CODE%
diff --git a/docker/docker-spring-boot/pom.xml b/docker/docker-spring-boot/pom.xml
index 74bd1561cf..69d25e374b 100644
--- a/docker/docker-spring-boot/pom.xml
+++ b/docker/docker-spring-boot/pom.xml
@@ -3,33 +3,21 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ docker-spring-boot
+ docker-spring-boot
+ Demo project showing Spring Boot and Docker
+
com.baeldung.docker
docker
0.0.1
- docker-spring-boot
-
- docker-spring-boot
- Demo project showing Spring Boot and Docker
-
-
- 11
-
-
org.springframework.boot
spring-boot-starter-web
-
-
- com.baeldung.docker
- docker-internal-dto
- 0.0.1
-
-
org.springframework.boot
spring-boot-starter-test
@@ -54,8 +42,19 @@
${project.basedir}/src/layers.xml
+
+
+
+ repackage
+
+
+
-
+
+ 11
+
+
+
\ No newline at end of file
diff --git a/docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile b/docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile
new file mode 100644
index 0000000000..f06f08cff6
--- /dev/null
+++ b/docker/docker-spring-boot/src/main/docker/springprofile/Dockerfile
@@ -0,0 +1,11 @@
+# To build and run docker-with-spring-profile:
+#
+# docker build -f src/main/docker/springprofile/Dockerfile --tag=docker-with-spring-profile:latest .
+# docker run docker-with-spring-profile:latest
+#
+# To run with profiles:
+# docker run -e "SPRING_PROFILES_ACTIVE=test1,test2,test3" docker-with-spring-profile:latest
+
+FROM openjdk:11
+COPY target/*.jar app.jar
+ENTRYPOINT ["java", "-jar", "/app.jar"]
diff --git a/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml
new file mode 100644
index 0000000000..1892a38ae6
--- /dev/null
+++ b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-prod.yml
@@ -0,0 +1,6 @@
+version: "3.5"
+services:
+ docker-with-spring-profile:
+ image: docker-with-spring-profile:latest
+ environment:
+ - "SPRING_PROFILES_ACTIVE=prod"
diff --git a/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml
new file mode 100644
index 0000000000..780ebcb63f
--- /dev/null
+++ b/docker/docker-spring-boot/src/main/docker/springprofile/docker-compose-test.yml
@@ -0,0 +1,6 @@
+version: "3.5"
+services:
+ docker-with-spring-profile:
+ image: docker-with-spring-profile:latest
+ environment:
+ - "SPRING_PROFILES_ACTIVE=test"
diff --git a/docker/heap-sizing/pom.xml b/docker/heap-sizing/pom.xml
index 2cc354f6cf..32c200c1c0 100644
--- a/docker/heap-sizing/pom.xml
+++ b/docker/heap-sizing/pom.xml
@@ -48,7 +48,6 @@
com.google.cloud.tools
jib-maven-plugin
2.7.1
-
heapsizing-demo-jib
@@ -62,4 +61,4 @@
11
-
+
\ No newline at end of file
diff --git a/docker/pom.xml b/docker/pom.xml
index 5c6267c6dd..f46ceac963 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -3,14 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.docker
docker
0.0.1
docker
Demo project showing Spring Boot and Docker
pom
-
+
com.baeldung
parent-boot-2
@@ -18,16 +17,17 @@
../parent-boot-2
-
- 11
-
-
docker-internal-dto
docker-spring-boot
docker-sample-app
docker-caching/single-module-caching
docker-caching/multi-module-caching
+ docker-push-to-private-repo
-
+
+ 11
+
+
+
\ No newline at end of file
diff --git a/feign/pom.xml b/feign/pom.xml
index 026afdfc7a..8fa864fa46 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -1,5 +1,7 @@
-
+
4.0.0
com.baeldung.feign
feign
@@ -69,6 +71,7 @@
test
+
@@ -92,10 +95,8 @@
src/main/resources/users.xsd
-
-
org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
@@ -111,7 +112,6 @@
*.xsd
-
com.baeldung.feign.soap
target/generated-sources/jaxb
@@ -119,6 +119,6 @@
-
+
\ No newline at end of file
diff --git a/feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java b/feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java
new file mode 100644
index 0000000000..70a574ed81
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/clients/builder/BookFeignClientBuilder.java
@@ -0,0 +1,34 @@
+package com.baeldung.feign.clients.builder;
+
+import com.baeldung.feign.header.authorisation.ApiAuthorisationService;
+import com.baeldung.feign.header.interceptor.AuthRequestInterceptor;
+
+
+import feign.Feign;
+import feign.Logger;
+import feign.gson.GsonDecoder;
+import feign.gson.GsonEncoder;
+import feign.slf4j.Slf4jLogger;
+
+
+public class BookFeignClientBuilder {
+
+ public static T createClient(Class type, String uri) {
+ return Feign.builder()
+ .encoder(new GsonEncoder())
+ .decoder(new GsonDecoder())
+ .logger(new Slf4jLogger(type))
+ .logLevel(Logger.Level.HEADERS)
+ .target(type, uri);
+ }
+
+ public static T createClientWithInterceptor(Class type, String uri) {
+ return Feign.builder()
+ .requestInterceptor(new AuthRequestInterceptor(new ApiAuthorisationService()))
+ .encoder(new GsonEncoder())
+ .decoder(new GsonDecoder())
+ .logger(new Slf4jLogger(type))
+ .logLevel(Logger.Level.HEADERS)
+ .target(type, uri);
+ }
+}
diff --git a/feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java b/feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java
new file mode 100644
index 0000000000..2148a90120
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/clients/header/dynamicheader/BookClient.java
@@ -0,0 +1,17 @@
+package com.baeldung.feign.clients.header.dynamicheader;
+
+import com.baeldung.feign.models.Book;
+
+import feign.HeaderMap;
+import feign.Headers;
+import feign.RequestLine;
+
+import java.util.Map;
+
+@Headers("Content-Type: application/json")
+public interface BookClient {
+
+ @RequestLine("POST")
+ void create(@HeaderMap Map headers, Book book);
+
+}
diff --git a/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java
new file mode 100644
index 0000000000..cbd2622f9b
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/BookClient.java
@@ -0,0 +1,18 @@
+package com.baeldung.feign.clients.header.staticheader;
+
+import com.baeldung.feign.models.Book;
+import com.baeldung.feign.models.BookResource;
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+
+@Headers("Accept-Language: en-US")
+public interface BookClient {
+
+ @RequestLine("GET /{isbn}")
+ BookResource findByIsbn(@Param("isbn") String isbn);
+
+ @RequestLine("POST")
+ @Headers("Content-Type: application/json")
+ void create(Book book);
+}
diff --git a/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java
new file mode 100644
index 0000000000..83a273893c
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClient.java
@@ -0,0 +1,16 @@
+package com.baeldung.feign.clients.header.staticheader.parameterized;
+
+import com.baeldung.feign.models.BookResource;
+
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+
+
+@Headers("x-requester-id: {requester}")
+public interface BookClient {
+
+ @RequestLine("GET /{isbn}")
+ BookResource findByIsbn(@Param("requester") String requestorId, @Param("isbn") String isbn);
+
+}
diff --git a/feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java b/feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java
new file mode 100644
index 0000000000..1a23f968ac
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/header/authorisation/ApiAuthorisationService.java
@@ -0,0 +1,11 @@
+package com.baeldung.feign.header.authorisation;
+
+import java.util.UUID;
+
+public class ApiAuthorisationService implements AuthorisationService {
+
+ @Override
+ public String getAuthToken() {
+ return "Bearer " + UUID.randomUUID();
+ }
+}
diff --git a/feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java b/feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java
new file mode 100644
index 0000000000..12e6d59bcc
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/header/authorisation/AuthorisationService.java
@@ -0,0 +1,7 @@
+package com.baeldung.feign.header.authorisation;
+
+public interface AuthorisationService {
+
+ String getAuthToken();
+
+}
diff --git a/feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java b/feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java
new file mode 100644
index 0000000000..eda428de1a
--- /dev/null
+++ b/feign/src/main/java/com/baeldung/feign/header/interceptor/AuthRequestInterceptor.java
@@ -0,0 +1,22 @@
+package com.baeldung.feign.header.interceptor;
+
+import com.baeldung.feign.header.authorisation.AuthorisationService;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+
+
+public class AuthRequestInterceptor implements RequestInterceptor {
+
+ private AuthorisationService authTokenService;
+
+ public AuthRequestInterceptor(AuthorisationService authTokenService) {
+ this.authTokenService = authTokenService;
+ }
+
+ @Override
+ public void apply(RequestTemplate template) {
+ template.header("Authorisation", authTokenService.getAuthToken());
+ }
+}
+
+
\ No newline at end of file
diff --git a/feign/src/main/resources/logback.xml b/feign/src/main/resources/logback.xml
index 7d900d8ea8..e5e962c8e0 100644
--- a/feign/src/main/resources/logback.xml
+++ b/feign/src/main/resources/logback.xml
@@ -5,9 +5,10 @@
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
-
+
\ No newline at end of file
diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java
new file mode 100644
index 0000000000..6e78ba03a6
--- /dev/null
+++ b/feign/src/test/java/com/baeldung/feign/clients/header/dynamicheader/BookClientLiveTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.feign.clients.header.dynamicheader;
+
+import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
+import com.baeldung.feign.models.Book;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Consumes https://github.com/Baeldung/spring-hypermedia-api
+ */
+public class BookClientLiveTest {
+
+ private BookClient bookClient;
+
+ @Before
+ public void setup() {
+ bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
+ }
+
+ @Test
+ public void givenBookClient_shouldPostBook() throws Exception {
+ String isbn = UUID.randomUUID()
+ .toString();
+
+ Book book = new Book(isbn, "Me", "It's me!", null, null);
+
+ Map headerMap = new HashMap<>();
+
+ headerMap.put("metadata-key1", "metadata-value1");
+ headerMap.put("metadata-key2", "metadata-value2");
+
+ bookClient.create(headerMap, book);
+ }
+}
diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java
new file mode 100644
index 0000000000..2062b86791
--- /dev/null
+++ b/feign/src/test/java/com/baeldung/feign/clients/header/interceptor/BookClientLiveTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.feign.clients.header.interceptor;
+
+import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
+import com.baeldung.feign.clients.header.staticheader.BookClient;
+import com.baeldung.feign.models.Book;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.UUID;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Consumes https://github.com/Baeldung/spring-hypermedia-api
+ */
+public class BookClientLiveTest {
+
+ private BookClient bookClient;
+
+ @Before
+ public void setup() {
+ bookClient = BookFeignClientBuilder.createClientWithInterceptor(BookClient.class, "http://localhost:8081/api/books");
+ }
+
+ @Test
+ public void givenBookClient_shouldFindOneBook() throws Exception {
+ Book book = bookClient.findByIsbn("0151072558")
+ .getBook();
+ assertThat(book.getAuthor(), containsString("Orwell"));
+ }
+
+ @Test
+ public void givenBookClient2_shouldFindOneBook() throws Exception {
+ Book book = bookClient.findByIsbn("0151072558")
+ .getBook();
+ assertThat(book.getAuthor(), containsString("Orwell"));
+ }
+
+ @Test
+ public void givenBookClient_shouldPostBook() throws Exception {
+ String isbn = UUID.randomUUID()
+ .toString();
+ Book book = new Book(isbn, "Me", "It's me!", null, null);
+ bookClient.create(book);
+
+ book = bookClient.findByIsbn(isbn)
+ .getBook();
+ assertThat(book.getAuthor(), is("Me"));
+ }
+}
diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java
new file mode 100644
index 0000000000..08b8461fb5
--- /dev/null
+++ b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/BookClientLiveTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.feign.clients.header.staticheader;
+
+import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
+import com.baeldung.feign.models.Book;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.UUID;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Consumes https://github.com/Baeldung/spring-hypermedia-api
+ */
+public class BookClientLiveTest {
+
+ private BookClient bookClient;
+
+ @Before
+ public void setup() {
+ bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
+ }
+
+ @Test
+ public void givenBookClient_shouldFindOneBook() throws Exception {
+ Book book = bookClient.findByIsbn("0151072558")
+ .getBook();
+ assertThat(book.getAuthor(), containsString("Orwell"));
+ }
+
+ @Test
+ public void givenBookClient_shouldPostBook() throws Exception {
+ String isbn = UUID.randomUUID()
+ .toString();
+ Book book = new Book(isbn, "Me", "It's me!", null, null);
+
+ bookClient.create(book);
+
+ book = bookClient.findByIsbn(isbn)
+ .getBook();
+ assertThat(book.getAuthor(), is("Me"));
+ }
+}
diff --git a/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java
new file mode 100644
index 0000000000..94e91b539c
--- /dev/null
+++ b/feign/src/test/java/com/baeldung/feign/clients/header/staticheader/parameterized/BookClientLiveTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.feign.clients.header.staticheader.parameterized;
+
+import com.baeldung.feign.clients.builder.BookFeignClientBuilder;
+import com.baeldung.feign.models.Book;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Consumes https://github.com/Baeldung/spring-hypermedia-api
+ */
+public class BookClientLiveTest {
+
+ private BookClient bookClient;
+
+ private String requester = "test";
+
+ @Before
+ public void setup() {
+ bookClient = BookFeignClientBuilder.createClient(BookClient.class, "http://localhost:8081/api/books");
+ }
+
+ @Test
+ public void givenBookClient_shouldFindOneBook() throws Exception {
+ Book book = bookClient.findByIsbn(requester, "0151072558")
+ .getBook();
+ assertThat(book.getAuthor(), containsString("Orwell"));
+ }
+}
diff --git a/graphql/graphql-dgs/pom.xml b/graphql/graphql-dgs/pom.xml
index 6165ae839f..56e261f14d 100644
--- a/graphql/graphql-dgs/pom.xml
+++ b/graphql/graphql-dgs/pom.xml
@@ -3,16 +3,14 @@
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
- com.baeldung.graphql-dgs
graphql-dgs
1.0
graphql-dgs
- com.baeldung
- parent-modules
+ com.baeldung.graphql
+ graphql
1.0.0-SNAPSHOT
- ../..
@@ -30,39 +28,22 @@
org.springframework.boot
- spring-boot-starter
- 2.6.2
-
-
- org.springframework.boot
- spring-boot-starter-test
- 2.6.2
- test
+ spring-boot-starter-web
com.netflix.graphql.dgs.codegen
graphql-dgs-codegen-client-core
- 5.1.14
-
-
- org.springframework.boot
- spring-boot-starter-web
- 2.6.2
+ ${graphql-dgs-codegen-client-core.version}
com.netflix.graphql.dgs
graphql-dgs-spring-boot-starter
- 4.9.15
+ ${graphql-dgs-spring-boot-starter.version}
-
- org.springframework.boot
- spring-boot-maven-plugin
- 2.6.2
-
io.github.deweyjose
graphqlcodegen-maven-plugin
@@ -84,4 +65,9 @@
+
+ 5.1.14
+ 4.9.15
+
+
\ No newline at end of file
diff --git a/graphql/graphql-error-handling/README.md b/graphql/graphql-error-handling/README.md
new file mode 100644
index 0000000000..06a2957ac1
--- /dev/null
+++ b/graphql/graphql-error-handling/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Error Handling in GraphQL With Spring Boot](https://www.baeldung.com/spring-graphql-error-handling)
diff --git a/graphql/graphql-error-handling/pom.xml b/graphql/graphql-error-handling/pom.xml
new file mode 100644
index 0000000000..92696d8ed7
--- /dev/null
+++ b/graphql/graphql-error-handling/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+ graphql-error-handling
+ 1.0
+ graphql-error-handling
+ jar
+
+
+ com.baeldung.graphql
+ graphql
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.graphql-java
+ graphql-spring-boot-starter
+ ${graphql-spring-boot-starter.version}
+
+
+ com.graphql-java
+ graphql-java-tools
+ ${graphql-java-tools.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+ org.springframework.boot
+ spring-boot-test
+ test
+
+
+ com.graphql-java
+ graphql-spring-boot-starter-test
+ test
+ ${graphql-spring-boot-starter.version}
+
+
+ org.skyscreamer
+ jsonassert
+ ${jsonassert.version}
+ test
+
+
+
+
+ 5.0.2
+ 5.2.4
+ 1.5.0
+
+
+
\ No newline at end of file
diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java
new file mode 100644
index 0000000000..565c9e0a15
--- /dev/null
+++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java
@@ -0,0 +1,46 @@
+package com.baeldung.graphql.error.handling;
+
+import com.baeldung.graphql.error.handling.exception.GraphQLErrorAdapter;
+import graphql.ExceptionWhileDataFetching;
+import graphql.GraphQLError;
+import graphql.servlet.GraphQLErrorHandler;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@SpringBootApplication
+public class GraphQLErrorHandlerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(GraphQLErrorHandlerApplication.class, args);
+ }
+
+ @Bean
+ public GraphQLErrorHandler errorHandler() {
+ return new GraphQLErrorHandler() {
+ @Override
+ public List processErrors(List errors) {
+ List clientErrors = errors.stream()
+ .filter(this::isClientError)
+ .collect(Collectors.toList());
+
+ List serverErrors = errors.stream()
+ .filter(e -> !isClientError(e))
+ .map(GraphQLErrorAdapter::new)
+ .collect(Collectors.toList());
+
+ List e = new ArrayList<>();
+ e.addAll(clientErrors);
+ e.addAll(serverErrors);
+ return e;
+ }
+
+ private boolean isClientError(GraphQLError error) {
+ return !(error instanceof ExceptionWhileDataFetching || error instanceof Throwable);
+ }
+ };
+ }
+}
diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java
new file mode 100644
index 0000000000..815bf3a26a
--- /dev/null
+++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java
@@ -0,0 +1,29 @@
+package com.baeldung.graphql.error.handling.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Entity
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class Location {
+ @Id
+ private String zipcode;
+
+ private String city;
+ private String state;
+
+ @OneToMany(mappedBy = "location", fetch = FetchType.EAGER)
+ private List vehicles = new ArrayList<>();
+}
diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java
new file mode 100644
index 0000000000..e206bdb009
--- /dev/null
+++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java
@@ -0,0 +1,26 @@
+package com.baeldung.graphql.error.handling.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class Vehicle {
+ @Id
+ private String vin;
+ private Integer year;
+ private String make;
+ private String model;
+ private String trim;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_location")
+ private Location location;
+}
diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java
new file mode 100644
index 0000000000..4e7be50ae4
--- /dev/null
+++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java
@@ -0,0 +1,44 @@
+package com.baeldung.graphql.error.handling.exception;
+
+import graphql.ErrorType;
+import graphql.GraphQLError;
+import graphql.language.SourceLocation;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AbstractGraphQLException extends RuntimeException implements GraphQLError {
+ private Map parameters = new HashMap();
+
+ public AbstractGraphQLException(String message) {
+ super(message);
+ }
+
+ public AbstractGraphQLException(String message, Map additionParams) {
+ this(message);
+ if (additionParams != null) {
+ parameters = additionParams;
+ }
+ }
+
+ @Override
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ @Override
+ public List getLocations() {
+ return null;
+ }
+
+ @Override
+ public ErrorType getErrorType() {
+ return null;
+ }
+
+ @Override
+ public Map getExtensions() {
+ return this.parameters;
+ }
+}
diff --git a/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java
new file mode 100644
index 0000000000..d982f98db3
--- /dev/null
+++ b/graphql/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java
@@ -0,0 +1,48 @@
+package com.baeldung.graphql.error.handling.exception;
+
+import graphql.ErrorType;
+import graphql.ExceptionWhileDataFetching;
+import graphql.GraphQLError;
+import graphql.language.SourceLocation;
+
+import java.util.List;
+import java.util.Map;
+
+public class GraphQLErrorAdapter implements GraphQLError {
+
+ private GraphQLError error;
+
+ public GraphQLErrorAdapter(GraphQLError error) {
+ this.error = error;
+ }
+
+ @Override
+ public Map getExtensions() {
+ return error.getExtensions();
+ }
+
+ @Override
+ public List getLocations() {
+ return error.getLocations();
+ }
+
+ @Override
+ public ErrorType getErrorType() {
+ return error.getErrorType();
+ }
+
+ @Override
+ public List