diff --git a/.gitignore b/.gitignore
index 52c0ca0295..248cbeae5d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ bin/
*.class
# Package Files #
+*.jar
*.war
*.ear
diff --git a/akka-streams/README.md b/akka-streams/README.md
index 7f2751422b..5f71991def 100644
--- a/akka-streams/README.md
+++ b/akka-streams/README.md
@@ -1,3 +1,3 @@
### Relevant articles
-- [Guide to Akka Streams](http://www.baeldung.com/akka-streams)
+- [Guide to Akka Streams](https://www.baeldung.com/akka-streams)
diff --git a/algorithms-genetic/README.md b/algorithms-genetic/README.md
index 39f8d59eee..124e9c09e5 100644
--- a/algorithms-genetic/README.md
+++ b/algorithms-genetic/README.md
@@ -1,6 +1,6 @@
## Relevant articles:
-- [Introduction to Jenetics Library](http://www.baeldung.com/jenetics)
-- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization)
+- [Introduction to Jenetics Library](https://www.baeldung.com/jenetics)
+- [Ant Colony Optimization](https://www.baeldung.com/java-ant-colony-optimization)
- [Design a Genetic Algorithm in Java](https://www.baeldung.com/java-genetic-algorithm)
- [The Traveling Salesman Problem in Java](https://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
diff --git a/algorithms-miscellaneous-1/.gitignore b/algorithms-miscellaneous-1/.gitignore
deleted file mode 100644
index 30b2b7442c..0000000000
--- a/algorithms-miscellaneous-1/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-.settings/
-.classpath
-.project
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md
index 479c2792f6..57f5a5d478 100644
--- a/algorithms-miscellaneous-1/README.md
+++ b/algorithms-miscellaneous-1/README.md
@@ -1,18 +1,9 @@
## Relevant articles:
-- [Validating Input With Finite Automata in Java](http://www.baeldung.com/java-finite-automata)
-- [Example of Hill Climbing Algorithm](http://www.baeldung.com/java-hill-climbing-algorithm)
-- [Monte Carlo Tree Search for Tic-Tac-Toe Game](http://www.baeldung.com/java-monte-carlo-tree-search)
-- [Binary Search Algorithm in Java](http://www.baeldung.com/java-binary-search)
-- [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm)
-- [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance)
-- [How to Find the Kth Largest Element in Java](http://www.baeldung.com/java-kth-largest-element)
-- [Multi-Swarm Optimization Algorithm in Java](http://www.baeldung.com/java-multi-swarm-algorithm)
-- [String Search Algorithms for Large Texts](http://www.baeldung.com/java-full-text-search-algorithms)
-- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
-- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element)
-- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial)
-- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
-- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
-- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
-- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm)
+- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata)
+- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm)
+- [Monte Carlo Tree Search for Tic-Tac-Toe Game](https://www.baeldung.com/java-monte-carlo-tree-search)
+- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search)
+- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm)
+- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance)
+- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
\ No newline at end of file
diff --git a/algorithms-miscellaneous-2/.gitignore b/algorithms-miscellaneous-2/.gitignore
deleted file mode 100644
index 30b2b7442c..0000000000
--- a/algorithms-miscellaneous-2/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-.settings/
-.classpath
-.project
\ No newline at end of file
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 462644dddb..76727a1d4f 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -1,19 +1,10 @@
## Relevant articles:
-- [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra)
-- [Introduction to Cobertura](http://www.baeldung.com/cobertura)
-- [Test a Linked List for Cyclicity](http://www.baeldung.com/java-linked-list-cyclicity)
-- [Introduction to JGraphT](http://www.baeldung.com/jgrapht)
-- [A Maze Solver in Java](http://www.baeldung.com/java-solve-maze)
-- [Create a Sudoku Solver in Java](http://www.baeldung.com/java-sudoku)
-- [Displaying Money Amounts in Words](http://www.baeldung.com/java-money-into-words)
-- [A Collaborative Filtering Recommendation System in Java](http://www.baeldung.com/java-collaborative-filtering-recommendations)
-- [Check If Two Rectangles Overlap In Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap)
-- [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points)
-- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines)
-- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred)
-- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage)
-- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
-- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
-- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
-- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
+- [Dijkstra Shortest Path Algorithm in Java](https://www.baeldung.com/java-dijkstra)
+- [Introduction to Cobertura](https://www.baeldung.com/cobertura)
+- [Test a Linked List for Cyclicity](https://www.baeldung.com/java-linked-list-cyclicity)
+- [Introduction to JGraphT](https://www.baeldung.com/jgrapht)
+- [A Maze Solver in Java](https://www.baeldung.com/java-solve-maze)
+- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku)
+- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words)
+- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations)
diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md
index ce0fde0415..9748595a34 100644
--- a/algorithms-miscellaneous-3/README.md
+++ b/algorithms-miscellaneous-3/README.md
@@ -1,10 +1,17 @@
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/algorithms-sorting) and
+[genetic algorithms](/algorithms-genetic), have their own dedicated modules.
+
## Relevant Articles:
- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique)
- [Implementing Simple State Machines with Java Enums](https://www.baeldung.com/java-enum-simple-state-machine)
-- [Converting Between Roman and Arabic Numerals in Java](http://www.baeldung.com/java-convert-roman-arabic)
-- [Practical Java Examples of the Big O Notation](http://www.baeldung.com/java-algorithm-complexity)
+- [Converting Between Roman and Arabic Numerals in Java](https://www.baeldung.com/java-convert-roman-arabic)
+- [Practical Java Examples of the Big O Notation](https://www.baeldung.com/java-algorithm-complexity)
- [Checking If a List Is Sorted in Java](https://www.baeldung.com/java-check-if-list-sorted)
- [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle)
- [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique)
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
+- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
+- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-miscellaneous-3/pom.xml
index 5999d33c86..67923d37d7 100644
--- a/algorithms-miscellaneous-3/pom.xml
+++ b/algorithms-miscellaneous-3/pom.xml
@@ -54,6 +54,21 @@
1.1.0test
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
+
@@ -73,5 +88,7 @@
4.328.0-jre2.6.0
+ 1.19
+ 1.19
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java
rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUnitTest.java
rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java
rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-miscellaneous-4/README.md
new file mode 100644
index 0000000000..fabb4d29b8
--- /dev/null
+++ b/algorithms-miscellaneous-4/README.md
@@ -0,0 +1,9 @@
+## Relevant articles:
+
+- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm)
+- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms)
+- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
+- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element)
+- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
+- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
+- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
\ No newline at end of file
diff --git a/algorithms-miscellaneous-4/pom.xml b/algorithms-miscellaneous-4/pom.xml
new file mode 100644
index 0000000000..8fd8f807ba
--- /dev/null
+++ b/algorithms-miscellaneous-4/pom.xml
@@ -0,0 +1,51 @@
+
+ 4.0.0
+ algorithms-miscellaneous-4
+ 0.0.1-SNAPSHOT
+ algorithms-miscellaneous-4
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ org.assertj
+ assertj-core
+ ${org.assertj.core.version}
+ test
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+
+
+
+
+ 3.9.0
+ 27.0.1-jre
+
+
+
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
diff --git a/autovalue/src/main/resources/logback.xml b/algorithms-miscellaneous-4/src/main/resources/logback.xml
similarity index 100%
rename from autovalue/src/main/resources/logback.xml
rename to algorithms-miscellaneous-4/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md
new file mode 100644
index 0000000000..7ed71e61cc
--- /dev/null
+++ b/algorithms-miscellaneous-5/README.md
@@ -0,0 +1,5 @@
+## Relevant articles:
+
+- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
+- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
+- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
\ No newline at end of file
diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml
new file mode 100644
index 0000000000..d17f93e6e0
--- /dev/null
+++ b/algorithms-miscellaneous-5/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ algorithms-miscellaneous-5
+ 0.0.1-SNAPSHOT
+ algorithms-miscellaneous-5
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ pl.allegro.finance
+ tradukisto
+ ${tradukisto.version}
+
+
+ org.assertj
+ assertj-core
+ ${org.assertj.core.version}
+ test
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+
+
+
+
+ 1.0.1
+ 3.9.0
+ 1.11
+
+
+
\ No newline at end of file
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
diff --git a/jenkins/hello-world/src/main/resources/logback.xml b/algorithms-miscellaneous-5/src/main/resources/logback.xml
similarity index 100%
rename from jenkins/hello-world/src/main/resources/logback.xml
rename to algorithms-miscellaneous-5/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md
index 968d51aecf..f19705f113 100644
--- a/algorithms-sorting/README.md
+++ b/algorithms-sorting/README.md
@@ -1,9 +1,14 @@
-## Relevant articles:
+## Algorithms - Sorting
-- [Bubble Sort in Java](http://www.baeldung.com/java-bubble-sort)
+This module contains articles about sorting algorithms.
+
+### Relevant articles:
+
+- [Bubble Sort in Java](https://www.baeldung.com/java-bubble-sort)
- [Merge Sort in Java](https://www.baeldung.com/java-merge-sort)
- [Quicksort Algorithm Implementation in Java](https://www.baeldung.com/java-quicksort)
- [Insertion Sort in Java](https://www.baeldung.com/java-insertion-sort)
- [Heap Sort in Java](https://www.baeldung.com/java-heap-sort)
- [Shell Sort in Java](https://www.baeldung.com/java-shell-sort)
- [Counting Sort in Java](https://www.baeldung.com/java-counting-sort)
+- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
new file mode 100644
index 0000000000..002d4997f4
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
@@ -0,0 +1,68 @@
+package com.baeldung.bucketsort;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class IntegerBucketSorter implements Sorter {
+
+ private final Comparator comparator;
+
+ public IntegerBucketSorter(Comparator comparator) {
+ this.comparator = comparator;
+ }
+
+ public IntegerBucketSorter() {
+ comparator = Comparator.naturalOrder();
+ }
+
+ public List sort(List arrayToSort) {
+
+ List> buckets = splitIntoUnsortedBuckets(arrayToSort);
+
+ for(List bucket : buckets){
+ bucket.sort(comparator);
+ }
+
+ return concatenateSortedBuckets(buckets);
+ }
+
+ private List concatenateSortedBuckets(List> buckets){
+ List sortedArray = new LinkedList<>();
+ for(List bucket : buckets){
+ sortedArray.addAll(bucket);
+ }
+ return sortedArray;
+ }
+
+ private List> splitIntoUnsortedBuckets(List initialList){
+
+ final int max = findMax(initialList);
+ final int numberOfBuckets = (int) Math.sqrt(initialList.size());
+
+ List> buckets = new ArrayList<>();
+ for(int i = 0; i < numberOfBuckets; i++) buckets.add(new ArrayList<>());
+
+ //distribute the data
+ for (int i : initialList) {
+ buckets.get(hash(i, max, numberOfBuckets)).add(i);
+ }
+ return buckets;
+
+ }
+
+ private int findMax(List input){
+ int m = Integer.MIN_VALUE;
+ for (int i : input){
+ m = Math.max(i, m);
+ }
+ return m;
+ }
+
+ private static int hash(int i, int max, int numberOfBuckets) {
+ return (int) ((double) i / max * (numberOfBuckets - 1));
+ }
+
+
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
new file mode 100644
index 0000000000..b86f60324f
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
@@ -0,0 +1,8 @@
+package com.baeldung.bucketsort;
+
+import java.util.List;
+
+public interface Sorter {
+
+ List sort(List arrayToSort);
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
new file mode 100644
index 0000000000..723a2f5a80
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
@@ -0,0 +1,53 @@
+package com.baeldung.algorithms.radixsort;
+
+import java.util.Arrays;
+
+public class RadixSort {
+
+ public static void sort(int numbers[]) {
+ int maximumNumber = findMaximumNumberIn(numbers);
+
+ int numberOfDigits = calculateNumberOfDigitsIn(maximumNumber);
+
+ int placeValue = 1;
+
+ while (numberOfDigits-- > 0) {
+ applyCountingSortOn(numbers, placeValue);
+ placeValue *= 10;
+ }
+ }
+
+ private static void applyCountingSortOn(int[] numbers, int placeValue) {
+ int range = 10; // radix or the base
+
+ int length = numbers.length;
+ int[] frequency = new int[range];
+ int[] sortedValues = new int[length];
+
+ for (int i = 0; i < length; i++) {
+ int digit = (numbers[i] / placeValue) % range;
+ frequency[digit]++;
+ }
+
+ for (int i = 1; i < range; i++) {
+ frequency[i] += frequency[i - 1];
+ }
+
+ for (int i = length - 1; i >= 0; i--) {
+ int digit = (numbers[i] / placeValue) % range;
+ sortedValues[frequency[digit] - 1] = numbers[i];
+ frequency[digit]--;
+ }
+
+ System.arraycopy(sortedValues, 0, numbers, 0, length);
+ }
+
+ private static int calculateNumberOfDigitsIn(int number) {
+ return (int) Math.log10(number) + 1; // valid only if number > 0
+ }
+
+ private static int findMaximumNumberIn(int[] arr) {
+ return Arrays.stream(arr).max().getAsInt();
+ }
+
+}
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
new file mode 100644
index 0000000000..2773d8a68f
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.bucketsort;
+
+import com.baeldung.bucketsort.IntegerBucketSorter;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class IntegerBucketSorterUnitTest {
+
+ private IntegerBucketSorter sorter;
+
+ @Before
+ public void setUp() throws Exception {
+ sorter = new IntegerBucketSorter();
+ }
+
+ @Test
+ public void givenUnsortedList_whenSortedUsingBucketSorter_checkSortingCorrect() {
+
+ List unsorted = Arrays.asList(80,50,60,30,20,10,70,0,40,500,600,602,200,15);
+ List expected = Arrays.asList(0,10,15,20,30,40,50,60,70,80,200,500,600,602);
+
+ List actual = sorter.sort(unsorted);
+
+ assertEquals(expected, actual);
+
+
+ }
+}
\ No newline at end of file
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
new file mode 100644
index 0000000000..0f6c751ade
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.algorithms.radixsort;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class RadixSortUnitTest {
+
+ @Test
+ public void givenUnsortedArray_whenRadixSort_thenArraySorted() {
+ int[] numbers = { 387, 468, 134, 123, 68, 221, 769, 37, 7 };
+ RadixSort.sort(numbers);
+ int[] numbersSorted = { 7, 37, 68, 123, 134, 221, 387, 468, 769 };
+ assertArrayEquals(numbersSorted, numbers);
+ }
+}
diff --git a/animal-sniffer-mvn-plugin/README.md b/animal-sniffer-mvn-plugin/README.md
index 4c7c381da4..52e319b399 100644
--- a/animal-sniffer-mvn-plugin/README.md
+++ b/animal-sniffer-mvn-plugin/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Animal Sniffer Maven Plugin
-[Introduction to Animal Sniffer Maven Plugin](http://www.baeldung.com/maven-animal-sniffer)
+This module contains articles about the Animal Sniffer Maven Plugin
+
+### Relevant articles:
+
+[Introduction to Animal Sniffer Maven Plugin](https://www.baeldung.com/maven-animal-sniffer)
diff --git a/annotations/README.md b/annotations/README.md
new file mode 100644
index 0000000000..ec4005fc5e
--- /dev/null
+++ b/annotations/README.md
@@ -0,0 +1,7 @@
+## Annotations
+
+This module contains articles about Java annotations
+
+### Relevant Articles:
+
+- [Java Annotation Processing and Creating a Builder](https://www.baeldung.com/java-annotation-processing-builder)
diff --git a/annotations/readme.md b/annotations/readme.md
deleted file mode 100644
index 2b052803e6..0000000000
--- a/annotations/readme.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [Java Annotation Processing and Creating a Builder](http://www.baeldung.com/java-annotation-processing-builder)
diff --git a/antlr/README.md b/antlr/README.md
index 419d9ddfbb..1f394125c6 100644
--- a/antlr/README.md
+++ b/antlr/README.md
@@ -1,3 +1,7 @@
+## ANTLR
+
+This module contains articles about ANTLR
+
### Relevant Articles:
-- [Java with ANTLR](http://www.baeldung.com/java-antlr)
+- [Java with ANTLR](https://www.baeldung.com/java-antlr)
diff --git a/apache-avro/README.md b/apache-avro/README.md
index 32d84ecc76..b338e8e565 100644
--- a/apache-avro/README.md
+++ b/apache-avro/README.md
@@ -1,2 +1,6 @@
+## Apache Avro
+
+This module contains articles about Apache Avro
+
### Relevant Articles:
-- [Guide to Apache Avro](http://www.baeldung.com/java-apache-avro)
+- [Guide to Apache Avro](https://www.baeldung.com/java-apache-avro)
diff --git a/apache-bval/README.md b/apache-bval/README.md
index 80ea149993..e856810378 100644
--- a/apache-bval/README.md
+++ b/apache-bval/README.md
@@ -1,2 +1,7 @@
+## Apache BVal
+
+This module contains articles about Apache BVal
+
### Relevant Articles:
-- [Intro to Apache BVal](http://www.baeldung.com/apache-bval)
+
+- [Intro to Apache BVal](https://www.baeldung.com/apache-bval)
diff --git a/apache-curator/README.md b/apache-curator/README.md
index 9bda573292..4fef6a138e 100644
--- a/apache-curator/README.md
+++ b/apache-curator/README.md
@@ -1,3 +1,7 @@
+## Apache Curator
+
+This module contains articles about Apache Curator
+
### Relevant Articles:
-- [Introduction to Apache Curator](http://www.baeldung.com/apache-curator)
+- [Introduction to Apache Curator](https://www.baeldung.com/apache-curator)
diff --git a/apache-cxf/README.md b/apache-cxf/README.md
index d03999dce3..f825b85bb3 100644
--- a/apache-cxf/README.md
+++ b/apache-cxf/README.md
@@ -1,6 +1,10 @@
+## Apache CXF
+
+This module contains articles about Apache CXF
+
## Relevant Articles:
-- [Introduction to Apache CXF Aegis Data Binding](http://www.baeldung.com/aegis-data-binding-in-apache-cxf)
-- [Apache CXF Support for RESTful Web Services](http://www.baeldung.com/apache-cxf-rest-api)
-- [A Guide to Apache CXF with Spring](http://www.baeldung.com/apache-cxf-with-spring)
-- [Introduction to Apache CXF](http://www.baeldung.com/introduction-to-apache-cxf)
+- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
+- [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api)
+- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring)
+- [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf)
- [Server-Sent Events (SSE) In JAX-RS](https://www.baeldung.com/java-ee-jax-rs-sse)
diff --git a/apache-fop/README.md b/apache-fop/README.md
index 1e734a5f36..2adc593026 100644
--- a/apache-fop/README.md
+++ b/apache-fop/README.md
@@ -1,5 +1,5 @@
-=========
+## Apache FOP
-## Core Java Cookbooks and Examples
+This module contains articles about Apache FOP
### Relevant Articles:
diff --git a/apache-geode/README.md b/apache-geode/README.md
index 2f04418825..86629f7a82 100644
--- a/apache-geode/README.md
+++ b/apache-geode/README.md
@@ -1,3 +1,7 @@
+## Apache Geode
+
+This module contains articles about Apache Geode
+
### Relevant Articles:
- [A Quick Guide to Apache Geode](https://www.baeldung.com/apache-geode)
diff --git a/apache-meecrowave/README.md b/apache-meecrowave/README.md
index 42b93a383e..d360af13af 100644
--- a/apache-meecrowave/README.md
+++ b/apache-meecrowave/README.md
@@ -1,3 +1,7 @@
+## Apache Meecrowave
+
+This module contains articles about Apache Meecrowave
+
### Relevant Articles:
-================================
-- [Building a Microservice with Apache Meecrowave](http://www.baeldung.com/apache-meecrowave)
+
+- [Building a Microservice with Apache Meecrowave](https://www.baeldung.com/apache-meecrowave)
\ No newline at end of file
diff --git a/apache-olingo/README.md b/apache-olingo/README.md
index bfbdc97700..2f4e86d5a2 100644
--- a/apache-olingo/README.md
+++ b/apache-olingo/README.md
@@ -1,3 +1,8 @@
-## Relevant articles:
+## Apache Olingo
+
+This module contains articles about Apache Olingo
+
+### Relevant articles:
- [OData Protocol Guide](https://www.baeldung.com/odata)
+- [Intro to OData with Olingo](https://www.baeldung.com/olingo)
diff --git a/apache-opennlp/README.md b/apache-opennlp/README.md
index 2e9fa0e384..4b1fa36540 100644
--- a/apache-opennlp/README.md
+++ b/apache-opennlp/README.md
@@ -1,3 +1,7 @@
+## Apache OpenNLP
+
+This module contains articles about Apache OpenNLP
+
### Relevant Articles
-- [Intro to Apache OpenNLP](http://www.baeldung.com/apache-open-nlp)
+- [Intro to Apache OpenNLP](https://www.baeldung.com/apache-open-nlp)
diff --git a/apache-poi/README.md b/apache-poi/README.md
index 862981991d..b7b8bf5f6a 100644
--- a/apache-poi/README.md
+++ b/apache-poi/README.md
@@ -1,4 +1,8 @@
+## Apache POI
+
+This module contains articles about Apache POI
+
### Relevant Articles:
-- [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi)
-- [Working with Microsoft Excel in Java](http://www.baeldung.com/java-microsoft-excel)
-- [Creating a MS PowerPoint Presentation in Java](http://www.baeldung.com/apache-poi-slideshow)
+- [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi)
+- [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel)
+- [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow)
diff --git a/apache-pulsar/README.md b/apache-pulsar/README.md
index 2970bc3d88..c44849a490 100644
--- a/apache-pulsar/README.md
+++ b/apache-pulsar/README.md
@@ -1,3 +1,7 @@
+## Apache Pulsar
+
+This module contains articles about Apache Pulsar
+
### Relevant Articles:
- [Introduction to Apache Pulsar](https://www.baeldung.com/apache-pulsar)
diff --git a/apache-shiro/README.md b/apache-shiro/README.md
index bc3480b266..553eeecc69 100644
--- a/apache-shiro/README.md
+++ b/apache-shiro/README.md
@@ -1,2 +1,7 @@
-### Relevant articles
-- [Introduction to Apache Shiro](http://www.baeldung.com/apache-shiro)
+## Apache Shiro
+
+This module contains articles about Apache Shiro
+
+### Relevant articles:
+
+- [Introduction to Apache Shiro](https://www.baeldung.com/apache-shiro)
\ No newline at end of file
diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index 644d70b30a..7f0d07589c 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -38,17 +38,6 @@
jcl-over-slf4jruntime
-
- org.slf4j
- slf4j-log4j12
- runtime
-
-
- log4j
- log4j
- ${log4j-version}
- runtime
-
@@ -56,4 +45,4 @@
1.2.17
-
\ No newline at end of file
+
diff --git a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
index e6e72b2579..2713786d71 100644
--- a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
+++ b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
@@ -18,22 +18,17 @@ import javax.servlet.http.HttpServletRequest;
@Controller
public class ShiroSpringController {
-
-
@GetMapping("/")
public String index() {
return "index";
}
-
@RequestMapping( value = "/login", method = {RequestMethod.GET, RequestMethod.POST})
public String login(HttpServletRequest req, UserCredentials cred, RedirectAttributes attr) {
if(req.getMethod().equals(RequestMethod.GET.toString())) {
return "login";
- }
- else {
-
+ } else {
Subject subject = SecurityUtils.getSubject();
if(!subject.isAuthenticated()) {
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
new file mode 100644
index 0000000000..a373122d6c
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
@@ -0,0 +1,68 @@
+package com.baeldung.shiro.permissions.custom;
+
+import com.baeldung.MyCustomRealm;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.config.Ini;
+import org.apache.shiro.mgt.DefaultSecurityManager;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.realm.text.IniRealm;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Main {
+
+ private static final transient Logger log = LoggerFactory.getLogger(Main.class);
+
+ public static void main(String[] args) {
+
+ IniRealm realm = new IniRealm();
+ Ini ini = Ini.fromResourcePath(Main.class.getResource("/com/baeldung/shiro/permissions/custom/shiro.ini").getPath());
+ realm.setIni(ini);
+ realm.setPermissionResolver(new PathPermissionResolver());
+ realm.init();
+ SecurityManager securityManager = new DefaultSecurityManager(realm);
+
+ SecurityUtils.setSecurityManager(securityManager);
+ Subject currentUser = SecurityUtils.getSubject();
+
+ if (!currentUser.isAuthenticated()) {
+ UsernamePasswordToken token = new UsernamePasswordToken("paul.reader", "password4");
+ token.setRememberMe(true);
+ try {
+ currentUser.login(token);
+ } catch (UnknownAccountException uae) {
+ log.error("Username Not Found!", uae);
+ } catch (IncorrectCredentialsException ice) {
+ log.error("Invalid Credentials!", ice);
+ } catch (LockedAccountException lae) {
+ log.error("Your Account is Locked!", lae);
+ } catch (AuthenticationException ae) {
+ log.error("Unexpected Error!", ae);
+ }
+ }
+
+ log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
+
+ if (currentUser.hasRole("admin")) {
+ log.info("Welcome Admin");
+ } else if(currentUser.hasRole("editor")) {
+ log.info("Welcome, Editor!");
+ } else if(currentUser.hasRole("author")) {
+ log.info("Welcome, Author");
+ } else {
+ log.info("Welcome, Guest");
+ }
+
+ if(currentUser.isPermitted("/articles/drafts/new-article")) {
+ log.info("You can access articles");
+ } else {
+ log.info("You cannot access articles!");
+ }
+ currentUser.logout();
+ }
+
+}
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java
new file mode 100644
index 0000000000..f7dfbda06a
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java
@@ -0,0 +1,22 @@
+package com.baeldung.shiro.permissions.custom;
+
+import org.apache.shiro.authz.Permission;
+
+import java.nio.file.Path;
+
+public class PathPermission implements Permission {
+
+ private final Path path;
+
+ public PathPermission(Path path) {
+ this.path = path;
+ }
+
+ @Override
+ public boolean implies(Permission p) {
+ if(p instanceof PathPermission) {
+ return ((PathPermission) p).path.startsWith(path);
+ }
+ return false;
+ }
+}
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java
new file mode 100644
index 0000000000..4b60d2fbd4
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java
@@ -0,0 +1,13 @@
+package com.baeldung.shiro.permissions.custom;
+
+import org.apache.shiro.authz.Permission;
+import org.apache.shiro.authz.permission.PermissionResolver;
+
+import java.nio.file.Paths;
+
+public class PathPermissionResolver implements PermissionResolver {
+ @Override
+ public Permission resolvePermission(String permissionString) {
+ return new PathPermission(Paths.get(permissionString));
+ }
+}
diff --git a/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini b/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini
new file mode 100644
index 0000000000..732ff8b60d
--- /dev/null
+++ b/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini
@@ -0,0 +1,10 @@
+[users]
+jane.admin = password, admin
+john.editor = password2, editor
+zoe.author = password3, author
+paul.reader = password4
+
+[roles]
+admin = /
+editor = /articles
+author = /articles/drafts
diff --git a/apache-solrj/README.md b/apache-solrj/README.md
index 7a32becb64..803db393e9 100644
--- a/apache-solrj/README.md
+++ b/apache-solrj/README.md
@@ -1,4 +1,7 @@
-## Apache Solrj Tutorials Project
+## Apache Solrj
-### Relevant Articles
-- [Guide to Solr in Java with Apache Solrj](http://www.baeldung.com/apache-solrj)
+This module contains articles about Apache Solrj
+
+### Relevant Articles:
+
+- [Guide to Solr in Java with Apache Solrj](https://www.baeldung.com/apache-solrj)
\ No newline at end of file
diff --git a/apache-spark/README.md b/apache-spark/README.md
index a4dce212b4..360a18f095 100644
--- a/apache-spark/README.md
+++ b/apache-spark/README.md
@@ -1,4 +1,8 @@
-### Relevant articles
+## Apache Spark
-- [Introduction to Apache Spark](http://www.baeldung.com/apache-spark)
+This module contains articles about Apache Spark
+
+### Relevant articles:
+
+- [Introduction to Apache Spark](https://www.baeldung.com/apache-spark)
- [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline)
diff --git a/apache-thrift/README.md b/apache-thrift/README.md
index d8b9195dcc..4508939de6 100644
--- a/apache-thrift/README.md
+++ b/apache-thrift/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Thrift
-- [Working with Apache Thrift](http://www.baeldung.com/apache-thrift)
+This module contains articles about Apache Thrift
+
+### Relevant articles:
+
+- [Working with Apache Thrift](https://www.baeldung.com/apache-thrift)
diff --git a/apache-tika/README.md b/apache-tika/README.md
index b92a7bebf1..690e55edc3 100644
--- a/apache-tika/README.md
+++ b/apache-tika/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Tika
-- [Content Analysis with Apache Tika](http://www.baeldung.com/apache-tika)
+This module contains articles about Apache Tika
+
+### Relevant articles:
+
+- [Content Analysis with Apache Tika](https://www.baeldung.com/apache-tika)
diff --git a/apache-velocity/README.md b/apache-velocity/README.md
index 53c67f847e..d539d79efc 100644
--- a/apache-velocity/README.md
+++ b/apache-velocity/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Velocity
-- [Introduction to Apache Velocity](http://www.baeldung.com/apache-velocity)
+This module contains articles about Apache Velocity
+
+### Relevant articles:
+
+- [Introduction to Apache Velocity](https://www.baeldung.com/apache-velocity)
diff --git a/apache-zookeeper/README.md b/apache-zookeeper/README.md
index 6bddcfd5a8..cda1cd6d73 100644
--- a/apache-zookeeper/README.md
+++ b/apache-zookeeper/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Zookeeper
-- [Getting Started with Java and Zookeeper](http://www.baeldung.com/java-zookeeper)
+This module contains articles about Apache Zookeeper
+
+### Relevant articles:
+
+- [Getting Started with Java and Zookeeper](https://www.baeldung.com/java-zookeeper)
diff --git a/asciidoctor/README.md b/asciidoctor/README.md
index 2124907e87..87b1ec833c 100644
--- a/asciidoctor/README.md
+++ b/asciidoctor/README.md
@@ -1,4 +1,8 @@
-### Relevant articles
+## Asciidoctor
-- [Generating a Book with Asciidoctor](http://www.baeldung.com/asciidoctor-book)
-- [Introduction to Asciidoctor in Java](http://www.baeldung.com/asciidoctor)
+This module contains articles about Asciidoctor
+
+### Relevant articles:
+
+- [Generating a Book with Asciidoctor](https://www.baeldung.com/asciidoctor-book)
+- [Introduction to Asciidoctor in Java](https://www.baeldung.com/asciidoctor)
diff --git a/asm/README.md b/asm/README.md
index 50d9c34324..e10cdc45bd 100644
--- a/asm/README.md
+++ b/asm/README.md
@@ -1,3 +1,7 @@
+## ASM
+
+This module contains articles about ASM
+
### Relevant Articles:
-- [A Guide to Java Bytecode Manipulation with ASM](http://www.baeldung.com/java-asm)
+- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm)
diff --git a/atomix/README.md b/atomix/README.md
index fb22eec8dc..217fced82a 100644
--- a/atomix/README.md
+++ b/atomix/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Atomix
-- [Introduction to Atomix](http://www.baeldung.com/atomix)
+This module contains articles about Atomix
+
+### Relevant articles:
+
+- [Introduction to Atomix](https://www.baeldung.com/atomix)
diff --git a/autovalue/README.md b/autovalue/README.md
deleted file mode 100644
index f33ff6899f..0000000000
--- a/autovalue/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-### Relevant Articles:
-- [Introduction to AutoValue](http://www.baeldung.com/introduction-to-autovalue)
-- [Introduction to AutoFactory](http://www.baeldung.com/autofactory)
-- [Google AutoService](https://www.baeldung.com/google-autoservice)
diff --git a/aws-lambda/README.md b/aws-lambda/README.md
index 921b699bdd..2fbdaace10 100644
--- a/aws-lambda/README.md
+++ b/aws-lambda/README.md
@@ -1,3 +1,7 @@
+## AWS Lambda
+
+This module contains articles about AWS Lambda
+
### Relevant Articles:
-- [Using AWS Lambda with API Gateway](http://www.baeldung.com/aws-lambda-api-gateway)
-- [Introduction to AWS Serverless Application Model](http://www.baeldung.com/aws-serverless)
+- [Using AWS Lambda with API Gateway](https://www.baeldung.com/aws-lambda-api-gateway)
+- [Introduction to AWS Serverless Application Model](https://www.baeldung.com/aws-serverless)
diff --git a/aws/README.md b/aws/README.md
index d14ea8a75e..9e4ca8b699 100644
--- a/aws/README.md
+++ b/aws/README.md
@@ -1,11 +1,15 @@
+## AWS
+
+This module contains articles about AWS
+
### Relevant articles
-- [AWS Lambda Using DynamoDB With Java](http://www.baeldung.com/aws-lambda-dynamodb-java)
-- [AWS S3 with Java](http://www.baeldung.com/aws-s3-java)
-- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
-- [Managing EC2 Instances in Java](http://www.baeldung.com/ec2-java)
-- [Multipart Uploads in Amazon S3 with Java](http://www.baeldung.com/aws-s3-multipart-upload)
-- [Integration Testing with a Local DynamoDB Instance](http://www.baeldung.com/dynamodb-local-integration-tests)
-- [Using the JetS3t Java Client With Amazon S3](http://www.baeldung.com/jets3t-amazon-s3)
-- [Managing Amazon SQS Queues in Java](http://www.baeldung.com/aws-queues-java)
+- [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)
+- [AWS Lambda 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/axon/README.md b/axon/README.md
index f1ae5d00d8..069102fc3a 100644
--- a/axon/README.md
+++ b/axon/README.md
@@ -1,3 +1,7 @@
+## Axon
+
+This module contains articles about Axon
+
### Relevant articles
-- [A Guide to the Axon Framework](http://www.baeldung.com/axon-cqrs-event-sourcing)
+- [A Guide to the Axon Framework](https://www.baeldung.com/axon-cqrs-event-sourcing)
diff --git a/azure/README.md b/azure/README.md
index ae8c443660..4da8481502 100644
--- a/azure/README.md
+++ b/azure/README.md
@@ -1,4 +1,8 @@
+## Azure
+
+This module contains articles about Azure
+
### Relevant Articles:
-- [Deploy a Spring Boot App to Azure](http://www.baeldung.com/spring-boot-azure)
+- [Deploy a Spring Boot App to Azure](https://www.baeldung.com/spring-boot-azure)
diff --git a/bazel/README.md b/bazel/README.md
new file mode 100644
index 0000000000..af4f901f49
--- /dev/null
+++ b/bazel/README.md
@@ -0,0 +1,7 @@
+## Bazel
+
+This module contains articles about Bazel
+
+### Relevant Articles:
+
+- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool)
diff --git a/bazel/bazelapp/pom.xml b/bazel/bazelapp/pom.xml
index 9c9fb59619..e56cc06ef4 100644
--- a/bazel/bazelapp/pom.xml
+++ b/bazel/bazelapp/pom.xml
@@ -16,14 +16,17 @@
com.baeldungbazelgreeting
- 1.0.0-SNAPSHOT
+ ${bazelgreeting.version}org.apache.commonscommons-lang3
- 3.9
+ ${commons-lang3.version}
+
+ 1.0.0-SNAPSHOT
+
\ No newline at end of file
diff --git a/blade/README.md b/blade/README.md
index 1f2a00ed3f..202494330f 100644
--- a/blade/README.md
+++ b/blade/README.md
@@ -1,5 +1,5 @@
### Relevant Articles:
-- [Blade – A Complete Guidebook](http://www.baeldung.com/blade)
+- [Blade – A Complete Guidebook](https://www.baeldung.com/blade)
Run Integration Tests with `mvn integration-test`
diff --git a/bootique/README.md b/bootique/README.md
index 2ef898fcf7..0d4076201e 100644
--- a/bootique/README.md
+++ b/bootique/README.md
@@ -1,2 +1,6 @@
+## Bootique
+
+This module contains articles about Bootique
+
### Relevant Articles:
-- [Introduction to Bootique](http://www.baeldung.com/bootique)
+- [Introduction to Bootique](https://www.baeldung.com/bootique)
diff --git a/cas/README.md b/cas/README.md
new file mode 100644
index 0000000000..16775a8a02
--- /dev/null
+++ b/cas/README.md
@@ -0,0 +1,7 @@
+## CAS
+
+This module contains articles about the Central Authentication Service (CAS)
+
+### Relevant Articles:
+
+- [CAS SSO With Spring Security](baeldung.com/spring-security-cas-sso)
\ No newline at end of file
diff --git a/cdi/README.md b/cdi/README.md
index bfb635be9e..13169698a2 100644
--- a/cdi/README.md
+++ b/cdi/README.md
@@ -1,5 +1,9 @@
+## CDI
+
+This module contains articles about Contexts and Dependency Injection (CDI)
+
### Relevant Articles:
-- [CDI Interceptor vs Spring AspectJ](http://www.baeldung.com/cdi-interceptor-vs-spring-aspectj)
-- [An Introduction to CDI (Contexts and Dependency Injection) in Java](http://www.baeldung.com/java-ee-cdi)
+- [CDI Interceptor vs Spring AspectJ](https://www.baeldung.com/cdi-interceptor-vs-spring-aspectj)
+- [An Introduction to CDI (Contexts and Dependency Injection) in Java](https://www.baeldung.com/java-ee-cdi)
- [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification)
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
index 4896408502..dc0bdeb951 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
@@ -1,15 +1,16 @@
-package com.baeldung.cdi.cdi2observers.application;
-
-import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
-import javax.enterprise.inject.se.SeContainer;
-import javax.enterprise.inject.se.SeContainerInitializer;
-
-public class BootstrappingApplication {
-
- public static void main(String... args) {
- SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
- try (SeContainer container = containerInitializer.initialize()) {
- container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!"));
- }
- }
-}
+package com.baeldung.cdi2observers.application;
+
+import com.baeldung.cdi2observers.events.ExampleEvent;
+
+import javax.enterprise.inject.se.SeContainer;
+import javax.enterprise.inject.se.SeContainerInitializer;
+
+public class BootstrappingApplication {
+
+ public static void main(String... args) {
+ SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
+ try (SeContainer container = containerInitializer.initialize()) {
+ container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!"));
+ }
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
index a2329d2ef1..9adfad4d39 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
@@ -1,14 +1,14 @@
-package com.baeldung.cdi.cdi2observers.events;
-
-public class ExampleEvent {
-
- private final String eventMessage;
-
- public ExampleEvent(String eventMessage) {
- this.eventMessage = eventMessage;
- }
-
- public String getEventMessage() {
- return eventMessage;
- }
-}
+package com.baeldung.cdi2observers.events;
+
+public class ExampleEvent {
+
+ private final String eventMessage;
+
+ public ExampleEvent(String eventMessage) {
+ this.eventMessage = eventMessage;
+ }
+
+ public String getEventMessage() {
+ return eventMessage;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
index f37030778a..5a0aa0b5e3 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
@@ -1,14 +1,14 @@
-package com.baeldung.cdi.cdi2observers.events;
-
-import javax.enterprise.event.Event;
-import javax.inject.Inject;
-
-public class ExampleEventSource {
-
- @Inject
- Event exampleEvent;
-
- public void fireEvent() {
- exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!"));
- }
-}
+package com.baeldung.cdi2observers.events;
+
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
+public class ExampleEventSource {
+
+ @Inject
+ Event exampleEvent;
+
+ public void fireEvent() {
+ exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!"));
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
index 34520c2b3d..3af48af13f 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
@@ -1,12 +1,13 @@
-package com.baeldung.cdi.cdi2observers.observers;
-
-import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
-import javax.annotation.Priority;
-import javax.enterprise.event.Observes;
-
-public class AnotherExampleEventObserver {
-
- public String onEvent(@Observes @Priority(2) ExampleEvent event) {
- return event.getEventMessage();
- }
-}
+package com.baeldung.cdi2observers.observers;
+
+import com.baeldung.cdi2observers.events.ExampleEvent;
+
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+
+public class AnotherExampleEventObserver {
+
+ public String onEvent(@Observes @Priority(2) ExampleEvent event) {
+ return event.getEventMessage();
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
index b3522b2ad0..33fdc43bbb 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
@@ -1,13 +1,13 @@
-package com.baeldung.cdi.cdi2observers.observers;
-
-import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
-import com.baeldung.cdi.cdi2observers.services.TextService;
-import javax.annotation.Priority;
-import javax.enterprise.event.Observes;
-
-public class ExampleEventObserver {
-
- public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) {
- return textService.parseText(event.getEventMessage());
- }
-}
+package com.baeldung.cdi2observers.observers;
+
+import com.baeldung.cdi2observers.events.ExampleEvent;
+import com.baeldung.cdi2observers.services.TextService;
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+
+public class ExampleEventObserver {
+
+ public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) {
+ return textService.parseText(event.getEventMessage());
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
index 47788a0657..eabe031223 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
@@ -1,8 +1,8 @@
-package com.baeldung.cdi.cdi2observers.services;
-
-public class TextService {
-
- public String parseText(String text) {
- return text.toUpperCase();
- }
-}
+package com.baeldung.cdi2observers.services;
+
+public class TextService {
+
+ public String parseText(String text) {
+ return text.toUpperCase();
+ }
+}
diff --git a/cdi/src/main/resources/META-INF/beans.xml b/cdi/src/main/resources/META-INF/beans.xml
index d41b35e7d9..144e9e567f 100644
--- a/cdi/src/main/resources/META-INF/beans.xml
+++ b/cdi/src/main/resources/META-INF/beans.xml
@@ -1,7 +1,8 @@
-
+
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+ bean-discovery-mode="all">
com.baeldung.interceptor.AuditedInterceptor
diff --git a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
index deecf13f9a..1b976144aa 100644
--- a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
+++ b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
@@ -1,14 +1,15 @@
-package com.baeldung.cdi.cdi2observers.tests;
-
-import com.baeldung.cdi.cdi2observers.services.TextService;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-
-public class TextServiceUnitTest {
-
- @Test
- public void givenTextServiceInstance_whenCalledparseText_thenCorrect() {
- TextService textService = new TextService();
- assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG");
- }
-}
+package com.baeldung.test.cdi2observers.tests;
+
+import com.baeldung.cdi2observers.services.TextService;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TextServiceUnitTest {
+
+ @Test
+ public void givenTextServiceInstance_whenCalledparseText_thenCorrect() {
+ TextService textService = new TextService();
+ assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG");
+ }
+}
diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java b/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java
index caf2ed32b5..b22f189373 100644
--- a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java
+++ b/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java
@@ -6,7 +6,6 @@ import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
public class TimeLoggerFactoryUnitTest {
-
@Test
public void givenTimeLoggerFactory_whenCalledgetTimeLogger_thenOneAssertion() {
TimeLoggerFactory timeLoggerFactory = new TimeLoggerFactory();
diff --git a/checker-plugin/README.md b/checker-plugin/README.md
index f4534b09e8..59dc2878a2 100644
--- a/checker-plugin/README.md
+++ b/checker-plugin/README.md
@@ -1,3 +1,7 @@
+## Checker Plugin
+
+This module contains articles about the Checker Plugin
+
### Relevant articles
-- [The Checker Framework – Pluggable Type Systems for Java](http://www.baeldung.com/checker-framework)
+- [The Checker Framework – Pluggable Type Systems for Java](https://www.baeldung.com/checker-framework)
diff --git a/cloud-foundry-uaa/README.md b/cloud-foundry-uaa/README.md
index b2f382cad1..f7707a04e2 100644
--- a/cloud-foundry-uaa/README.md
+++ b/cloud-foundry-uaa/README.md
@@ -1,3 +1,7 @@
-### Revelant Articles
+## Cloud Foundry UAA
+
+This module contains articles about Cloud Foundry UAA
+
+### Relevant Articles:
- [A Quick Guide To Using Cloud Foundry UAA](https://www.baeldung.com/cloud-foundry-uaa)
diff --git a/code-generation/README.md b/code-generation/README.md
new file mode 100644
index 0000000000..289a336f99
--- /dev/null
+++ b/code-generation/README.md
@@ -0,0 +1,9 @@
+## Code Generation
+
+This module contains articles about automatic code generation
+
+### Relevant Articles:
+
+- [Introduction to AutoValue](https://www.baeldung.com/introduction-to-autovalue)
+- [Introduction to AutoFactory](https://www.baeldung.com/autofactory)
+- [Google AutoService](https://www.baeldung.com/google-autoservice)
diff --git a/autovalue/pom.xml b/code-generation/pom.xml
similarity index 95%
rename from autovalue/pom.xml
rename to code-generation/pom.xml
index a10e8ef055..7aefc1b5b3 100644
--- a/autovalue/pom.xml
+++ b/code-generation/pom.xml
@@ -2,9 +2,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0com.baeldung
- autovalue
+ code-generation1.0
- autovalue
+ code-generationcom.baeldung
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/App.java b/code-generation/src/main/java/com/baeldung/autofactory/App.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/App.java
rename to code-generation/src/main/java/com/baeldung/autofactory/App.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/CustomStorage.java b/code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/CustomStorage.java
rename to code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java
rename to code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/Camera.java b/code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/model/Camera.java
rename to code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/Phone.java b/code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/model/Phone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java b/code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java
rename to code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java b/code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java
rename to code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java b/code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java
rename to code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java
diff --git a/autovalue/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java b/code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java
rename to code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java
diff --git a/autovalue/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java b/code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java
rename to code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java
diff --git a/autovalue/src/main/java/com/baeldung/autoservice/TranslationService.java b/code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autoservice/TranslationService.java
rename to code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoney.java
rename to code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java b/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java
rename to code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/Foo.java b/code-generation/src/main/java/com/baeldung/autovalue/Foo.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/Foo.java
rename to code-generation/src/main/java/com/baeldung/autovalue/Foo.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/ImmutableMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/ImmutableMoney.java
rename to code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/MutableMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/MutableMoney.java
rename to code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java
diff --git a/maven/src/main/resources/logback.xml b/code-generation/src/main/resources/logback.xml
similarity index 100%
rename from maven/src/main/resources/logback.xml
rename to code-generation/src/main/resources/logback.xml
diff --git a/autovalue/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java b/code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java
similarity index 100%
rename from autovalue/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java
rename to code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java
diff --git a/autovalue/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java b/code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java
similarity index 100%
rename from autovalue/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java
rename to code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java
diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md
index 1211dae76d..6359592da6 100644
--- a/core-groovy-2/README.md
+++ b/core-groovy-2/README.md
@@ -1,11 +1,14 @@
-# Groovy
+# Core Groovy 2
+
+This module contains articles about core Groovy concepts
## Relevant articles:
-- [String Matching in Groovy](http://www.baeldung.com/)
- [Template Engines in Groovy](https://www.baeldung.com/groovy-template-engines)
- [Groovy def Keyword](https://www.baeldung.com/groovy-def-keyword)
- [Pattern Matching in Strings in Groovy](https://www.baeldung.com/groovy-pattern-matching)
- [Working with XML in Groovy](https://www.baeldung.com/groovy-xml)
- [Integrating Groovy into Java Applications](https://www.baeldung.com/groovy-java-applications)
- [Concatenate Strings with Groovy](https://www.baeldung.com/groovy-concatenate-strings)
+- [Metaprogramming in Groovy](https://www.baeldung.com/groovy-metaprogramming)
+- [[<-- Prev]](/core-groovy)
\ No newline at end of file
diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml
index ba3fd0802b..91e31d4cba 100644
--- a/core-groovy-2/pom.xml
+++ b/core-groovy-2/pom.xml
@@ -48,6 +48,11 @@
${spock-core.version}test
+
+ com.github.groovy-wslite
+ groovy-wslite
+ ${groovy-wslite.version}
+
@@ -175,6 +180,7 @@
1.0.02.4.01.1-groovy-2.4
+ 1.1.33.8.11.2.32.5.7
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy
new file mode 100644
index 0000000000..479c39699f
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy
@@ -0,0 +1,17 @@
+package com.baeldung.category;
+
+class BaeldungCategory {
+
+ public static String capitalize(String self) {
+ String capitalizedStr = self;
+ if (self.size() > 0) {
+ capitalizedStr = self.substring(0, 1).toUpperCase() + self.substring(1);
+ }
+ return capitalizedStr
+ }
+
+ public static double toThePower(Number self, Number exponent) {
+ return Math.pow(self, exponent);
+ }
+
+}
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy
new file mode 100644
index 0000000000..ccf2ed519b
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy
@@ -0,0 +1,17 @@
+package com.baeldung.category;
+
+import groovy.lang.Category
+
+@Category(Number)
+class NumberCategory {
+
+ public Number cube() {
+ return this*this*this
+ }
+
+ public int divideWithRoundUp(BigDecimal divisor, boolean isRoundUp) {
+ def mathRound = isRoundUp ? BigDecimal.ROUND_UP : BigDecimal.ROUND_DOWN
+ return (int)new BigDecimal(this).divide(divisor, 0, mathRound)
+ }
+
+}
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
new file mode 100644
index 0000000000..a1f67b1e2e
--- /dev/null
+++ b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
@@ -0,0 +1,101 @@
+package com.baeldung.category
+
+import groovy.time.*
+import java.text.SimpleDateFormat
+import groovy.xml.*
+import groovy.xml.dom.*
+import com.baeldung.category.BaeldungCategory
+import com.baeldung.category.NumberCategory
+
+class CategoryUnitTest extends GroovyTestCase {
+
+ void test_whenUsingTimeCategory_thenOperationOnDate() {
+ def jan_1_2019 = new Date("01/01/2019")
+ use (TimeCategory) {
+ assert jan_1_2019 + 10.seconds == new Date("01/01/2019 00:00:10")
+
+ assert jan_1_2019 + 20.minutes == new Date("01/01/2019 00:20:00")
+
+ assert jan_1_2019 + 2.hours == new Date("01/01/2019 02:00:00")
+
+ assert jan_1_2019 - 1.day == new Date("12/31/2018")
+
+ assert jan_1_2019 + 2.weeks == new Date("01/15/2019")
+
+ assert jan_1_2019 - 2.months == new Date("11/01/2018")
+
+ assert jan_1_2019 + 3.years == new Date("01/01/2022")
+ }
+ }
+
+ void test_whenUsingTimeCategory_thenOperationOnNumber() {
+ SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")
+ use (TimeCategory) {
+ assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days)
+
+ sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
+ assert sdf.format(10.minutes.from.now) == sdf.format(new Date() + 10.minutes)
+ assert sdf.format(2.hours.ago) == sdf.format(new Date() - 2.hours)
+ }
+ }
+
+ void test_whenUsingDOMCategory_thenOperationOnXML() {
+
+ def baeldungArticlesText = """
+
+
+ An Intro to the Java Debug Interface (JDI)
+ A quick and practical overview of Java Debug Interface.
+
+
+ A Quick Guide to Working with Web Services in Groovy
+ Learn how to work with Web Services in Groovy.
+
+
+"""
+ def baeldungArticlesDom = DOMBuilder.newInstance().parseText(baeldungArticlesText)
+
+ def root = baeldungArticlesDom.documentElement
+
+ use (DOMCategory) {
+ assert root.article.size() == 2
+
+ def articles = root.article
+
+ assert articles[0].title.text() == "An Intro to the Java Debug Interface (JDI)"
+ assert articles[1].desc.text() == "Learn how to work with Web Services in Groovy."
+
+ def articleNode3 = root.appendNode(new QName("article"), ["core-java": "false"])
+
+ articleNode3.appendNode("title", "Metaprogramming in Groovy")
+ articleNode3.appendNode("desc", "Explore the concept of runtime and compile-time metaprogramming in Groovy")
+
+ assert root.article.size() == 3
+
+ assert root.article[2].title.text() == "Metaprogramming in Groovy"
+ }
+ }
+
+ void test_whenUsingBaeldungCategory_thenCapitalizeString() {
+ use (BaeldungCategory) {
+ assert "norman".capitalize() == "Norman"
+ }
+ }
+
+ void test_whenUsingBaeldungCategory_thenOperationsOnNumber() {
+ use (BaeldungCategory) {
+ assert 50.toThePower(2) == 2500
+ assert 2.4.toThePower(4) == 33.1776
+ }
+ }
+
+ void test_whenUsingNumberCategory_thenOperationsOnNumber() {
+ use (NumberCategory) {
+ assert 3.cube() == 27
+ assert 25.divideWithRoundUp(6, true) == 5
+ assert 120.23.divideWithRoundUp(6.1, true) == 20
+ assert 150.9.divideWithRoundUp(12.1, false) == 12
+ }
+ }
+
+}
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
new file mode 100644
index 0000000000..302959d0d9
--- /dev/null
+++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
@@ -0,0 +1,152 @@
+package com.baeldung.webservice
+
+import groovy.json.JsonSlurper
+import wslite.rest.ContentType
+import wslite.rest.RESTClient
+import wslite.rest.RESTClientException
+import wslite.soap.SOAPClient
+import wslite.soap.SOAPMessageBuilder
+import wslite.http.auth.HTTPBasicAuthorization
+import org.junit.Test
+
+class WebserviceUnitTest extends GroovyTestCase {
+
+ JsonSlurper jsonSlurper = new JsonSlurper()
+
+ static RESTClient client = new RESTClient("https://postman-echo.com")
+
+ static {
+ client.defaultAcceptHeader = ContentType.JSON
+ client.httpClient.sslTrustAllCerts = true
+ }
+
+ void test_whenSendingGet_thenRespose200() {
+ def postmanGet = new URL('https://postman-echo.com/get')
+ def getConnection = postmanGet.openConnection()
+ getConnection.requestMethod = 'GET'
+ assert getConnection.responseCode == 200
+ if (getConnection.responseCode == 200) {
+ assert jsonSlurper.parseText(getConnection.content.text)?.headers?.host == "postman-echo.com"
+ }
+ }
+
+ void test_whenSendingPost_thenRespose200() {
+ def postmanPost = new URL('https://postman-echo.com/post')
+ def query = "q=This is post request form parameter."
+ def postConnection = postmanPost.openConnection()
+ postConnection.requestMethod = 'POST'
+ assert postConnection.responseCode == 200
+ }
+
+ void test_whenSendingPostWithParams_thenRespose200() {
+ def postmanPost = new URL('https://postman-echo.com/post')
+ def form = "param1=This is request parameter."
+ def postConnection = postmanPost.openConnection()
+ postConnection.requestMethod = 'POST'
+ postConnection.doOutput = true
+ def text
+ postConnection.with {
+ outputStream.withWriter { outputStreamWriter ->
+ outputStreamWriter << form
+ }
+ text = content.text
+ }
+ assert postConnection.responseCode == 200
+ assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter."
+ }
+
+ void test_whenReadingRSS_thenReceiveFeed() {
+ def rssFeed = new XmlParser().parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en")
+ def stories = []
+ (0..4).each {
+ def item = rssFeed.channel.item.get(it)
+ stories << item.title.text()
+ }
+ assert stories.size() == 5
+ }
+
+ void test_whenReadingAtom_thenReceiveFeed() {
+ def atomFeed = new XmlParser().parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en")
+ def stories = []
+ (0..4).each {
+ def entry = atomFeed.entry.get(it)
+ stories << entry.title.text()
+ }
+ assert stories.size() == 5
+ }
+
+ void test_whenConsumingSoap_thenReceiveResponse() {
+ def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso"
+ def soapClient = new SOAPClient(url)
+ def message = new SOAPMessageBuilder().build({
+ body {
+ NumberToWords(xmlns: "http://www.dataaccess.com/webservicesserver/") {
+ ubiNum(1234)
+ }
+ }
+ })
+ def response = soapClient.send(message.toString());
+ def words = response.NumberToWordsResponse
+ assert words == "one thousand two hundred and thirty four "
+ }
+
+ void test_whenConsumingRestGet_thenReceiveResponse() {
+ def path = "/get"
+ def response
+ try {
+ response = client.get(path: path)
+ assert response.statusCode == 200
+ assert response.json?.headers?.host == "postman-echo.com"
+ } catch (RESTClientException e) {
+ assert e?.response?.statusCode != 200
+ }
+ }
+
+ void test_whenConsumingRestPost_thenReceiveResponse() {
+ def path = "/post"
+ def params = ["foo":1,"bar":2]
+ def response
+ try {
+ response = client.post(path: path) {
+ type ContentType.JSON
+ json params
+ }
+ assert response.json?.data == params
+ } catch (RESTClientException e) {
+ e.printStackTrace()
+ assert e?.response?.statusCode != 200
+ }
+ }
+
+ void test_whenBasicAuthentication_thenReceive200() {
+ def path = "/basic-auth"
+ def response
+ try {
+ client.authorization = new HTTPBasicAuthorization("postman", "password")
+ response = client.get(path: path)
+ assert response.statusCode == 200
+ assert response.json?.authenticated == true
+ } catch (RESTClientException e) {
+ e.printStackTrace()
+ assert e?.response?.statusCode != 200
+ }
+ }
+
+ void test_whenOAuth_thenReceive200() {
+ RESTClient oAuthClient = new RESTClient("https://postman-echo.com")
+ oAuthClient.defaultAcceptHeader = ContentType.JSON
+ oAuthClient.httpClient.sslTrustAllCerts = true
+
+ def path = "/oauth1"
+ def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp:1567089944, oauth_nonce: "URT7v4", oauth_version: 1.0, oauth_signature: 'RGgR/ktDmclkM0ISWaFzebtlO0A=']
+ def response
+ try {
+ response = oAuthClient.get(path: path, query: params)
+ assert response.statusCode == 200
+ assert response.statusMessage == "OK"
+ assert response.json.status == "pass"
+ } catch (RESTClientException e) {
+ assert e?.response?.statusCode != 200
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-groovy-collections/README.md b/core-groovy-collections/README.md
index aeba8933be..4afd214e7d 100644
--- a/core-groovy-collections/README.md
+++ b/core-groovy-collections/README.md
@@ -1,4 +1,6 @@
-# Groovy
+## Core Groovy Collections
+
+This module contains articles about Groovy core collections
## Relevant articles:
diff --git a/core-groovy/README.md b/core-groovy/README.md
index 321c37be8d..0f45eed879 100644
--- a/core-groovy/README.md
+++ b/core-groovy/README.md
@@ -1,9 +1,11 @@
-# Groovy
+# Core Groovy
+
+This module contains articles about core Groovy concepts
## Relevant articles:
-- [JDBC with Groovy](http://www.baeldung.com/jdbc-groovy)
-- [Working with JSON in Groovy](http://www.baeldung.com/groovy-json)
+- [JDBC with Groovy](https://www.baeldung.com/jdbc-groovy)
+- [Working with JSON in Groovy](https://www.baeldung.com/groovy-json)
- [Reading a File in Groovy](https://www.baeldung.com/groovy-file-read)
- [Types of Strings in Groovy](https://www.baeldung.com/groovy-strings)
- [A Quick Guide to Iterating a Map in Groovy](https://www.baeldung.com/groovy-map-iterating)
@@ -12,4 +14,5 @@
- [Finding Elements in Collections in Groovy](https://www.baeldung.com/groovy-collections-find-elements)
- [Lists in Groovy](https://www.baeldung.com/groovy-lists)
- [Converting a String to a Date in Groovy](https://www.baeldung.com/groovy-string-to-date)
-- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io)
\ No newline at end of file
+- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io)
+- [[More -->]](/core-groovy-2)
\ No newline at end of file
diff --git a/core-java-modules/README.md b/core-java-modules/README.md
index 9ce6057f32..55dacca916 100644
--- a/core-java-modules/README.md
+++ b/core-java-modules/README.md
@@ -1,3 +1,7 @@
+## Core Java Modules
+
+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)
diff --git a/core-java-modules/core-java-10/README.md b/core-java-modules/core-java-10/README.md
index 8fb4f8a7dd..2b57ec9064 100644
--- a/core-java-modules/core-java-10/README.md
+++ b/core-java-modules/core-java-10/README.md
@@ -1,3 +1,6 @@
+## Core Java 10
+
+This module contains articles about Java 10 core features
### Relevant Articles:
diff --git a/core-java-modules/core-java-11/README.md b/core-java-modules/core-java-11/README.md
index 11c7d9d388..514f24a4ae 100644
--- a/core-java-modules/core-java-11/README.md
+++ b/core-java-modules/core-java-11/README.md
@@ -1,3 +1,7 @@
+## Core Java 11
+
+This module contains articles about Java 11 core features
+
### Relevant articles
- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code)
diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md
index d11510b2aa..9201add1d7 100644
--- a/core-java-modules/core-java-8-2/README.md
+++ b/core-java-modules/core-java-8-2/README.md
@@ -1,10 +1,11 @@
-=========
+## Core Java 8 (part 2)
-## Core Java 8 Cookbooks and Examples (part 2)
+This module contains articles about Java 8 core features
### Relevant Articles:
- [Anonymous Classes in Java](http://www.baeldung.com/)
- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution)
-- [Run JAR Application With Command Line Arguments](https://www.baeldung.com/java-run-jar-with-arguments)
+- [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments)
- [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit)
- [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface)
+- [[<-- Prev]](/core-java-modules/core-java-8)
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md
index 6e79eddd16..72bdafe5fa 100644
--- a/core-java-modules/core-java-8/README.md
+++ b/core-java-modules/core-java-8/README.md
@@ -1,38 +1,15 @@
-=========
+## Core Java 8
-## Core Java 8 Cookbooks and Examples
+This module contains articles about Java 8 core features
### Relevant Articles:
-- [Guide to Java 8’s Collectors](http://www.baeldung.com/java-8-collectors)
-- [New Features in Java 8](http://www.baeldung.com/java-8-new-features)
-- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
-- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector)
-- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern)
-- [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing)
-- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional)
-- [Guide to the Java 8 forEach](http://www.baeldung.com/foreach-java)
-- [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap)
-- [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods)
-- [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency)
-- [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator)
-- [Java 8 Math New Methods](http://www.baeldung.com/java-8-math)
-- [Overview of Java Built-in Annotations](http://www.baeldung.com/java-default-annotations)
-- [Finding Min/Max in an Array with Java](http://www.baeldung.com/java-array-min-max)
-- [Internationalization and Localization in Java 8](http://www.baeldung.com/java-8-localization)
-- [Java Optional – orElse() vs orElseGet()](http://www.baeldung.com/java-optional-or-else-vs-or-else-get)
-- [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection)
-- [Java 8 Unsigned Arithmetic Support](http://www.baeldung.com/java-unsigned-arithmetic)
-- [Generalized Target-Type Inference in Java](http://www.baeldung.com/java-generalized-target-type-inference)
-- [Overriding System Time for Testing in Java](http://www.baeldung.com/java-override-system-time)
-- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone)
-- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance)
-- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects)
-- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
-- [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements)
-- [Java @Override Annotation](https://www.baeldung.com/java-override)
-- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings)
-- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
-- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated)
-- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
-- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
-- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)
+- [New Features in Java 8](https://www.baeldung.com/java-8-new-features)
+- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector)
+- [Strategy Design Pattern in Java 8](https://www.baeldung.com/java-strategy-pattern)
+- [Guide to Java 8 Comparator.comparing()](https://www.baeldung.com/java-8-comparator-comparing)
+- [Guide to the Java 8 forEach](https://www.baeldung.com/foreach-java)
+- [Introduction to Spliterator in Java](https://www.baeldung.com/java-spliterator)
+- [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max)
+- [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization)
+- [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference)
+- [[More -->]](/core-java-modules/core-java-8-2)
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
index 28182e515b..9ef3cd1201 100644
--- a/core-java-modules/core-java-8/pom.xml
+++ b/core-java-modules/core-java-8/pom.xml
@@ -116,12 +116,6 @@
${powermock.version}test
-
- org.jmockit
- jmockit
- ${jmockit.version}
- test
-
@@ -134,16 +128,6 @@
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- 1.8
- 1.8
- -parameters
-
- org.springframework.bootspring-boot-maven-plugin
@@ -160,16 +144,6 @@
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
-
- true
-
-
@@ -186,13 +160,11 @@
3.6.11.8.92.0.0-RC.4
- 1.441.7.01.191.192.0.4.RELEASE
- 3.8.02.22.1
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java
deleted file mode 100644
index 46018faf80..0000000000
--- a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.optional;
-
-public class PersonRepository {
-
- public String findNameById(String id) {
- return id == null ? null : "Name";
- }
-
-}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
deleted file mode 100644
index 32879aed0c..0000000000
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.baeldung.java8;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Date;
-import java.util.Scanner;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JavaTryWithResourcesLongRunningUnitTest {
-
- private static final Logger LOG = LoggerFactory.getLogger(JavaTryWithResourcesLongRunningUnitTest.class);
-
- private static final String TEST_STRING_HELLO_WORLD = "Hello World";
- private Date resource1Date, resource2Date;
-
- // tests
-
- /* Example for using Try_with_resources */
- @Test
- public void whenWritingToStringWriter_thenCorrectlyWritten() {
- final StringWriter sw = new StringWriter();
- try (PrintWriter pw = new PrintWriter(sw, true)) {
- pw.print(TEST_STRING_HELLO_WORLD);
- }
-
- Assert.assertEquals(sw.getBuffer()
- .toString(), TEST_STRING_HELLO_WORLD);
- }
-
- /* Example for using multiple resources */
- @Test
- public void givenStringToScanner_whenWritingToStringWriter_thenCorrectlyWritten() {
-
- final StringWriter sw = new StringWriter();
- try (Scanner sc = new Scanner(TEST_STRING_HELLO_WORLD); PrintWriter pw = new PrintWriter(sw, true)) {
- while (sc.hasNext()) {
- pw.print(sc.nextLine());
- }
- }
-
- Assert.assertEquals(sw.getBuffer()
- .toString(), TEST_STRING_HELLO_WORLD);
- }
-
- /* Example to show order in which the resources are closed */
- @Test
- public void whenFirstAutoClosableResourceIsinitializedFirst_thenFirstAutoClosableResourceIsReleasedFirst() throws Exception {
- try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst(); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {
- af.doSomething();
- as.doSomething();
- }
- Assert.assertTrue(resource1Date.after(resource2Date));
- }
-
- class AutoCloseableResourcesFirst implements AutoCloseable {
- public AutoCloseableResourcesFirst() {
- LOG.debug("Constructor -> AutoCloseableResources_First");
- }
-
- public void doSomething() {
- LOG.debug("Something -> AutoCloseableResources_First");
- }
-
- @Override
- public void close() throws Exception {
- LOG.debug("Closed AutoCloseableResources_First");
- resource1Date = new Date();
- }
- }
-
- class AutoCloseableResourcesSecond implements AutoCloseable {
- public AutoCloseableResourcesSecond() {
- LOG.debug("Constructor -> AutoCloseableResources_Second");
- }
-
- public void doSomething() {
- LOG.debug("Something -> AutoCloseableResources_Second");
- }
-
- @Override
- public void close() throws Exception {
- LOG.debug("Closed AutoCloseableResources_Second");
- resource2Date = new Date();
- Thread.sleep(10000);
- }
- }
-
-}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
rename to core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
index eea019da2c..323586b85f 100644
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
+++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.java_8_features.groupingby;
import com.baeldung.java_8_features.groupingby.BlogPost;
import com.baeldung.java_8_features.groupingby.BlogPostType;
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java
deleted file mode 100644
index 4efa625ccd..0000000000
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.baeldung.optional;
-
-import org.junit.Test;
-
-import java.util.Optional;
-
-import static org.junit.jupiter.api.Assertions.assertAll;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-public class PersonRepositoryUnitTest {
-
- PersonRepository personRepository = new PersonRepository();
-
- @Test
- public void whenIdIsNull_thenExceptionIsThrown() {
- assertThrows(IllegalArgumentException.class,
- () ->
- Optional
- .ofNullable(personRepository.findNameById(null))
- .orElseThrow(IllegalArgumentException::new));
- }
-
- @Test
- public void whenIdIsNonNull_thenNoExceptionIsThrown() {
- assertAll(
- () ->
- Optional
- .ofNullable(personRepository.findNameById("id"))
- .orElseThrow(RuntimeException::new));
- }
-
- @Test
- public void whenIdNonNull_thenReturnsNameUpperCase() {
- String name = Optional
- .ofNullable(personRepository.findNameById("id"))
- .map(String::toUpperCase)
- .orElseThrow(RuntimeException::new);
-
- assertEquals("NAME", name);
- }
-
-}
\ 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 8b52ce79b4..f4939ae1e1 100644
--- a/core-java-modules/core-java-9/README.md
+++ b/core-java-modules/core-java-9/README.md
@@ -1,8 +1,6 @@
-=========
+## Core Java 9
-## Core Java 9 Examples
-
-[Java 9 New Features](http://www.baeldung.com/new-java-9)
+This module contains articles about Java 9 core features
### Relevant Articles:
diff --git a/core-java-modules/core-java-annotations/README.md b/core-java-modules/core-java-annotations/README.md
new file mode 100644
index 0000000000..a125e8abd5
--- /dev/null
+++ b/core-java-modules/core-java-annotations/README.md
@@ -0,0 +1,11 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [Java @Override Annotation](https://www.baeldung.com/java-override)
+- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings)
+- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
+- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated)
+- [Overview of Java Built-in Annotations](https://www.baeldung.com/java-default-annotations)
+- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
\ No newline at end of file
diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml
new file mode 100644
index 0000000000..7d7d7d4f7e
--- /dev/null
+++ b/core-java-modules/core-java-annotations/pom.xml
@@ -0,0 +1,72 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-annotations
+ 0.1.0-SNAPSHOT
+ core-java-annotations
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
+
+
+
+
+ core-java-annotations
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+ 1.8.9
+ 1.19
+ 1.19
+
+ 2.22.1
+
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntConsumer.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntConsumer.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Interval.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Interval.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Interval.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Interval.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntervalUsage.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntervalUsage.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Intervals.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Intervals.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperationImpl.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperationImpl.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Init.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Init.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Init.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Init.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonElement.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonElement.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializable.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializable.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Person.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Person.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Person.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Person.java
diff --git a/spring-boot-angular-ecommerce/src/main/resources/logback.xml b/core-java-modules/core-java-annotations/src/main/resources/logback.xml
similarity index 100%
rename from spring-boot-angular-ecommerce/src/main/resources/logback.xml
rename to core-java-modules/core-java-annotations/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java b/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
rename to core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
diff --git a/core-java-modules/core-java-arrays-2/README.MD b/core-java-modules/core-java-arrays-2/README.MD
deleted file mode 100644
index f272f4d299..0000000000
--- a/core-java-modules/core-java-arrays-2/README.MD
+++ /dev/null
@@ -1,5 +0,0 @@
-## Relevant Articles
-
-- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end)
-- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array)
-- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array)
diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md
new file mode 100644
index 0000000000..5fa2f2bf4c
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/README.md
@@ -0,0 +1,15 @@
+## Core Java Arrays (Part 2)
+
+This module contains articles about Java arrays
+
+## Relevant Articles
+
+- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end)
+- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array)
+- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array)
+- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array)
+- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations)
+- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection)
+- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element)
+- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
+- [[<-- Prev]](/core-java-modules/core-java-arrays)
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/AddElementToEndOfArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/AddElementToEndOfArray.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
similarity index 97%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
index d8cc0afd61..94a00f7aba 100644
--- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
+++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
@@ -1,19 +1,14 @@
package com.baeldung.array.operations;
+import org.apache.commons.lang3.ArrayUtils;
+
import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.Random;
-import java.util.Set;
+import java.util.*;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.function.Predicate;
import java.util.stream.Stream;
-import org.apache.commons.lang3.ArrayUtils;
-
public class ArrayOperations {
// Get the first and last item of an array
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
index ea52cd17d9..567b870ef1 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
@@ -1,13 +1,10 @@
package com.baeldung.array;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
import org.apache.commons.lang3.ArrayUtils;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
class RemoveElementFromAnArrayUnitTest {
private final RemoveElementFromAnArray sut = new RemoveElementFromAnArray();
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
similarity index 80%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
index a2cd273f21..7656783052 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
@@ -1,12 +1,10 @@
package com.baeldung.array.conversions;
-import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloat;
-import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloatWithByteBuffer;
-import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArray;
-import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArrayWithByteBuffer;
+import org.junit.Test;
+
+import static com.baeldung.array.conversions.FloatToByteArray.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
-import org.junit.Test;
public class FloatToByteArrayUnitTest {
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
index a9c6d97d9f..d72681ca05 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
@@ -1,13 +1,13 @@
package com.baeldung.array.operations;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.Arrays;
-
import org.assertj.core.api.Condition;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
public class ArrayOperationsUnitTest {
private Integer[] defaultObjectArray;
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
index 3c61060ea8..1560cc5701 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
@@ -2,9 +2,7 @@ package com.baeldung.array.operations;
import org.junit.jupiter.api.Test;
-import static com.baeldung.array.operations.ArrayOperations.intersectionMultiSet;
-import static com.baeldung.array.operations.ArrayOperations.intersectionSet;
-import static com.baeldung.array.operations.ArrayOperations.intersectionSimple;
+import static com.baeldung.array.operations.ArrayOperations.*;
import static org.assertj.core.api.Assertions.assertThat;
class IntersectionUnitTest {
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java
index f2b1bd9d88..83a97973f3 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.list.removefirst;
+package com.baeldung.array.removefirst;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md
index 45feff3edc..42fe3f83a1 100644
--- a/core-java-modules/core-java-arrays/README.md
+++ b/core-java-modules/core-java-arrays/README.md
@@ -1,19 +1,17 @@
-=========
+## Core Java Arrays
-## Core Java Arrays Cookbooks and Examples
+This module contains articles about Java arrays
### Relevant Articles:
-- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy)
-- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
-- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
-- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays)
-- [Multi-Dimensional Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
-- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average)
+- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy)
+- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value)
+- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array)
+- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays)
+- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays)
+- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average)
- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide)
-- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
-- [Array Operations in Java](http://www.baeldung.com/java-common-array-operations)
-- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection)
+- [Read and Write User Input in Java](https://www.baeldung.com/java-console-input-output)
+- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array)
- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays)
-- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array)
-- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array)
-- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element)
+- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array)
+- [[More -->]](/core-java-modules/core-java-arrays-2)
diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md
new file mode 100644
index 0000000000..13ca191edb
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/README.md
@@ -0,0 +1,15 @@
+=========
+
+## Core Java Collections Cookbooks and Examples
+
+### Relevant Articles:
+- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
+- [How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering)
+- [Join and Split Arrays and Collections in Java](https://www.baeldung.com/java-join-and-split)
+- [Java – Combine Multiple Collections](https://www.baeldung.com/java-combine-multiple-collections)
+- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
+- [Shuffling Collections In Java](https://www.baeldung.com/java-shuffle-collection)
+- [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)
+
diff --git a/core-java-modules/core-java-collections-2/pom.xml b/core-java-modules/core-java-collections-2/pom.xml
new file mode 100644
index 0000000000..0ac53ec180
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/pom.xml
@@ -0,0 +1,58 @@
+
+ 4.0.0
+ core-java-collections-2
+ 0.0.1-SNAPSHOT
+ core-java-collections-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse.collections.version}
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-exec
+ ${commons-exec.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
+
+
+
+
+ 7.1.0
+ 4.1
+ 3.11.1
+ 1.2.0
+ 1.3
+
+
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java
index 2ad48033c0..5f63123f6a 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.Arrays;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java
index 3fdf672758..a45e9cdfe8 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java
index d8bbd01ed3..d4d21d0dad 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.Collection;
import java.util.HashMap;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java
index 5f531c1d43..27a5681eee 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.Collection;
import java.util.HashSet;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java
index 58f9f6af54..de5158e147 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java
index 981d6ca241..a7b78b1f9b 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java
index 88338fd6d4..0a2a782c33 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java
index f074f74199..a9fb8481e5 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
import java.util.function.Predicate;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java
index 03864f16f2..b96e2bb571 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.iterable;
+package com.baeldung.collections.iterablesize;
import java.util.Collection;
import java.util.stream.StreamSupport;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
similarity index 92%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
index 2405c26aac..ce5cbb39d6 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Collection;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
similarity index 92%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
index da767d4563..68d51c2d87 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Collection;
import java.util.Optional;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
index 0c10f1cebc..6c606ebedd 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Collection;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java
index 2f5e91596f..4089382376 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java
similarity index 93%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java
index 86b91b3fdc..d551b04eae 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java
similarity index 93%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java
index bf6db68bae..e0dc75f428 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java
index c77e996616..c01c334f01 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java
index 3b80d773ad..312f5582ba 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.junit.Assert.*;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java
index c5851d7daf..5443e56e5f 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java
index 3fa9cc7dc4..644f178f80 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java
index 330827bdc2..c9976eb6de 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java
@@ -1,5 +1,5 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java
index b30805d471..db387818b8 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java
index 4bc413dee0..35702a74b3 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.iterable;
+package com.baeldung.collections.iterablesize;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java
index c288cf499d..1904fd1587 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.collections.joinsplit;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java
index c594529f41..1fbe210ad4 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.collections.joinsplit;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java
index d43075c925..ebef8d6875 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.collections.multiplecollections;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -14,7 +14,7 @@ import java.util.stream.Stream;
import static java.util.Arrays.asList;
-public class CollectionsConcatenateUnitTest {
+public class CombineMultipleCollectionsUnitTest {
@Test
public void givenUsingJava8_whenConcatenatingUsingConcat_thenCorrect() {
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
index 875045946d..42cda7926c 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
index 402f1a6a19..666d5e7d04 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
index bb6152371d..2e8eeb35ad 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java
index 1b379f32de..998dbe6cca 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import org.junit.Before;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java
index d013907c9a..041e67ba7f 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.shufflingcollections;
+package com.baeldung.collections.shufflingcollections;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java
index 99af49c8d3..e838dbea18 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.sorting;
+package com.baeldung.collections.sorting;
public class Employee implements Comparable {
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java
index ca9c9b4b5d..2505adcea7 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.sorting;
+package com.baeldung.collections.sorting;
import com.google.common.primitives.Ints;
import org.apache.commons.lang3.ArrayUtils;
diff --git a/core-java-modules/core-java-collections-3/README.md b/core-java-modules/core-java-collections-3/README.md
new file mode 100644
index 0000000000..9218384640
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/README.md
@@ -0,0 +1,11 @@
+=========
+
+## Core Java Collections Cookbooks and Examples
+
+### Relevant Articles:
+- [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint)
+- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector)
+- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences)
+- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall)
+- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
+- [Fail-Safe Iterator vs Fail-Fast Iterator](https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml
new file mode 100644
index 0000000000..84c7865e68
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/pom.xml
@@ -0,0 +1,34 @@
+
+ 4.0.0
+ core-java-collections-3
+ 0.1.0-SNAPSHOT
+ core-java-collections-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${openjdk.jmh.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ 1.19
+ 3.11.1
+
+
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java
index 331ae8d908..7fcadf019c 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java
@@ -1,4 +1,4 @@
-package com.baeldung.performance;
+package com.baeldung.collections.arraylistvsvector;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java
new file mode 100644
index 0000000000..02f25a7558
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java
@@ -0,0 +1,55 @@
+package com.baeldung.collections.arraylistvsvector;
+
+public class Employee {
+
+ private Long id;
+ private String name;
+
+ public Employee(Long id, String name) {
+ this.name = name;
+ this.id = id;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Employee employee = (Employee) o;
+
+ if (!id.equals(employee.id)) return false;
+ return name.equals(employee.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id.hashCode();
+ result = 31 * result + name.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Employee{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java
similarity index 92%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java
index 7debc07911..e82e47cdbb 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.list;
+package com.baeldung.collections.arraylistvsvector;
import java.util.Enumeration;
import java.util.Iterator;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java
index 921e1608ea..76edd10e92 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java
@@ -1,4 +1,4 @@
-package com.baeldung.performance;
+package com.baeldung.collections.containsperformance;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java
new file mode 100644
index 0000000000..6c60f8772c
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java
@@ -0,0 +1,55 @@
+package com.baeldung.collections.containsperformance;
+
+public class Employee {
+
+ private Long id;
+ private String name;
+
+ public Employee(Long id, String name) {
+ this.name = name;
+ this.id = id;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Employee employee = (Employee) o;
+
+ if (!id.equals(employee.id)) return false;
+ return name.equals(employee.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id.hashCode();
+ result = 31 * result + name.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Employee{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java
index 5e7cfdb54f..23e6bbda77 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java
@@ -1,4 +1,4 @@
-package com.baeldung.iterators;
+package com.baeldung.collections.iterators;
import java.util.ArrayList;
import java.util.Iterator;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java
index b93f8e9cc2..1cd56aa29d 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java
@@ -1,4 +1,4 @@
-package com.baeldung.performance;
+package com.baeldung.collections.sortingcomparison;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java
similarity index 94%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java
index 1eff522877..abe7a12a00 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.sort;
+package com.baeldung.collections.sortingcomparison;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java
index 8b0a7ef0db..9cd9c6aa50 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.collection;
+package com.baeldung.collections.clearvsremoveall;
import org.junit.jupiter.api.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
index 5218332d60..b00a7fd953 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.hashmapvshashtable;
+package com.baeldung.collections.hashmapvshashtable;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java
similarity index 77%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java
rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java
index 36e1f4a83c..95cf590857 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java
@@ -1,8 +1,8 @@
-package com.baeldung.iterators;
+package com.baeldung.collections.iterators;
-import static com.baeldung.iterators.Iterators.failFast1;
-import static com.baeldung.iterators.Iterators.failFast2;
-import static com.baeldung.iterators.Iterators.failSafe1;
+import static com.baeldung.collections.iterators.Iterators.failFast1;
+import static com.baeldung.collections.iterators.Iterators.failFast2;
+import static com.baeldung.collections.iterators.Iterators.failSafe1;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md
index 3d1cdd5085..4423a77c78 100644
--- a/core-java-modules/core-java-collections-array-list/README.md
+++ b/core-java-modules/core-java-collections-array-list/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections ArrayList
-## Core Java Collections Array List Cookbooks and Examples
+This module contains articles about the Java ArrayList collection
### Relevant Articles:
- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java
new file mode 100644
index 0000000000..df9b3d987d
--- /dev/null
+++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java
@@ -0,0 +1,40 @@
+package com.baeldung.java.list;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class RemoveFromList {
+
+ public static void main(String[] args) {
+ List sports = new ArrayList<>();
+ sports.add("Football");
+ sports.add("Basketball");
+ sports.add("Baseball");
+ sports.add("Boxing");
+ sports.add("Cycling");
+
+ System.out.println("List before removing: " + sports);
+
+ // Remove with index
+ sports.remove(1);
+
+ // Remove with an element
+ sports.remove("Baseball");
+
+ // Iterator remove method
+ Iterator iterator = sports.iterator();
+ while (iterator.hasNext()) {
+ if (iterator.next().equals("Boxing")) {
+ iterator.remove();
+ break;
+ }
+ }
+
+ // ArrayList removeIf method (Java 8)
+ sports.removeIf(p -> p.equals("Cycling"));
+
+ System.out.println("List after removing: " + sports);
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-2/README.md b/core-java-modules/core-java-collections-list-2/README.md
index be10a0210c..fada9d96ac 100644
--- a/core-java-modules/core-java-collections-list-2/README.md
+++ b/core-java-modules/core-java-collections-list-2/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections List (Part 2)
-## Core Java Collections List Cookbooks and Examples
+This module contains articles about the Java List collection
### Relevant Articles:
- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
@@ -11,7 +11,4 @@
- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection)
-- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal)
-- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int)
-- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance)
-- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list)
\ No newline at end of file
+- [[<-- Prev]](/core-java-modules/core-java-collections-list)[[Next -->]](/core-java-modules/core-java-collections-list-3)
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-2/pom.xml b/core-java-modules/core-java-collections-list-2/pom.xml
index d200a3c90c..727de0818a 100644
--- a/core-java-modules/core-java-collections-list-2/pom.xml
+++ b/core-java-modules/core-java-collections-list-2/pom.xml
@@ -36,41 +36,11 @@
${lombok.version}provided
-
-
- 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-core.version}
- 4.13.8.13.11.1
- 3.0.2
- 8.1.0
- 1.2.0
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
index b484eecef7..25f39e9a13 100644
--- a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
+++ b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
@@ -42,7 +42,7 @@ public class ListInitializationUnitTest {
}
@Test
- public void givenArrayAsList_whenCreated_thenShareReference() {
+ public void givenArraysAsList_whenCreated_thenShareReference() {
String[] array = { "foo", "bar" };
List list = Arrays.asList(array);
array[0] = "baz";
diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md
new file mode 100644
index 0000000000..3d4004de6f
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/README.md
@@ -0,0 +1,12 @@
+## Core Java Collections List (Part 3)
+
+This module contains articles about the Java List collection
+
+### Relevant Articles:
+- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
+- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another)
+- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal)
+- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int)
+- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance)
+- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list)
+- [[<-- Prev]](/core-java-modules/core-java-collections-list-2)
diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml
new file mode 100644
index 0000000000..064b65d19e
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/pom.xml
@@ -0,0 +1,76 @@
+
+ 4.0.0
+ core-java-collections-list-3
+ 0.1.0-SNAPSHOT
+ core-java-collections-list-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ 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-core.version}
+
+
+
+
+ 4.1
+ 3.8.1
+ 3.11.1
+ 3.0.2
+ 8.1.0
+ 1.2.0
+
+
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/collection/filtering/Employee.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/collection/filtering/Employee.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/collection/filtering/Employee.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/collection/filtering/Employee.java
diff --git a/core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/CopyListService.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/CopyListService.java
diff --git a/core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/Flower.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/Flower.java
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
diff --git a/testing-modules/mocks/jmockit/src/main/resources/logback.xml b/core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml
similarity index 100%
rename from testing-modules/mocks/jmockit/src/main/resources/logback.xml
rename to core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/CollectionsEmpty.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/CollectionsEmpty.java
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md
index 4bc1c5fb57..ff7a9876a2 100644
--- a/core-java-modules/core-java-collections-list/README.md
+++ b/core-java-modules/core-java-collections-list/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections List
-## Core Java Collections List Cookbooks and Examples
+This module contains articles about the Java List collection
### Relevant Articles:
- [Java – Get Random Item/Element From a List](http://www.baeldung.com/java-random-list-element)
@@ -10,7 +10,6 @@
- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards)
- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list)
- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java)
-- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another)
- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max)
-- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
-- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list)
\ No newline at end of file
+- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list)
+- [[Next -->]](/core-java-modules/core-java-collections-list-2)
diff --git a/core-java-modules/core-java-collections-set/README.md b/core-java-modules/core-java-collections-set/README.md
index 618b4e932c..2b34ef3449 100644
--- a/core-java-modules/core-java-collections-set/README.md
+++ b/core-java-modules/core-java-collections-set/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections Set
-## Core Java Sets Cookbooks and Examples
+This module contains articles about the Java Set collection
### Relevant Articles:
- [Set Operations in Java](http://www.baeldung.com/set-operations-in-java)
diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md
index b34293769d..340c2b286e 100644
--- a/core-java-modules/core-java-collections/README.md
+++ b/core-java-modules/core-java-collections/README.md
@@ -1,31 +1,16 @@
-=========
+## Core Java Collections
-## Core Java Collections Cookbooks and Examples
+This module contains articles about Java collections
### Relevant Articles:
-- [Java – Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections)
-- [Collect a Java Stream to an Immutable Collection](http://www.baeldung.com/java-stream-immutable-collection)
-- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque)
-- [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size)
-- [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering)
-- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
-- [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
-- [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection)
-- [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table)
-- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections)
+- [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection)
+- [Introduction to the Java ArrayDeque](https://www.baeldung.com/java-array-deque)
+- [An Introduction to Java.util.Hashtable Class](https://www.baeldung.com/java-hash-table)
- [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe)
-- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall)
-- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
- [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity)
-- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream)
-- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
-- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
-- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
-- [Sorting in Java](http://www.baeldung.com/java-sorting)
-- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map)
-- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator)
-- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences)
-- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector)
+- [A Guide to Iterator in Java](https://www.baeldung.com/java-iterator)
- [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack)
-- [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint)
+- [Guide to the Java Queue Interface](https://www.baeldung.com/java-queue)
+- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
+- [[More -->]](/core-java-modules/core-java-collections-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections/pom.xml b/core-java-modules/core-java-collections/pom.xml
index e5b89c3d16..7fd702845b 100644
--- a/core-java-modules/core-java-collections/pom.xml
+++ b/core-java-modules/core-java-collections/pom.xml
@@ -14,33 +14,12 @@
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.eclipse.collections
- eclipse-collections
- ${eclipse.collections.version}
- org.assertjassertj-core${assertj.version}test
-
- org.junit.platform
- junit-platform-runner
- ${junit.platform.version}
- test
- org.openjdk.jmhjmh-core
@@ -51,11 +30,6 @@
jmh-generator-annprocess${openjdk.jmh.version}
-
- org.apache.commons
- commons-exec
- ${commons-exec.version}
- org.projectlomboklombok
@@ -66,13 +40,6 @@
1.19
- 1.2.0
- 3.8.1
- 4.1
- 4.01
- 1.7.03.11.1
- 7.1.0
- 1.3
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java b/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java
similarity index 90%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java
rename to core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java
index 093308a34a..f974a24839 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java
+++ b/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.application;
+package com.baeldung.synchronizedcollections;
import java.util.Arrays;
import java.util.Collections;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java
deleted file mode 100644
index d0d8c3923c..0000000000
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.baeldung.java.collections;
-
-import org.junit.Test;
-
-import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
-
-public class ConcurrentModificationExceptionUnitTest {
-
- @Test
- public void changingContentWithSetDoesNotThrowConcurrentModificationException() throws Exception {
- ArrayList
@@ -274,6 +289,8 @@
1.180.1.5
+ 3.1.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java
new file mode 100644
index 0000000000..7512b177df
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java
@@ -0,0 +1,42 @@
+package com.baeldung.resource;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.stream.Collectors;
+
+public class MyResourceLoader {
+
+ private void loadFileWithReader() throws IOException {
+
+ try (FileReader fileReader = new FileReader("src/main/resources/input.txt");
+ BufferedReader reader = new BufferedReader(fileReader)) {
+ String contents = reader.lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ System.out.println(contents);
+ }
+
+ }
+
+ private void loadFileAsResource() throws IOException {
+
+ try (InputStream inputStream = getClass().getResourceAsStream("/input.txt");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+ String contents = reader.lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ System.out.println(contents);
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+
+ MyResourceLoader resourceLoader = new MyResourceLoader();
+
+ resourceLoader.loadFileAsResource();
+ resourceLoader.loadFileWithReader();
+
+ }
+
+}
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java
index e781489808..b837c6b4dd 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.file;
+package com.baeldung.readfile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
diff --git a/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java
new file mode 100644
index 0000000000..8bca55c5f0
--- /dev/null
+++ b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java
@@ -0,0 +1,33 @@
+package com.baeldung.systemgc;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+
+import static java.util.UUID.randomUUID;
+
+public class DemoApplication {
+
+ private static final Map cache = new HashMap();
+
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+
+ while (scanner.hasNext()) {
+ final String next = scanner.next();
+ if ("fill".equals(next)) {
+ for (int i = 0; i < 1000000; i++) {
+ cache.put(randomUUID().toString(), randomUUID().toString());
+ }
+ } else if ("invalidate".equals(next)) {
+ cache.clear();
+ } else if ("gc".equals(next)) {
+ System.gc();
+ } else if ("exit".equals(next)) {
+ System.exit(0);
+ } else {
+ System.out.println("unknown");
+ }
+ }
+ }
+}
\ 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 98fff64d68..832d4783f2 100644
--- a/core-java-modules/core-java-lambdas/README.md
+++ b/core-java-modules/core-java-lambdas/README.md
@@ -6,3 +6,4 @@
- [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
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/Computer.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/Computer.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
index 317808d893..ea274072ea 100644
--- a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
+++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
@@ -1,10 +1,10 @@
package com.baeldung.doublecolon;
-import com.baeldung.doublecolon.function.ComputerPredicate;
-
import java.util.ArrayList;
import java.util.List;
+import com.baeldung.doublecolon.function.ComputerPredicate;
+
public class ComputerUtils {
static final ComputerPredicate after2010Predicate = (c) -> (c.getAge() > 2010);
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/MacbookPro.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/MacbookPro.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
diff --git a/core-java-modules/core-java-arrays-2/.gitignore b/core-java-modules/core-java-lang-2/.gitignore
similarity index 100%
rename from core-java-modules/core-java-arrays-2/.gitignore
rename to core-java-modules/core-java-lang-2/.gitignore
diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md
new file mode 100644
index 0000000000..9904e59035
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/README.md
@@ -0,0 +1,7 @@
+## Core Java Lang (Part 2)
+
+This module contains articles about core features in the Java language
+
+### Relevant Articles:
+- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects)
+- [[<-- Prev]](/core-java-modules/core-java-lang)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
new file mode 100644
index 0000000000..fb4a5bd009
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -0,0 +1,50 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang-2
+ 0.1.0-SNAPSHOT
+ core-java-lang-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
+
+
+
+
+ core-java-lang-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 1.19
+ 1.19
+
+
+
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java
new file mode 100644
index 0000000000..d6a7dec8aa
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java
@@ -0,0 +1,12 @@
+package com.baeldung.commandlinearguments;
+
+public class CliExample {
+
+ public static void main(String[] args) {
+ System.out.println("Argument count: " + args.length);
+ for (int i = 0; i < args.length; i++) {
+ System.out.println("Argument " + i + ": " + args[i]);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java
new file mode 100644
index 0000000000..899e03416e
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java
@@ -0,0 +1,12 @@
+package com.baeldung.commandlinearguments;
+
+public class CliExampleWithVarargs {
+
+ public static void main(String... args) {
+ System.out.println("Argument count: " + args.length);
+ for (int i = 0; i < args.length; i++) {
+ System.out.println("Argument " + i + ": " + args[i]);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BenchmarkRunner.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BenchmarkRunner.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BenchmarkRunner.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BenchmarkRunner.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/Lookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/Lookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/Lookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/Lookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java
diff --git a/core-java-modules/core-java-lang-math/README.md b/core-java-modules/core-java-lang-math/README.md
new file mode 100644
index 0000000000..cfa3052f43
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/README.md
@@ -0,0 +1,7 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [Java 8 Math New Methods](https://www.baeldung.com/java-8-math)
+- [Java 8 Unsigned Arithmetic Support](https://www.baeldung.com/java-unsigned-arithmetic)
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
new file mode 100644
index 0000000000..f3e5132e5b
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -0,0 +1,49 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang-math
+ 0.1.0-SNAPSHOT
+ core-java-lang-math
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-lang-math
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+ 1.8.9
+
+ 2.22.1
+
+
diff --git a/testing-modules/testing/src/main/resources/logback.xml b/core-java-modules/core-java-lang-math/src/main/resources/logback.xml
similarity index 100%
rename from testing-modules/testing/src/main/resources/logback.xml
rename to core-java-modules/core-java-lang-math/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java
rename to core-java-modules/core-java-lang-math/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java
rename to core-java-modules/core-java-lang-math/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index 72c3c6742b..dca7b14d68 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -1,9 +1,18 @@
-=========
+## Core Java Lang OOP (Part 2)
-## Core Java Lang OOP 2 Cookbooks and Examples
+This module contains articles about Object-oriented programming (OOP) in Java
### Relevant Articles:
- [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors)
- [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error)
- [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
- [Raw Types in Java](https://www.baeldung.com/raw-types-java)
+- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword)
+- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
+- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
+- [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object)
+- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition)
+- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
+- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
+- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
+- [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml
index 669a37b0f5..d27df147b7 100644
--- a/core-java-modules/core-java-lang-oop-2/pom.xml
+++ b/core-java-modules/core-java-lang-oop-2/pom.xml
@@ -14,6 +14,29 @@
../../parent-java
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ ${equalsverifier.version}
+ test
+
+
+
+
+ 1.4.199
+
+ 3.10.0
+ 3.0.3
+
+
core-java-lang-oop-2
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java
new file mode 100644
index 0000000000..7ad445e8ee
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java
@@ -0,0 +1,30 @@
+package com.baeldung.copyconstructor;
+
+import java.util.Date;
+
+public class Employee {
+
+ protected int id;
+ protected String name;
+ protected Date startDate;
+
+ public Employee(int id, String name, Date startDate) {
+ this.id = id;
+ this.name = name;
+ this.startDate = startDate;
+ }
+
+ public Employee(Employee employee) {
+ this.id = employee.id;
+ this.name = employee.name;
+ this.startDate = new Date(employee.startDate.getTime());
+ }
+
+ Date getStartDate() {
+ return startDate;
+ }
+
+ public Employee copy() {
+ return new Employee(this);
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java
new file mode 100644
index 0000000000..97b8580b8e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java
@@ -0,0 +1,31 @@
+package com.baeldung.copyconstructor;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Manager extends Employee {
+
+ private List directReports;
+
+ public Manager(int id, String name, Date startDate, List directReports) {
+ super(id, name, startDate);
+ this.directReports = directReports;
+ }
+
+ public Manager(Manager manager) {
+ super(manager.id, manager.name, manager.startDate);
+ this.directReports = manager.directReports.stream()
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public Employee copy() {
+ return new Manager(this);
+ }
+
+ List getDirectReport() {
+ return this.directReports;
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 67%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
index 7761fdce56..fc6db9411c 100644
--- a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
+++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
@@ -1,12 +1,6 @@
package com.baeldung.inheritancecomposition.application;
-import com.baeldung.inheritancecomposition.model.Actress;
-import com.baeldung.inheritancecomposition.model.Computer;
-import com.baeldung.inheritancecomposition.model.StandardMemory;
-import com.baeldung.inheritancecomposition.model.Person;
-import com.baeldung.inheritancecomposition.model.StandardProcessor;
-import com.baeldung.inheritancecomposition.model.StandardSoundCard;
-import com.baeldung.inheritancecomposition.model.Waitress;
+import com.baeldung.inheritancecomposition.model.*;
public class Application {
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
index 66c8520e34..274fe77764 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
@@ -1,11 +1,9 @@
package com.baeldung.constructors;
-import com.google.common.collect.Comparators;
import org.junit.Test;
import java.time.LocalDateTime;
import java.time.Month;
-import java.util.ArrayList;
import java.util.logging.Logger;
import static org.assertj.core.api.Assertions.*;
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
new file mode 100644
index 0000000000..19a4001b62
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.copyconstructor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+
+public class EmployeeUnitTest {
+ @Test
+ public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
+ Date d1 = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", d1);
+ Employee e2 = new Employee(e1);
+ assertEquals(d1, e1.getStartDate());
+ assertEquals(d1, e2.getStartDate());
+
+ d1.setTime(456);
+ assertEquals(d1, e1.getStartDate());
+ assertNotEquals(d1, e2.getStartDate());
+ }
+
+ @Test
+ public void givenCopyMethod_whenCopy_thenDistinct() {
+ Date d1 = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", d1);
+ Employee e2 = e1.copy();
+ assertEquals(d1, e1.getStartDate());
+ assertEquals(d1, e2.getStartDate());
+
+ d1.setTime(456);
+ assertEquals(d1, e1.getStartDate());
+ assertNotEquals(d1, e2.getStartDate());
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
new file mode 100644
index 0000000000..ef9f261360
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.copyconstructor;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Test;
+
+public class ManagerUnitTest {
+ @Test
+ public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
+ Date startDate = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", startDate);
+ Employee e2 = new Employee(e1);
+ List directReports = new ArrayList();
+ directReports.add(e1);
+ directReports.add(e2);
+
+ Manager m1 = new Manager(1, "Baeldung Manager", startDate, directReports);
+ Manager m2 = new Manager(m1);
+ List directReports1 = m1.getDirectReport();
+ List directReports2 = m2.getDirectReport();
+ assertEquals(directReports1.size(), directReports2.size());
+ assertArrayEquals(directReports1.toArray(), directReports2.toArray());
+
+ // clear m1's direct reports list. m2's list should not be affected
+ directReports.clear();
+ directReports1 = m1.getDirectReport();
+ directReports2 = m2.getDirectReport();
+ assertEquals(0, directReports1.size());
+ assertEquals(2, directReports2.size());
+
+ }
+
+ @Test
+ public void givenCopyMethod_whenCopy_thenDistinct() {
+ Date startDate = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", startDate);
+ Employee e2 = new Employee(e1);
+ List directReports = new ArrayList();
+ directReports.add(e1);
+ directReports.add(e2);
+
+ // a Manager object whose declaration type is Employee.
+ Employee source = new Manager(1, "Baeldung Manager", startDate, directReports);
+ Employee clone = source.copy();
+
+ // after copy, clone should be still a Manager object.
+ assertTrue(clone instanceof Manager);
+ List directReports1 = ((Manager) source).getDirectReport();
+ List directReports2 = ((Manager) clone).getDirectReport();
+ assertEquals(directReports1.size(), directReports2.size());
+ assertArrayEquals(directReports1.toArray(), directReports2.toArray());
+
+ // clear source's direct reports list. clone's list should not be affected
+ directReports.clear();
+ directReports1 = ((Manager) source).getDirectReport();
+ directReports2 = ((Manager) clone).getDirectReport();
+ assertEquals(0, directReports1.size());
+ assertEquals(2, directReports2.size());
+
+ }
+}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
index 60584fdb53..8fc99e0e81 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
@@ -1,10 +1,10 @@
package com.baeldung.equalshashcode;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
-
import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
public class MoneyUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
index a2de408796..7dfc6d47a3 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
@@ -1,14 +1,13 @@
package com.baeldung.equalshashcode;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import nl.jqno.equalsverifier.EqualsVerifier;
+import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
-import org.junit.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
public class TeamUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
index 0cb4ace0ab..05b1e3e0b9 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
@@ -1,13 +1,11 @@
package com.baeldung.equalshashcode.entities;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-
import org.junit.Assert;
import org.junit.Test;
-import com.baeldung.equalshashcode.entities.ComplexClass;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
public class ComplexClassUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
similarity index 89%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
index a25e8bd486..7722ee7605 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
@@ -1,11 +1,9 @@
package com.baeldung.equalshashcode.entities;
-import java.awt.Color;
-
import org.junit.Assert;
import org.junit.Test;
-import com.baeldung.equalshashcode.entities.Square;
+import java.awt.*;
public class SquareClassUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
index 01dfeac050..7b917023ee 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
@@ -1,11 +1,11 @@
package com.baeldung.immutableobjects;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class ImmutableObjectsUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
index 6dbf2302ae..e174ceceae 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Actress;
import org.junit.BeforeClass;
import org.junit.Test;
+
import static org.assertj.core.api.Assertions.*;
public class ActressUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
similarity index 61%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
index 987af047a5..7699ecb4a7 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
@@ -1,15 +1,12 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
-import com.baeldung.inheritancecomposition.model.Computer;
-import com.baeldung.inheritancecomposition.model.Memory;
-import com.baeldung.inheritancecomposition.model.Processor;
-import com.baeldung.inheritancecomposition.model.StandardMemory;
-import com.baeldung.inheritancecomposition.model.StandardProcessor;
-import com.baeldung.inheritancecomposition.model.StandardSoundCard;
-import java.util.Optional;
-import static org.assertj.core.api.Assertions.assertThat;
+import com.baeldung.inheritancecomposition.model.*;
import org.junit.Test;
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
public class CompositionUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
similarity index 93%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
index 3ddbc19607..515e05528b 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
@@ -1,11 +1,12 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Actress;
import com.baeldung.inheritancecomposition.model.Person;
import com.baeldung.inheritancecomposition.model.Waitress;
-import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
public class InheritanceUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
index 313070b274..ea0b87f6e6 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Person;
import org.junit.BeforeClass;
import org.junit.Test;
+
import static org.assertj.core.api.Assertions.*;
public class PersonUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
index c23fc4d403..816868be13 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Waitress;
import org.junit.BeforeClass;
import org.junit.Test;
+
import static org.assertj.core.api.Assertions.*;
public class WaitressUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
index 81cd51ce51..64e5d8cdb1 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
@@ -1,9 +1,9 @@
package com.baeldung.markerinterface;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
public class MarkerInterfaceUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
new file mode 100644
index 0000000000..c3a32124b5
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -0,0 +1,12 @@
+## Core Java Lang OOP (Part 3)
+
+This module contains articles about Object-oriented programming (OOP) in Java
+
+### Relevant Articles:
+- [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
+- [Access Modifiers in Java](https://www.baeldung.com/java-access-modifiers)
+- [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
+- [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
+- [Java Public Access Modifier](https://www.baeldung.com/java-public-keyword)
+- [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
+- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-3/pom.xml b/core-java-modules/core-java-lang-oop-3/pom.xml
new file mode 100644
index 0000000000..29807b5bef
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang-oop-3
+ 0.1.0-SNAPSHOT
+ core-java-lang-oop-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ com.h2database
+ h2
+ ${h2.version}
+ test
+
+
+
+
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
new file mode 100644
index 0000000000..2ded0ba5d3
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
@@ -0,0 +1,31 @@
+package com.baeldung.accessmodifiers.publicmodifier;
+
+import java.util.AbstractList;
+import java.util.Arrays;
+
+public class ListOfThree extends AbstractList {
+
+ private static final int LENGTH = 3;
+ private Object[] elements;
+
+ public ListOfThree(E[] data) {
+ if(data == null
+ || data.length != LENGTH)
+ throw new IllegalArgumentException();
+
+ this.elements = Arrays.copyOf(data, data.length); //shallow copy
+
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public E get(int index) {
+ return (E)elements[index];
+ }
+
+ @Override
+ public int size() {
+ return LENGTH;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
new file mode 100644
index 0000000000..5556e9aa57
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
@@ -0,0 +1,7 @@
+package com.baeldung.accessmodifiers.publicmodifier;
+
+public class SpecialCharacters {
+
+ public static final String SLASH = "/";
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
new file mode 100644
index 0000000000..83a0dcb30f
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
@@ -0,0 +1,67 @@
+package com.baeldung.accessmodifiers.publicmodifier;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Date;
+
+public class Student {
+
+ private StudentGrade grade; //new data representation
+// private int grade; //old data representation
+ private String name;
+ private int age;
+
+ public void setGrade(int grade) {
+ this.grade = new StudentGrade(grade);
+ }
+
+ public int getGrade() {
+ return this.grade.getGrade().intValue(); //int is returned for backward compatibility
+ }
+
+ public Connection getConnection() throws SQLException {
+
+ final String URL = "jdbc:h2:~/test";
+ return DriverManager.getConnection(URL, "sa", "");
+
+ }
+
+ public void setAge(int age) {
+ if (age < 0 || age > 150) {
+ throw new IllegalArgumentException();
+ }
+
+ this.age = age;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+ private class StudentGrade {
+ private BigDecimal grade = BigDecimal.ZERO;
+ private Date updatedAt;
+
+ public StudentGrade(int grade) {
+ this.grade = new BigDecimal(grade);
+ this.updatedAt = new Date();
+ }
+
+ public BigDecimal getGrade() {
+ return grade;
+ }
+
+ public Date getDate() {
+ return updatedAt;
+ }
+
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java
new file mode 100644
index 0000000000..43bbf0dd62
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java
@@ -0,0 +1,37 @@
+package com.baeldung.basicmethods;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+public class PersonName {
+
+ public String getName(String firstName, String lastName) throws RuntimeException {
+ return firstName + " " + lastName;
+ }
+
+ public String getName(String firstName, String middleName, String lastName) {
+ if (!middleName.equals("")) {
+ return firstName + " " + lastName;
+ }
+ return firstName + " " + middleName + " " + lastName;
+ }
+
+ public void printFullName(String firstName, String lastName) {
+ System.out.println(firstName + " " + lastName);
+ }
+
+ public void writeName(String name) throws IOException {
+ PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt"));
+ out.println("Name: " + name);
+ out.close();
+ }
+
+ public static String getNameStatic(String firstName, String lastName) {
+ return firstName + " " + lastName;
+ }
+
+ public static void callToStaticMethod() {
+ System.out.println("Name is: " + PersonName.getNameStatic("Alan", "Turing"));
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Car.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Car.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Wheel.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Child.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Child.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Mother.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Mother.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/Building.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/Building.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Department.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Department.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Professor.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Professor.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/University.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/University.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java
new file mode 100644
index 0000000000..ed8fb4f45a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.accessmodifiers;
+
+import com.baeldung.accessmodifiers.publicmodifier.ListOfThree;
+import com.baeldung.accessmodifiers.publicmodifier.Student;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestInstance.Lifecycle;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@TestInstance(Lifecycle.PER_CLASS)
+public class PublicAccessModifierUnitTest {
+
+ @Test
+ public void whenUsingBigDecimalIntValueMethod_correspondingIntIsReturned() {
+ assertEquals(0, new BigDecimal(0).intValue()); //instance member
+ }
+
+ @Test
+ public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() {
+ assertEquals(2147483647, Integer.MAX_VALUE); //static field
+ }
+
+ @Test
+ public void whenChangingStudentInternalRepresentation_clientCodeWillNotBreak() {
+
+ Student student = new Student();
+ student.setGrade(100);
+
+ assertEquals(100, student.getGrade());
+ }
+
+ @Test
+ public void whenUsingEntrySet_keyValuePairsAreReturned() {
+
+ Map mapObject = new HashMap();
+ mapObject.put("name", "Alex");
+
+ for(Map.Entry entry : mapObject.entrySet()) {
+ assertEquals("name", entry.getKey());
+ assertEquals("Alex", entry.getValue());
+ }
+
+ }
+
+ @Test
+ public void whenUsingStringToLowerCase_stringTurnsToLowerCase() {
+ assertEquals("alex", "ALEX".toLowerCase());
+ }
+
+ @Test
+ public void whenParsingStringOne_parseIntReturns1() {
+ assertEquals(1, Integer.parseInt("1"));
+ }
+
+ @Test
+ public void whenConnectingToH2_connectionInstanceIsReturned() throws SQLException {
+
+ final String url = "jdbc:h2:~/test";
+ Connection conn = DriverManager.getConnection(url, "sa", "");
+ assertNotNull(conn);
+ }
+
+ @Test
+ public void whenCreatingCustomList_concreteAndInheritedMethodsWork() {
+
+ String[] dataSet1 = new String[] {"zero", "one", "two"};
+
+ List list1 = new ListOfThree(dataSet1);
+
+ //our implemented methods
+ assertEquals("one", list1.get(1));
+ assertEquals(3, list1.size());
+
+ //inherited implementations
+ assertEquals(1, list1.indexOf("one"));
+
+ String[] dataSet2 = new String[] {"two", "zero", "one"};
+ List list2 = new ListOfThree(dataSet2);
+
+ assertTrue(list1.containsAll(list2));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
index 62f891d11b..bf0d12936d 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
@@ -27,7 +27,7 @@ public class NonPrimitivesUnitTest {
b1.num++;
}
}
-
+
class Foo {
public int num;
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
index c9ee9a9e94..0fb044138d 100644
--- a/core-java-modules/core-java-lang-oop/README.md
+++ b/core-java-modules/core-java-lang-oop/README.md
@@ -1,24 +1,16 @@
-=========
+## Core Java Lang OOP
-## Core Java Lang OOP Cookbooks and Examples
+This module contains articles about Object-oriented programming (OOP) in Java
### Relevant Articles:
-- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode)
-- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
-- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
-- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override)
-- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy)
-- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance)
-- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting)
-- [The “final” Keyword in Java](http://www.baeldung.com/java-final)
-- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
-- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
-- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding)
-- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers)
-- [Guide to the super Java Keyword](http://www.baeldung.com/java-super)
-- [Guide to the this Java Keyword](http://www.baeldung.com/java-this)
-- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object)
-- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
-- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
-- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
-- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
+- [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
+- [A Guide to the Static Keyword in Java](https://www.baeldung.com/java-static)
+- [Polymorphism in Java](https://www.baeldung.com/java-polymorphism)
+- [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override)
+- [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
+- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
+- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
+- [The “final” Keyword in Java](https://www.baeldung.com/java-final)
+- [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
+- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
+- [[More -->]](/core-java-modules/core-java-lang-oop-2)
diff --git a/core-java-modules/core-java-lang-oop/pom.xml b/core-java-modules/core-java-lang-oop/pom.xml
index 46003b132b..d86347b51f 100644
--- a/core-java-modules/core-java-lang-oop/pom.xml
+++ b/core-java-modules/core-java-lang-oop/pom.xml
@@ -56,12 +56,6 @@
${assertj-core.version}test
-
- nl.jqno.equalsverifier
- equalsverifier
- ${equalsverifier.version}
- test
-
@@ -78,7 +72,6 @@
2.8.23.10.0
- 3.0.3
diff --git a/core-java-modules/core-java-lang-operators/README.md b/core-java-modules/core-java-lang-operators/README.md
new file mode 100644
index 0000000000..280c630882
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/README.md
@@ -0,0 +1,6 @@
+## Relevant Articles:
+- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator)
+- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
+- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
+- [Java instanceof Operator](https://www.baeldung.com/java-instanceof)
+- [A Guide to Increment and Decrement Unary Operators in Java](https://www.baeldung.com/java-unary-operators)
diff --git a/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java
new file mode 100644
index 0000000000..37fb139917
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java
@@ -0,0 +1,36 @@
+package com.baeldung.booleanoperators;
+
+public class Car {
+
+ private boolean diesel;
+ private boolean manual;
+
+ public Car(boolean diesel, boolean manual) {
+ this.diesel = diesel;
+ this.manual = manual;
+ }
+
+ public boolean isDiesel() {
+ return diesel;
+ }
+
+ public boolean isManual() {
+ return manual;
+ }
+
+ static Car dieselAndManualCar() {
+ return new Car(true, true);
+ }
+
+ static Car dieselAndAutomaticCar() {
+ return new Car(true, false);
+ }
+
+ static Car oilAndManualCar() {
+ return new Car(false, true);
+ }
+
+ static Car oilAndAutomaticCar() {
+ return new Car(false, false);
+ }
+}
diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java
new file mode 100644
index 0000000000..efe38c6f45
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.booleanoperators;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class XorUnitTest {
+
+ @Test
+ void givenDieselManualCar_whenXorOldSchool_thenFalse() {
+ Car car = Car.dieselAndManualCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenDieselAutomaticCar_whenXorOldSchool_thenTrue() {
+ Car car = Car.dieselAndAutomaticCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselManualCar_whenXorOldSchool_thenTrue() {
+ Car car = Car.oilAndManualCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselAutomaticCar_whenXorOldSchool_thenFalse() {
+ Car car = Car.oilAndAutomaticCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenDieselManualCar_whenXor_thenFalse() {
+ Car car = Car.dieselAndManualCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenDieselAutomaticCar_whenXor_thenTrue() {
+ Car car = Car.dieselAndAutomaticCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselManualCar_whenXor_thenTrue() {
+ Car car = Car.oilAndManualCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselAutomaticCar_whenXor_thenFalse() {
+ Car car = Car.oilAndAutomaticCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenNumbersOneAndThree_whenXor_thenTwo() {
+ assertThat(1 ^ 3).isEqualTo(2);
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/README.md b/core-java-modules/core-java-lang-syntax-2/README.md
new file mode 100644
index 0000000000..d8daadf2aa
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/README.md
@@ -0,0 +1,8 @@
+## Core Java Lang Syntax
+
+This module contains articles about Java syntax
+
+### Relevant Articles:
+
+- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword)
+- [[<-- Prev]](/core-java-modules/core-java-lang-syntax)
diff --git a/core-java-modules/core-java-lang-syntax-2/pom.xml b/core-java-modules/core-java-lang-syntax-2/pom.xml
new file mode 100644
index 0000000000..1a8316628f
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang-syntax-2
+ 0.1.0-SNAPSHOT
+ core-java-lang-syntax-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+ core-java-lang-syntax-2
+
+
+ src/main/resources
+ true
+
+
+
+
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java
similarity index 78%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java
index e43b6634ed..6ec68d6ebb 100644
--- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java
@@ -3,12 +3,12 @@ package com.baeldung.core.modifiers;
public class Employee {
private String privateId;
- public String name;
+ private String name;
private boolean manager;
public Employee(String id, String name) {
- changeId(id);
- this.name = name;
+ setPrivateId(id);
+ setName(name);
}
private Employee(String id, String name, boolean managerAttribute) {
@@ -17,7 +17,7 @@ public class Employee {
this.privateId = id + "_ID-MANAGER";
}
- public void changeId(String customId) {
+ public void setPrivateId(String customId) {
if (customId.endsWith("_ID")) {
this.privateId = customId;
} else {
@@ -25,7 +25,7 @@ public class Employee {
}
}
- public String getId() {
+ public String getPrivateId() {
return privateId;
}
@@ -43,6 +43,15 @@ public class Employee {
this.manager = manager;
}
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
public static Employee buildManager(String id, String name) {
return new Employee(id, name, true);
}
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java
similarity index 65%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java
index db58b4f00b..41f0b7a690 100644
--- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java
@@ -4,7 +4,7 @@ public class ExampleClass {
public static void main(String[] args) {
Employee employee = new Employee("Bob","ABC123");
- employee.changeId("BCD234");
- System.out.println(employee.getId());
+ employee.setPrivateId("BCD234");
+ System.out.println(employee.getPrivateId());
}
}
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java
diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md
index 3293e9b23d..6f3120ec2c 100644
--- a/core-java-modules/core-java-lang-syntax/README.md
+++ b/core-java-modules/core-java-lang-syntax/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Lang Syntax
-## Core Java Lang Syntax Cookbooks and Examples
+This module contains articles about Java syntax
### Relevant Articles:
- [The Basics of Java Generics](http://www.baeldung.com/java-generics)
@@ -19,3 +19,4 @@
- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
- [Java instanceof Operator](https://www.baeldung.com/java-instanceof)
- [Breaking Out of Nested Loops](https://www.baeldung.com/java-breaking-out-nested-loop)
+- [[More -->]](/core-java-modules/core-java-lang-syntax-2)
diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md
index 74936eac21..4b211177d9 100644
--- a/core-java-modules/core-java-lang/README.md
+++ b/core-java-modules/core-java-lang/README.md
@@ -1,36 +1,25 @@
-=========
+## Core Java Lang
-## Core Java Lang Cookbooks and Examples
+This module contains articles about core features in the Java language
### Relevant Articles:
-- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
-- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode)
-- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
-- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
-- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
-- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
-- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies)
-- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
-- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
-- [Comparator and Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
-- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
-- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
-- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
-- [Recursion In Java](http://www.baeldung.com/java-recursion)
-- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
-- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
-- [Using Java Assertions](http://www.baeldung.com/java-assert)
-- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
-- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error)
-- [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception)
-- [Exception Handling in Java](http://www.baeldung.com/java-exceptions)
-- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize)
+
+- [Generate equals() and hashCode() with Eclipse](https://www.baeldung.com/java-eclipse-equals-and-hashcode)
+- [Iterating Over Enum Values in Java](https://www.baeldung.com/java-enum-iteration)
+- [Java Double Brace Initialization](https://www.baeldung.com/java-double-brace-initialization)
+- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator)
+- [Comparator and Comparable in Java](https://www.baeldung.com/java-comparator-comparable)
+- [The Java continue and break Keywords](https://www.baeldung.com/java-continue-and-break)
+- [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
+- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
+- [Recursion In Java](https://www.baeldung.com/java-recursion)
+- [A Guide to the finalize Method in Java](https://www.baeldung.com/java-finalize)
+- [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java)
+- [Quick Guide to java.lang.System](https://www.baeldung.com/java-lang-system)
+- [Using Java Assertions](https://www.baeldung.com/java-assert)
- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
-- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws)
- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
-- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws)
- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name)
- [Java Compound Operators](https://www.baeldung.com/java-compound-operators)
- [Guide to Java Packages](https://www.baeldung.com/java-packages)
@@ -41,3 +30,5 @@
- [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values)
- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope)
- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
+- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums)
+- [[More --> ]](/core-java-modules/core-java-lang-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang/pom.xml b/core-java-modules/core-java-lang/pom.xml
index 8311636873..1a2b86f872 100644
--- a/core-java-modules/core-java-lang/pom.xml
+++ b/core-java-modules/core-java-lang/pom.xml
@@ -43,12 +43,6 @@
log4j-over-slf4j${org.slf4j.version}
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
- org.assertj
@@ -56,11 +50,6 @@
${assertj-core.version}test
-
- javax.mail
- mail
- ${javax.mail.version}
-
@@ -75,9 +64,6 @@
2.8.2
-
- 1.5.0-b01
-
3.10.0
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
deleted file mode 100644
index c2908b7278..0000000000
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baeldung.exceptionhandling;
-
-public class MyException extends Throwable {
-
-}
diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md
index 6b6151248e..c384a28b64 100644
--- a/core-java-modules/core-java-networking-2/README.md
+++ b/core-java-modules/core-java-networking-2/README.md
@@ -1,3 +1,12 @@
+## Core Java Networking (Part 2)
+
+This module contains articles about networking in Java
+
### Relevant Articles
- [Checking if a URL Exists in Java](https://www.baeldung.com/java-check-url-exists)
+- [Making a JSON POST Request With HttpURLConnection](https://www.baeldung.com/httpurlconnection-post)
+- [Using Curl in Java](https://www.baeldung.com/java-curl)
+- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
+- [Sending Emails with Java](http://www.baeldung.com/java-email)
+- [[<-- Prev]](/core-java-modules/core-java-networking)
diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml
index 8a26f6ab9f..2d404a553b 100644
--- a/core-java-modules/core-java-networking-2/pom.xml
+++ b/core-java-modules/core-java-networking-2/pom.xml
@@ -1,5 +1,5 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0core-java-networking-2core-java-networking-2
@@ -12,9 +12,29 @@
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ javax.mail
+ mail
+ ${javax.mail.version}
+ core-java-networking-2
-
+
+
+
+ 4.5.9
+ 1.5.0-b01
+
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java
diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java
similarity index 100%
rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java
diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java
similarity index 100%
rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java
diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
similarity index 97%
rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
index e775b9f708..bd2024fdfa 100644
--- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
@@ -1,15 +1,12 @@
package com.baeldung.mail;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
+import java.io.File;
+import java.util.Properties;
public class EmailService {
diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java
new file mode 100644
index 0000000000..779f8aa898
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java
@@ -0,0 +1,74 @@
+package com.baeldung.url.auth;
+
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.PasswordAuthentication;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.commons.codec.binary.Base64;
+
+public class HttpClient {
+
+ private final String user;
+ private final String password;
+
+ public HttpClient(String user, String password) {
+ this.user = user;
+ this.password = password;
+ }
+
+ public int sendRquestWithAuthHeader(String url) throws IOException {
+ HttpURLConnection connection = null;
+ try {
+ connection = createConnection(url);
+ connection.setRequestProperty("Authorization", createBasicAuthHeaderValue());
+ return connection.getResponseCode();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ public int sendRquestWithAuthenticator(String url) throws IOException {
+ setAuthenticator();
+
+ HttpURLConnection connection = null;
+ try {
+ connection = createConnection(url);
+ return connection.getResponseCode();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ private HttpURLConnection createConnection(String urlString) throws MalformedURLException, IOException, ProtocolException {
+ URL url = new URL(String.format(urlString));
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("GET");
+ return connection;
+ }
+
+ private String createBasicAuthHeaderValue() {
+ String auth = user + ":" + password;
+ byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));
+ String authHeaderValue = "Basic " + new String(encodedAuth);
+ return authHeaderValue;
+ }
+
+ private void setAuthenticator() {
+ Authenticator.setDefault(new BasicAuthenticator());
+ }
+
+ private final class BasicAuthenticator extends Authenticator {
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(user, password.toCharArray());
+ }
+ }
+}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java
rename to core-java-modules/core-java-networking-2/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java
diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
similarity index 96%
rename from core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
rename to core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
index 77bf9bc8db..41e0f2d6af 100644
--- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
@@ -3,14 +3,7 @@ package com.baeldung.httprequest;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import com.baeldung.httprequest.FullResponseBuilder;
-import com.baeldung.httprequest.ParameterStringBuilder;
-
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
+import java.io.*;
import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java
new file mode 100644
index 0000000000..0ccb6e5a54
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.url.auth;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class HttpClientUnitTest {
+
+ @Test
+ public void sendRquestWithAuthHeader() throws Exception {
+ HttpClient httpClient = new HttpClient("user1", "pass1");
+
+ int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1");
+
+ assertTrue(isSuccess(status));
+ }
+
+ @Test
+ public void sendRquestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception {
+ HttpClient httpClient = new HttpClient("John", "Smith");
+
+ int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1");
+
+ assertTrue(isUnauthorized(status));
+ }
+
+ @Test
+ public void sendRquestWithAuthenticator() throws Exception {
+ HttpClient httpClient = new HttpClient("user2", "pass2");
+
+ int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2");
+
+ assertTrue(isSuccess(status));
+ }
+
+ @Test
+ public void sendRquestWithAuthenticator_whenIncorrectCredentials_thenNotSuccessful() throws Exception {
+ HttpClient httpClient = new HttpClient("John", "Smith");
+
+ int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2");
+
+ assertTrue(isUnauthorized(status));
+ }
+
+ private boolean isSuccess(int status) {
+ return (status >= 200) && (status < 300);
+ }
+
+ private boolean isUnauthorized(int status) {
+ return status == 401;
+ }
+}
diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md
index 2341520df7..4038e9803a 100644
--- a/core-java-modules/core-java-networking/README.md
+++ b/core-java-modules/core-java-networking/README.md
@@ -1,18 +1,17 @@
-=========
-
## Core Java Networking
+This module contains articles about networking in Java
+
### Relevant Articles
- [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server)
- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast)
- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java)
-- [Sending Emails with Java](http://www.baeldung.com/java-email)
- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java)
- [A Guide to the Java URL](http://www.baeldung.com/java-url)
- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces)
- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets)
- [Guide to Java URL Encoding/Decoding](http://www.baeldung.com/java-url-encoding-decoding)
-- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri)
- [Read an InputStream using the Java Server Socket](https://www.baeldung.com/java-inputstream-server-socket)
+- [[More -->]](/core-java-modules/core-java-networking-2)
diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml
index e2ee7b2fcc..b5071bf7df 100644
--- a/core-java-modules/core-java-networking/pom.xml
+++ b/core-java-modules/core-java-networking/pom.xml
@@ -14,11 +14,6 @@
-
- javax.mail
- mail
- ${javax.mail.version}
- commons-iocommons-io
@@ -29,11 +24,6 @@
spring-web${springframework.spring-web.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
@@ -41,7 +31,6 @@
- 1.5.0-b014.3.4.RELEASE
diff --git a/core-java-modules/core-java-nio/README.md b/core-java-modules/core-java-nio/README.md
index 1ac3b6c089..efa58671b5 100644
--- a/core-java-modules/core-java-nio/README.md
+++ b/core-java-modules/core-java-nio/README.md
@@ -1,3 +1,7 @@
+## Core Java NIO
+
+This module contains articles about core Java non-blocking input and output (IO)
+
## Relevant Articles:
- [Determine File Creation Date in Java](https://www.baeldung.com/java-file-creation-date)
diff --git a/core-java-modules/core-java-optional/README.md b/core-java-modules/core-java-optional/README.md
index b6848b5d33..22ac8736fa 100644
--- a/core-java-modules/core-java-optional/README.md
+++ b/core-java-modules/core-java-optional/README.md
@@ -4,3 +4,5 @@
### Relevant Articles:
- [Java Optional as Return Type](https://www.baeldung.com/java-optional-return)
+- [Guide To Java 8 Optional](https://www.baeldung.com/java-optional)
+- [Java Optional – orElse() vs orElseGet()](https://www.baeldung.com/java-optional-or-else-vs-or-else-get)
\ No newline at end of file
diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml
index ca6158ef5a..d5ccd43e55 100644
--- a/core-java-modules/core-java-optional/pom.xml
+++ b/core-java-modules/core-java-optional/pom.xml
@@ -27,6 +27,21 @@
jackson-databind${jackson.version}
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
+
@@ -49,5 +64,7 @@
1.81.85.4.0.Final
+ 1.19
+ 1.19
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Modem.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Modem.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Person.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Person.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java
rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java
rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java
diff --git a/core-java-modules/core-java-os/README.md b/core-java-modules/core-java-os/README.md
index 697af5e4d6..9205628a87 100644
--- a/core-java-modules/core-java-os/README.md
+++ b/core-java-modules/core-java-os/README.md
@@ -1,10 +1,11 @@
-=========
+## Core Java OS
-This module uses Java 9, so make sure to have the JDK 9 installed to run it.
+This module contains articles about working with the operating system (OS) in Java
-##
### Relevant Articles:
- [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api)
- [Guide to java.lang.Process API](https://www.baeldung.com/java-process-api)
- [Guide to java.lang.ProcessBuilder API](https://www.baeldung.com/java-lang-processbuilder-api)
- [Get the Current Working Directory in Java](https://www.baeldung.com/java-current-directory)
+
+This module uses Java 9, so make sure to have the JDK 9 installed to run it.
\ No newline at end of file
diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md
index 1b3b590bf8..d1d646ac7f 100644
--- a/core-java-modules/core-java-perf/README.md
+++ b/core-java-modules/core-java-perf/README.md
@@ -1,5 +1,7 @@
## Core Java Performance
+This module contains articles about performance of Java applications
+
### Relevant Articles:
- [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc)
- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture)
diff --git a/core-java-modules/core-java-reflection/README.MD b/core-java-modules/core-java-reflection/README.MD
index c8766d6858..840d488968 100644
--- a/core-java-modules/core-java-reflection/README.MD
+++ b/core-java-modules/core-java-reflection/README.MD
@@ -1,3 +1,9 @@
## Relevant Articles
- [Void Type in Java](https://www.baeldung.com/java-void-type)
+- [Retrieve Fields from a Java Class Using Reflection](https://www.baeldung.com/java-reflection-class-fields)
+- [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection)
+- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
+- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
+- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
+- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies)
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml
index e6c7f81d6c..b3c3390df8 100644
--- a/core-java-modules/core-java-reflection/pom.xml
+++ b/core-java-modules/core-java-reflection/pom.xml
@@ -23,7 +23,30 @@
+
+ core-java-reflection
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+ -parameters
+
+
+
+
+
+ 3.8.03.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reflect/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflect/Person.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reflect/Person.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflect/Person.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Customer.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Customer.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Customer.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Customer.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Employee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Employee.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/MonthEmployee.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/MonthEmployee.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Person.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Person.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Person.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Animal.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Bird.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Bird.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/DynamicGreeter.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/DynamicGreeter.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Eating.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Eating.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Goat.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Goat.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greeter.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greeter.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/GreetingAnnotation.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/GreetingAnnotation.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greetings.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greetings.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Locomotion.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Locomotion.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Operations.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Operations.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Person.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Person.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/OperationsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/OperationsUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/ReflectionUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/ReflectionUnitTest.java
diff --git a/core-java-modules/core-java-security-manager/pom.xml b/core-java-modules/core-java-security-manager/pom.xml
new file mode 100644
index 0000000000..51d5e7d78f
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/pom.xml
@@ -0,0 +1,34 @@
+
+ 4.0.0
+ core-java-security-manager
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-security-manager
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java
new file mode 100644
index 0000000000..5f9c43336f
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java
@@ -0,0 +1,13 @@
+package com.baeldung.security.manager;
+
+import java.security.BasicPermission;
+
+public class CustomPermission extends BasicPermission {
+ public CustomPermission(String name) {
+ super(name);
+ }
+
+ public CustomPermission(String name, String actions) {
+ super(name, actions);
+ }
+}
diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java
new file mode 100644
index 0000000000..1b9f14e3b8
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java
@@ -0,0 +1,18 @@
+package com.baeldung.security.manager;
+
+public class Service {
+
+ public static final String OPERATION = "my-operation";
+
+ public void operation() {
+ SecurityManager securityManager = System.getSecurityManager();
+ if (securityManager != null) {
+ securityManager.checkPermission(new CustomPermission(OPERATION));
+ }
+ System.out.println("Operation is executed");
+ }
+
+ public static void main(String[] args) {
+ new Service().operation();
+ }
+}
diff --git a/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java
new file mode 100644
index 0000000000..a845f233b5
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.security.manager;
+
+import org.junit.Test;
+
+import java.net.URL;
+import java.security.AccessControlException;
+import java.util.concurrent.Callable;
+
+public class SecurityManagerUnitTest {
+
+ @Test(expected = AccessControlException.class)
+ public void whenSecurityManagerIsActive_thenNetworkIsNotAccessibleByDefault() throws Exception {
+ doTest(() -> {
+ new URL("http://www.google.com").openConnection().connect();
+ return null;
+ });
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void whenUnauthorizedClassTriesToAccessProtectedOperation_thenAnExceptionIsThrown() throws Exception {
+ doTest(() -> {
+ new Service().operation();
+ return null;
+ });
+ }
+
+ private void doTest(Callable action) throws Exception {
+ System.setSecurityManager(new SecurityManager());
+ try {
+ action.call();
+ } finally {
+ System.setSecurityManager(null);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-security/README.md b/core-java-modules/core-java-security/README.md
index a833ca30bb..48fd071396 100644
--- a/core-java-modules/core-java-security/README.md
+++ b/core-java-modules/core-java-security/README.md
@@ -1,5 +1,7 @@
## Core Java Security
+This module contains articles about core Java Security
+
### Relevant Articles:
- [MD5 Hashing in Java](http://www.baeldung.com/java-md5)
- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class)
@@ -11,3 +13,4 @@
- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
- [Enabling TLS v1.2 in Java 7](https://www.baeldung.com/java-7-tls-v12)
- [The Java SecureRandom Class](https://www.baeldung.com/java-secure-random)
+- [An Introduction to Java SASL](https://www.baeldung.com/java-sasl)
diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md
new file mode 100644
index 0000000000..e97641c221
--- /dev/null
+++ b/core-java-modules/core-java-streams/README.md
@@ -0,0 +1,9 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap)
+- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
+- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)
+- [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors)
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml
new file mode 100644
index 0000000000..4ff8e8aaba
--- /dev/null
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -0,0 +1,54 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-streams
+ 0.1.0-SNAPSHOT
+ core-java-streams
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-streams
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+
+ 2.22.1
+
+
diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/forEach/ReverseList.java b/core-java-modules/core-java-streams/src/main/java/com/baeldung/forEach/ReverseList.java
similarity index 100%
rename from core-java-modules/core-java-8-2/src/main/java/com/baeldung/forEach/ReverseList.java
rename to core-java-modules/core-java-streams/src/main/java/com/baeldung/forEach/ReverseList.java
diff --git a/core-java-modules/core-java-streams/src/main/resources/logback.xml b/core-java-modules/core-java-streams/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
rename to core-java-modules/core-java-streams/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java
rename to core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java
diff --git a/core-java-modules/core-java-sun/README.md b/core-java-modules/core-java-sun/README.md
index e2dba76b41..107035cbe8 100644
--- a/core-java-modules/core-java-sun/README.md
+++ b/core-java-modules/core-java-sun/README.md
@@ -1,7 +1,8 @@
-=========
+## Core Java Sun
-## Core Java Cookbooks and Examples
+This module contains articles about the sun package
### Relevant Articles:
+
- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe)
\ No newline at end of file
diff --git a/core-java-modules/core-java-text/README.md b/core-java-modules/core-java-text/README.md
new file mode 100644
index 0000000000..5a6db4e8fd
--- /dev/null
+++ b/core-java-modules/core-java-text/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance)
\ No newline at end of file
diff --git a/core-java-modules/core-java-text/pom.xml b/core-java-modules/core-java-text/pom.xml
new file mode 100644
index 0000000000..f831ec5f40
--- /dev/null
+++ b/core-java-modules/core-java-text/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-text
+ 0.1.0-SNAPSHOT
+ core-java-text
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+
+ core-java-text
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-text/src/main/resources/logback.xml b/core-java-modules/core-java-text/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/core-java-modules/core-java-text/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java
deleted file mode 100644
index 138916ec60..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Arithmetic {
-
- private static Logger LOGGER = LoggerFactory.getLogger(Arithmetic.class);
-
- public static void main(String[] args) {
-
- try {
- int result = 30 / 0; // Trying to divide by zero
- } catch (ArithmeticException e) {
- LOGGER.error("ArithmeticException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java
deleted file mode 100644
index 93b53f284c..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ArrayIndexOutOfBounds {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ArrayIndexOutOfBounds.class);
-
- public static void main(String[] args) {
-
- int[] nums = new int[] { 1, 2, 3 };
-
- try {
- int numFromNegativeIndex = nums[-1]; // Trying to access at negative index
- int numFromGreaterIndex = nums[4]; // Trying to access at greater index
- int numFromLengthIndex = nums[3]; // Trying to access at index equal to size of the array
- } catch (ArrayIndexOutOfBoundsException e) {
- LOGGER.error("ArrayIndexOutOfBoundsException caught");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java
deleted file mode 100644
index 183f8f54a3..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class Animal {
-
-}
-
-class Dog extends Animal {
-
-}
-
-class Lion extends Animal {
-
-}
-
-public class ClassCast {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ClassCast.class);
-
- public static void main(String[] args) {
-
- try {
- Animal animalOne = new Dog(); // At runtime the instance is dog
- Dog bruno = (Dog) animalOne; // Downcasting
-
- Animal animalTwo = new Lion(); // At runtime the instance is animal
- Dog tommy = (Dog) animalTwo; // Downcasting
- } catch (ClassCastException e) {
- LOGGER.error("ClassCastException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java
deleted file mode 100644
index bb9e0bf4ac..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class FileNotFound {
-
- private static Logger LOGGER = LoggerFactory.getLogger(FileNotFound.class);
-
- public static void main(String[] args) {
-
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new FileReader(new File("/invalid/file/location")));
- } catch (FileNotFoundException e) {
- LOGGER.error("FileNotFoundException caught!");
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java
deleted file mode 100644
index ab46c83da4..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GlobalExceptionHandler {
-
- public static void main(String[] args) {
-
- Handler globalExceptionHandler = new Handler();
- Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
- new GlobalExceptionHandler().performArithmeticOperation(10, 0);
- }
-
- public int performArithmeticOperation(int num1, int num2) {
- return num1/num2;
- }
-
-}
-
-class Handler implements Thread.UncaughtExceptionHandler {
-
- private static Logger LOGGER = LoggerFactory.getLogger(Handler.class);
-
- public void uncaughtException(Thread t, Throwable e) {
- LOGGER.info("Unhandled exception caught!");
- }
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java
deleted file mode 100644
index 801536cb2d..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class IllegalArgument {
-
- private static Logger LOGGER = LoggerFactory.getLogger(IllegalArgument.class);
-
- public static void main(String[] args) {
- try {
- Thread.sleep(-1000);
- } catch (InterruptedException e) {
- LOGGER.error("IllegalArgumentException caught!");
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java
deleted file mode 100644
index e8ddcea3c2..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class IllegalState {
-
- private static Logger LOGGER = LoggerFactory.getLogger(IllegalState.class);
-
- public static void main(String[] args) {
-
- List intList = new ArrayList<>();
-
- for (int i = 0; i < 10; i++) {
- intList.add(i);
- }
-
- Iterator intListIterator = intList.iterator(); // Initialized with index at -1
-
- try {
- intListIterator.remove(); // IllegalStateException
- } catch (IllegalStateException e) {
- LOGGER.error("IllegalStateException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java
deleted file mode 100644
index 319fd33591..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class ChildThread extends Thread {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ChildThread.class);
-
- public void run() {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- LOGGER.error("InterruptedException caught!");
- }
- }
-
-}
-
-public class InterruptedExceptionExample {
-
- public static void main(String[] args) throws InterruptedException {
- ChildThread childThread = new ChildThread();
- childThread.start();
- childThread.interrupt();
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java
deleted file mode 100644
index 57fcddf76b..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MalformedURL {
-
- private static Logger LOGGER = LoggerFactory.getLogger(MalformedURL.class);
-
- public static void main(String[] args) {
-
- URL baeldungURL = null;
-
- try {
- baeldungURL = new URL("malformedurl");
- } catch (MalformedURLException e) {
- LOGGER.error("MalformedURLException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java
deleted file mode 100644
index 2402a786a9..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NullPointer {
-
- private static Logger LOGGER = LoggerFactory.getLogger(NullPointer.class);
-
- public static void main(String[] args) {
-
- Person personObj = null;
-
- try {
- String name = personObj.personName; // Accessing the field of a null object
- personObj.personName = "Jon Doe"; // Modifying the field of a null object
- } catch (NullPointerException e) {
- LOGGER.error("NullPointerException caught!");
- }
-
- }
-}
-
-class Person {
-
- public String personName;
-
- public String getPersonName() {
- return personName;
- }
-
- public void setPersonName(String personName) {
- this.personName = personName;
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java
deleted file mode 100644
index 7050e70aee..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NumberFormat {
-
- private static Logger LOGGER = LoggerFactory.getLogger(NumberFormat.class);
-
- public static void main(String[] args) {
-
- String str1 = "100ABCD";
-
- try {
- int x = Integer.parseInt(str1); // Converting string with inappropriate format
- int y = Integer.valueOf(str1);
- } catch (NumberFormatException e) {
- LOGGER.error("NumberFormatException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java
deleted file mode 100644
index f7fb4c91e4..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ParseExceptionExample {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ParseExceptionExample.class);
-
- public static void main(String[] args) {
-
- DateFormat format = new SimpleDateFormat("MM, dd, yyyy");
-
- try {
- format.parse("01, , 2010");
- } catch (ParseException e) {
- LOGGER.error("ParseException caught!");
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java
deleted file mode 100644
index c6bf915996..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.apache.commons.lang3.exception.ExceptionUtils;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-public class StackTraceToString {
-
- public static void main(String[] args) {
- // Convert a StackTrace to String using core java
- try {
- throw new NullPointerException();
- } catch (Exception e) {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- e.printStackTrace(pw);
-
- System.out.println(sw.toString());
- }
-
- // Convert a StackTrace to String using Apache Commons
- try {
- throw new IndexOutOfBoundsException();
- } catch (Exception e) {
- System.out.println(ExceptionUtils.getStackTrace(e));
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java
deleted file mode 100644
index bc297be498..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class StringIndexOutOfBounds {
-
- private static Logger LOGGER = LoggerFactory.getLogger(StringIndexOutOfBounds.class);
-
- public static void main(String[] args) {
-
- String str = "Hello World";
-
- try {
- char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index
- char charAtLengthIndex = str.charAt(11); // Trying to access at index equal to size of the string
- } catch (StringIndexOutOfBoundsException e) {
- LOGGER.error("StringIndexOutOfBoundsException caught");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java
new file mode 100644
index 0000000000..b2469ac984
--- /dev/null
+++ b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java
@@ -0,0 +1,46 @@
+package com.baeldung.jsonposturlconnection;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class PostJSONWithHttpURLConnection {
+
+ public static void main (String []args) throws IOException{
+ //Change the URL with any other publicly accessible POST resource, which accepts JSON request body
+ URL url = new URL ("https://reqres.in/api/users");
+
+ HttpURLConnection con = (HttpURLConnection)url.openConnection();
+ con.setRequestMethod("POST");
+
+ con.setRequestProperty("Content-Type", "application/json; utf-8");
+ con.setRequestProperty("Accept", "application/json");
+
+ con.setDoOutput(true);
+
+ //JSON String need to be constructed for the specific resource.
+ //We may construct complex JSON using any third-party JSON libraries such as jackson or org.json
+ String jsonInputString = "{\"name\": \"Upendra\", \"job\": \"Programmer\"}";
+
+ try(OutputStream os = con.getOutputStream()){
+ byte[] input = jsonInputString.getBytes("utf-8");
+ os.write(input, 0, input.length);
+ }
+
+ int code = con.getResponseCode();
+ System.out.println(code);
+
+ try(BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))){
+ StringBuilder response = new StringBuilder();
+ String responseLine = null;
+ while ((responseLine = br.readLine()) != null) {
+ response.append(responseLine.trim());
+ }
+ System.out.println(response.toString());
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
index dcf186de93..2659b29491 100644
--- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
+++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
@@ -3,6 +3,7 @@ package com.baeldung.uuid;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
import java.util.UUID;
public class UUIDGenerator {
@@ -65,9 +66,9 @@ public class UUIDGenerator {
try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException nsae) {
- throw new InternalError("MD5 not supported", nsae);
+ throw new InternalError("SHA-1 not supported", nsae);
}
- byte[] bytes = md.digest(name);
+ byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16);
bytes[6] &= 0x0f; /* clear version */
bytes[6] |= 0x50; /* set to version 5 */
bytes[8] &= 0x3f; /* clear variant */
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java
deleted file mode 100644
index 394de9c576..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.LoggerFactory;
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.core.Appender;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.verify;
-
-@RunWith(MockitoJUnitRunner.class)
-public class GlobalExceptionHandlerUnitTest {
-
- @Mock
- private Appender mockAppender;
-
- @Captor
- private ArgumentCaptor captorLoggingEvent;
-
- @Before
- public void setup() {
- final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
- logger.addAppender(mockAppender);
-
- Handler globalExceptionHandler = new Handler();
- Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
- }
-
- @After
- public void teardown() {
- final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
- logger.detachAppender(mockAppender);
- }
-
- @Test
- public void whenArithmeticException_thenUseUncaughtExceptionHandler() throws InterruptedException {
-
- Thread globalExceptionHandlerThread = new Thread() {
- public void run() {
- GlobalExceptionHandler globalExceptionHandlerObj = new GlobalExceptionHandler();
- globalExceptionHandlerObj.performArithmeticOperation(99, 0);
- }
- };
-
- globalExceptionHandlerThread.start();
- globalExceptionHandlerThread.join();
-
- verify(mockAppender).doAppend(captorLoggingEvent.capture());
- LoggingEvent loggingEvent = captorLoggingEvent.getValue();
-
- assertThat(loggingEvent.getLevel()).isEqualTo(Level.INFO);
- assertThat(loggingEvent.getFormattedMessage()).isEqualTo("Unhandled exception caught!");
- }
-
-}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index ecf1f4147e..68ece1c473 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -15,10 +15,10 @@
pre-jpms
- core-java-exceptionscore-java-optionalcore-java-lang-operatorscore-java-networking-2
+ core-java-security-manager
diff --git a/core-kotlin-2/README.md b/core-kotlin-2/README.md
index d75dd2208a..ecf16c2c91 100644
--- a/core-kotlin-2/README.md
+++ b/core-kotlin-2/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Core Kotlin
+
+This module contains articles about core Kotlin.
+
+### Relevant articles:
- [Void Type in Kotlin](https://www.baeldung.com/kotlin-void-type)
- [How to use Kotlin Range Expressions](https://www.baeldung.com/kotlin-ranges)
@@ -8,3 +12,4 @@
- [Split a List into Parts in Kotlin](https://www.baeldung.com/kotlin-split-list-into-parts)
- [String Comparison in Kotlin](https://www.baeldung.com/kotlin-string-comparison)
- [Guide to JVM Platform Annotations in Kotlin](https://www.baeldung.com/kotlin-jvm-annotations)
+- More articles: [[<-- prev]](/core-kotlin)
diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt
new file mode 100644
index 0000000000..6fa7983689
--- /dev/null
+++ b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt
@@ -0,0 +1,34 @@
+package com.baeldung.lists
+
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class ListsUnitTest {
+
+ var batmans: List = listOf("Christian Bale", "Michael Keaton", "Ben Affleck", "George Clooney")
+
+ @Test
+ fun whenFindASpecificItem_thenItemIsReturned() {
+ //Returns the first element matching the given predicate, or null if no such element was found.
+ val theFirstBatman = batmans.find { actor -> "Michael Keaton".equals(actor) }
+ assertEquals(theFirstBatman, "Michael Keaton")
+ }
+
+ @Test
+ fun whenFilterWithPredicate_thenMatchingItemsAreReturned() {
+ //Returns a list containing only elements matching the given predicate.
+ val theCoolestBatmans = batmans.filter { actor -> actor.contains("a") }
+ assertTrue(theCoolestBatmans.contains("Christian Bale") && theCoolestBatmans.contains("Michael Keaton"))
+ }
+
+ @Test
+ fun whenFilterNotWithPredicate_thenMatchingItemsAreReturned() {
+ //Returns a list containing only elements not matching the given predicate.
+ val theMehBatmans = batmans.filterNot { actor -> actor.contains("a") }
+ assertFalse(theMehBatmans.contains("Christian Bale") && theMehBatmans.contains("Michael Keaton"))
+ assertTrue(theMehBatmans.contains("Ben Affleck") && theMehBatmans.contains("George Clooney"))
+ }
+
+}
\ No newline at end of file
diff --git a/core-kotlin-io/README.md b/core-kotlin-io/README.md
index cb4dac7e4d..ad4c503895 100644
--- a/core-kotlin-io/README.md
+++ b/core-kotlin-io/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Core Kotlin I/O
+
+This module contains articles about core Kotlin I/O.
+
+### Relevant articles:
- [InputStream to String in Kotlin](https://www.baeldung.com/kotlin-inputstream-to-string)
- [Console I/O in Kotlin](https://www.baeldung.com/kotlin-console-io)
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index 3392db9171..bdff95d36d 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -1,36 +1,40 @@
-## Relevant articles:
+## Core Kotlin
-- [Introduction to the Kotlin Language](http://www.baeldung.com/kotlin)
-- [Guide to the “when{}” Block in Kotlin](http://www.baeldung.com/kotlin-when)
-- [Comprehensive Guide to Null Safety in Kotlin](http://www.baeldung.com/kotlin-null-safety)
-- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)
-- [Difference Between “==” and “===” operators in Kotlin](http://www.baeldung.com/kotlin-equality-operators)
-- [Generics in Kotlin](http://www.baeldung.com/kotlin-generics)
-- [Introduction to Kotlin Coroutines](http://www.baeldung.com/kotlin-coroutines)
-- [Destructuring Declarations in Kotlin](http://www.baeldung.com/kotlin-destructuring-declarations)
-- [Lazy Initialization in Kotlin](http://www.baeldung.com/kotlin-lazy-initialization)
-- [Overview of Kotlin Collections API](http://www.baeldung.com/kotlin-collections-api)
-- [Converting a List to Map in Kotlin](http://www.baeldung.com/kotlin-list-to-map)
-- [Data Classes in Kotlin](http://www.baeldung.com/kotlin-data-classes)
-- [Delegated Properties in Kotlin](http://www.baeldung.com/kotlin-delegated-properties)
-- [Sealed Classes in Kotlin](http://www.baeldung.com/kotlin-sealed-classes)
-- [JUnit 5 for Kotlin Developers](http://www.baeldung.com/junit-5-kotlin)
-- [Extension Methods in Kotlin](http://www.baeldung.com/kotlin-extension-methods)
-- [Infix Functions in Kotlin](http://www.baeldung.com/kotlin-infix-functions)
-- [Try-with-resources in Kotlin](http://www.baeldung.com/kotlin-try-with-resources)
-- [Regular Expressions in Kotlin](http://www.baeldung.com/kotlin-regular-expressions)
-- [Objects in Kotlin](http://www.baeldung.com/kotlin-objects)
-- [Reading from a File in Kotlin](http://www.baeldung.com/kotlin-read-file)
-- [Guide to Kotlin @JvmField](http://www.baeldung.com/kotlin-jvm-field-annotation)
-- [Filtering Kotlin Collections](http://www.baeldung.com/kotlin-filter-collection)
-- [Writing to a File in Kotlin](http://www.baeldung.com/kotlin-write-file)
-- [Lambda Expressions in Kotlin](http://www.baeldung.com/kotlin-lambda-expressions)
-- [Kotlin String Templates](http://www.baeldung.com/kotlin-string-template)
-- [Working with Enums in Kotlin](http://www.baeldung.com/kotlin-enum)
-- [Create a Java and Kotlin Project with Maven](http://www.baeldung.com/kotlin-maven-java-project)
-- [Reflection with Kotlin](http://www.baeldung.com/kotlin-reflection)
-- [Get a Random Number in Kotlin](http://www.baeldung.com/kotlin-random-number)
-- [Idiomatic Logging in Kotlin](http://www.baeldung.com/kotlin-logging)
+This module contains articles about core Kotlin.
+
+### Relevant articles:
+
+- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin)
+- [Guide to the “when{}” Block in Kotlin](https://www.baeldung.com/kotlin-when)
+- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin-null-safety)
+- [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability)
+- [Difference Between “==” and “===” operators in Kotlin](https://www.baeldung.com/kotlin-equality-operators)
+- [Generics in Kotlin](https://www.baeldung.com/kotlin-generics)
+- [Introduction to Kotlin Coroutines](https://www.baeldung.com/kotlin-coroutines)
+- [Destructuring Declarations in Kotlin](https://www.baeldung.com/kotlin-destructuring-declarations)
+- [Lazy Initialization in Kotlin](https://www.baeldung.com/kotlin-lazy-initialization)
+- [Overview of Kotlin Collections API](https://www.baeldung.com/kotlin-collections-api)
+- [Converting a List to Map in Kotlin](https://www.baeldung.com/kotlin-list-to-map)
+- [Data Classes in Kotlin](https://www.baeldung.com/kotlin-data-classes)
+- [Delegated Properties in Kotlin](https://www.baeldung.com/kotlin-delegated-properties)
+- [Sealed Classes in Kotlin](https://www.baeldung.com/kotlin-sealed-classes)
+- [JUnit 5 for Kotlin Developers](https://www.baeldung.com/junit-5-kotlin)
+- [Extension Methods in Kotlin](https://www.baeldung.com/kotlin-extension-methods)
+- [Infix Functions in Kotlin](https://www.baeldung.com/kotlin-infix-functions)
+- [Try-with-resources in Kotlin](https://www.baeldung.com/kotlin-try-with-resources)
+- [Regular Expressions in Kotlin](https://www.baeldung.com/kotlin-regular-expressions)
+- [Objects in Kotlin](https://www.baeldung.com/kotlin-objects)
+- [Reading from a File in Kotlin](https://www.baeldung.com/kotlin-read-file)
+- [Guide to Kotlin @JvmField](https://www.baeldung.com/kotlin-jvm-field-annotation)
+- [Filtering Kotlin Collections](https://www.baeldung.com/kotlin-filter-collection)
+- [Writing to a File in Kotlin](https://www.baeldung.com/kotlin-write-file)
+- [Lambda Expressions in Kotlin](https://www.baeldung.com/kotlin-lambda-expressions)
+- [Kotlin String Templates](https://www.baeldung.com/kotlin-string-template)
+- [Working with Enums in Kotlin](https://www.baeldung.com/kotlin-enum)
+- [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project)
+- [Reflection with Kotlin](https://www.baeldung.com/kotlin-reflection)
+- [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number)
+- [Idiomatic Logging in Kotlin](https://www.baeldung.com/kotlin-logging)
- [Kotlin Constructors](https://www.baeldung.com/kotlin-constructors)
- [Creational Design Patterns in Kotlin: Builder](https://www.baeldung.com/kotlin-builder-pattern)
- [Kotlin Nested and Inner Classes](https://www.baeldung.com/kotlin-inner-classes)
@@ -56,3 +60,4 @@
- [Static Methods Behavior in Kotlin](https://www.baeldung.com/kotlin-static-methods)
- [Inline Functions in Kotlin](https://www.baeldung.com/kotlin-inline-functions)
- [Delegation Pattern in Kotlin](https://www.baeldung.com/kotlin-delegation-pattern)
+- More articles: [[next -->]](/core-kotlin-2)
diff --git a/core-scala/README.md b/core-scala/README.md
index eed344193f..e6fc75d59e 100644
--- a/core-scala/README.md
+++ b/core-scala/README.md
@@ -1,3 +1,7 @@
+## Core Scala
+
+This module contains articles about Scala's core features
+
### Relevant Articles:
- [Introduction to Scala](https://www.baeldung.com/scala-intro)
diff --git a/couchbase/README.md b/couchbase/README.md
index 7a99ce4299..c4c7df97da 100644
--- a/couchbase/README.md
+++ b/couchbase/README.md
@@ -1,11 +1,11 @@
## Couchbase SDK Tutorial Project
### Relevant Articles:
-- [Introduction to Couchbase SDK for Java](http://www.baeldung.com/java-couchbase-sdk)
-- [Using Couchbase in a Spring Application](http://www.baeldung.com/couchbase-sdk-spring)
-- [Asynchronous Batch Operations in Couchbase](http://www.baeldung.com/async-batch-operations-in-couchbase)
-- [Querying Couchbase with MapReduce Views](http://www.baeldung.com/couchbase-query-mapreduce-view)
-- [Querying Couchbase with N1QL](http://www.baeldung.com/n1ql-couchbase)
+- [Introduction to Couchbase SDK for Java](https://www.baeldung.com/java-couchbase-sdk)
+- [Using Couchbase in a Spring Application](https://www.baeldung.com/couchbase-sdk-spring)
+- [Asynchronous Batch Operations in Couchbase](https://www.baeldung.com/async-batch-operations-in-couchbase)
+- [Querying Couchbase with MapReduce Views](https://www.baeldung.com/couchbase-query-mapreduce-view)
+- [Querying Couchbase with N1QL](https://www.baeldung.com/n1ql-couchbase)
### Overview
This Maven project contains the Java code for the Couchbase entities and Spring services
diff --git a/dagger/README.md b/dagger/README.md
index 72cba3d3f2..81dc161ca1 100644
--- a/dagger/README.md
+++ b/dagger/README.md
@@ -1,3 +1,3 @@
### Relevant articles:
-- [Introduction to Dagger 2](http://www.baeldung.com/dagger-2)
+- [Introduction to Dagger 2](https://www.baeldung.com/dagger-2)
diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md
index 14e585cd97..eb1e19daa1 100644
--- a/deeplearning4j/README.md
+++ b/deeplearning4j/README.md
@@ -2,4 +2,4 @@
This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library.
### Relevant Articles:
-- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j)
+- [A Guide to Deeplearning4j](https://www.baeldung.com/deeplearning4j)
diff --git a/disruptor/README.md b/disruptor/README.md
index 779b1e89c4..8f977d090a 100644
--- a/disruptor/README.md
+++ b/disruptor/README.md
@@ -1,3 +1,3 @@
## Relevant articles:
-- [Concurrency with LMAX Disruptor – An Introduction](http://www.baeldung.com/lmax-disruptor-concurrency)
+- [Concurrency with LMAX Disruptor – An Introduction](https://www.baeldung.com/lmax-disruptor-concurrency)
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 0000000000..7948b3d663
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles:
+
+- [Introduction to Docker Compose](https://www.baeldung.com/docker-compose)
diff --git a/dozer/README.md b/dozer/README.md
index 5e104d914c..2e610b836a 100644
--- a/dozer/README.md
+++ b/dozer/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [A Guide to Mapping With Dozer](http://www.baeldung.com/dozer)
+- [A Guide to Mapping With Dozer](https://www.baeldung.com/dozer)
diff --git a/drools/README.MD b/drools/README.MD
index 5efbe0d3c3..1ff3dfba20 100644
--- a/drools/README.MD
+++ b/drools/README.MD
@@ -1,4 +1,4 @@
### Relevant Articles:
-- [Introduction to Drools](http://www.baeldung.com/drools)
-- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel)
-- [An Example of Backward Chaining in Drools](http://www.baeldung.com/drools-backward-chaining)
+- [Introduction to Drools](https://www.baeldung.com/drools)
+- [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel)
+- [An Example of Backward Chaining in Drools](https://www.baeldung.com/drools-backward-chaining)
diff --git a/dubbo/README.md b/dubbo/README.md
index 0a4cd9a204..566efe28f5 100644
--- a/dubbo/README.md
+++ b/dubbo/README.md
@@ -1,4 +1,4 @@
## Relevant articles:
-- [Introduction to Dubbo](http://www.baeldung.com/dubbo)
+- [Introduction to Dubbo](https://www.baeldung.com/dubbo)
diff --git a/ethereum/README.md b/ethereum/README.md
index d06ca09636..7eccea7135 100644
--- a/ethereum/README.md
+++ b/ethereum/README.md
@@ -1,6 +1,6 @@
## Ethereum
### Relevant Articles:
-- [Introduction to EthereumJ](http://www.baeldung.com/ethereumj)
-- [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity)
-- [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j)
+- [Introduction to EthereumJ](https://www.baeldung.com/ethereumj)
+- [Creating and Deploying Smart Contracts with Solidity](https://www.baeldung.com/smart-contracts-ethereum-solidity)
+- [Lightweight Ethereum Clients Using Web3j](https://www.baeldung.com/web3j)
diff --git a/feign/README.md b/feign/README.md
index da04c40cdc..5aa0e3f56f 100644
--- a/feign/README.md
+++ b/feign/README.md
@@ -6,5 +6,5 @@ This is the implementation of a [spring-hypermedia-api][1] client using Feign.
### Relevant Articles:
-- [Intro to Feign](http://www.baeldung.com/intro-to-feign)
-- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback)
+- [Intro to Feign](https://www.baeldung.com/intro-to-feign)
+- [Introduction to SLF4J](https://www.baeldung.com/slf4j-with-log4j2-logback)
diff --git a/geotools/README.md b/geotools/README.md
index 188ff0fddb..98f1e2c283 100644
--- a/geotools/README.md
+++ b/geotools/README.md
@@ -1,3 +1,3 @@
### Relevant Articles
-[Introduction to GeoTools](http://www.baeldung.com/geo-tools)
+[Introduction to GeoTools](https://www.baeldung.com/geo-tools)
diff --git a/google-cloud/README.md b/google-cloud/README.md
index 87ca17eac4..c6c49b88bf 100644
--- a/google-cloud/README.md
+++ b/google-cloud/README.md
@@ -1,7 +1,7 @@
## Google Cloud Tutorial Project
### Relevant Article:
-- [Intro to Google Cloud Storage With Java](http://www.baeldung.com/java-google-cloud-storage)
+- [Intro to Google Cloud Storage With Java](https://www.baeldung.com/java-google-cloud-storage)
### Overview
This Maven project contains the Java code for the article linked above.
diff --git a/google-web-toolkit/README.md b/google-web-toolkit/README.md
index 3526fe9962..d2a8b324ec 100644
--- a/google-web-toolkit/README.md
+++ b/google-web-toolkit/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [Introduction to GWT](http://www.baeldung.com/gwt)
+- [Introduction to GWT](https://www.baeldung.com/gwt)
diff --git a/gradle/README.md b/gradle/README.md
index 14e460f225..0ad0ff3e45 100644
--- a/gradle/README.md
+++ b/gradle/README.md
@@ -1,6 +1,6 @@
## Relevant articles:
-- [Introduction to Gradle](http://www.baeldung.com/gradle)
-- [Writing Custom Gradle Plugins](http://www.baeldung.com/gradle-create-plugin)
-- [Creating a Fat Jar in Gradle](http://www.baeldung.com/gradle-fat-jar)
-- [A Custom Task in Gradle](http://www.baeldung.com/gradle-custom-task)
+- [Introduction to Gradle](https://www.baeldung.com/gradle)
+- [Writing Custom Gradle Plugins](https://www.baeldung.com/gradle-create-plugin)
+- [Creating a Fat Jar in Gradle](https://www.baeldung.com/gradle-fat-jar)
+- [A Custom Task in Gradle](https://www.baeldung.com/gradle-custom-task)
- [Using JUnit 5 with Gradle](https://www.baeldung.com/junit-5-gradle)
diff --git a/grails/README.md b/grails/README.md
index faa50a7efd..b93ac5de2e 100644
--- a/grails/README.md
+++ b/grails/README.md
@@ -1,3 +1,3 @@
### Relevant articles
-- [Build an MVC Web Application with Grails](http://www.baeldung.com/grails-mvc-application)
+- [Build an MVC Web Application with Grails](https://www.baeldung.com/grails-mvc-application)
diff --git a/graphql/graphql-java/README.md b/graphql/graphql-java/README.md
index 0033524209..240b62f6b4 100644
--- a/graphql/graphql-java/README.md
+++ b/graphql/graphql-java/README.md
@@ -1,3 +1,3 @@
## Relevant articles:
-- [Introduction to GraphQL](http://www.baeldung.com/graphql)
+- [Introduction to GraphQL](https://www.baeldung.com/graphql)
diff --git a/grpc/README.md b/grpc/README.md
index 5a60ca2e7e..17128dd19f 100644
--- a/grpc/README.md
+++ b/grpc/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [Introduction to gRPC](http://www.baeldung.com/grpc-introduction)
+- [Introduction to gRPC](https://www.baeldung.com/grpc-introduction)
diff --git a/gson/README.md b/gson/README.md
index 268116a2ac..8b882f2d3e 100644
--- a/gson/README.md
+++ b/gson/README.md
@@ -4,9 +4,9 @@
### Relevant Articles:
-- [Gson Deserialization Cookbook](http://www.baeldung.com/gson-deserialization-guide)
-- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson)
-- [Exclude Fields from Serialization in Gson](http://www.baeldung.com/gson-exclude-fields-serialization)
+- [Gson Deserialization Cookbook](https://www.baeldung.com/gson-deserialization-guide)
+- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson)
+- [Exclude Fields from Serialization in Gson](https://www.baeldung.com/gson-exclude-fields-serialization)
- [Save Data to a JSON File with Gson](https://www.baeldung.com/gson-save-file)
- [Convert JSON to a Map Using Gson](https://www.baeldung.com/gson-json-to-map)
- [Working with Primitive Values in Gson](https://www.baeldung.com/java-gson-primitives)
diff --git a/guava-collections-set/README.md b/guava-collections-set/README.md
index c36d9e0b61..e24552aae8 100644
--- a/guava-collections-set/README.md
+++ b/guava-collections-set/README.md
@@ -2,7 +2,7 @@
## Relevant Articles:
-- [Guava – Sets](http://www.baeldung.com/guava-sets)
-- [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset)
-- [Guava Set + Function = Map](http://www.baeldung.com/guava-set-function-map-tutorial)
+- [Guava – Sets](https://www.baeldung.com/guava-sets)
+- [Guide to Guava RangeSet](https://www.baeldung.com/guava-rangeset)
+- [Guava Set + Function = Map](https://www.baeldung.com/guava-set-function-map-tutorial)
- [Guide to Guava Multiset](https://www.baeldung.com/guava-multiset)
diff --git a/guava-collections/README.md b/guava-collections/README.md
index e919a98c2b..95397f0ff0 100644
--- a/guava-collections/README.md
+++ b/guava-collections/README.md
@@ -4,17 +4,17 @@
### Relevant Articles:
-- [Guava Collections Cookbook](http://www.baeldung.com/guava-collections)
-- [Guava Ordering Cookbook](http://www.baeldung.com/guava-order)
-- [Hamcrest Collections Cookbook](http://www.baeldung.com/hamcrest-collections-arrays)
-- [Partition a List in Java](http://www.baeldung.com/java-list-split)
-- [Filtering and Transforming Collections in Guava](http://www.baeldung.com/guava-filter-and-transform-a-collection)
-- [Guava – Join and Split Collections](http://www.baeldung.com/guava-joiner-and-splitter-tutorial)
-- [Guava – Lists](http://www.baeldung.com/guava-lists)
-- [Guava – Maps](http://www.baeldung.com/guava-maps)
-- [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap)
-- [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap)
-- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](http://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue)
+- [Guava Collections Cookbook](https://www.baeldung.com/guava-collections)
+- [Guava Ordering Cookbook](https://www.baeldung.com/guava-order)
+- [Hamcrest Collections Cookbook](https://www.baeldung.com/hamcrest-collections-arrays)
+- [Partition a List in Java](https://www.baeldung.com/java-list-split)
+- [Filtering and Transforming Collections in Guava](https://www.baeldung.com/guava-filter-and-transform-a-collection)
+- [Guava – Join and Split Collections](https://www.baeldung.com/guava-joiner-and-splitter-tutorial)
+- [Guava – Lists](https://www.baeldung.com/guava-lists)
+- [Guava – Maps](https://www.baeldung.com/guava-maps)
+- [Guide to Guava Multimap](https://www.baeldung.com/guava-multimap)
+- [Guide to Guava RangeMap](https://www.baeldung.com/guava-rangemap)
+- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue)
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
-- [Guide to Guava Table](http://www.baeldung.com/guava-table)
-- [Guide to Guava ClassToInstanceMap](http://www.baeldung.com/guava-class-to-instance-map)
\ No newline at end of file
+- [Guide to Guava Table](https://www.baeldung.com/guava-table)
+- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map)
diff --git a/guava-io/README.md b/guava-io/README.md
new file mode 100644
index 0000000000..0737accbed
--- /dev/null
+++ b/guava-io/README.md
@@ -0,0 +1,4 @@
+### Relevant Articles:
+
+- [Using Guava CountingOutputStream](https://www.baeldung.com/guava-counting-outputstream)
+- [Guava – Write to File, Read from File](https://www.baeldung.com/guava-write-to-file-read-from-file)
diff --git a/guava-io/pom.xml b/guava-io/pom.xml
new file mode 100644
index 0000000000..2a66baba80
--- /dev/null
+++ b/guava-io/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ com.baeldung
+ guava-io
+ 0.1.0-SNAPSHOT
+ guava-io
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+ guava-io
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamUnitTest.java b/guava-io/src/main/test/java/com/baeldung/guava/GuavaCountingOutputStreamUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamUnitTest.java
rename to guava-io/src/main/test/java/com/baeldung/guava/GuavaCountingOutputStreamUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaIOUnitTest.java b/guava-io/src/main/test/java/com/baeldung/guava/GuavaIOUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaIOUnitTest.java
rename to guava-io/src/main/test/java/com/baeldung/guava/GuavaIOUnitTest.java
diff --git a/guava/README.md b/guava/README.md
index 60754dbe57..a9694daf0b 100644
--- a/guava/README.md
+++ b/guava/README.md
@@ -1,20 +1,15 @@
-=========
-
-## Guava and Hamcrest Cookbooks and Examples
+## Guava Examples
### Relevant Articles:
-- [Guava Functional Cookbook](http://www.baeldung.com/guava-functions-predicates)
-- [Guava – Write to File, Read from File](http://www.baeldung.com/guava-write-to-file-read-from-file)
-- [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering)
-- [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions)
-- [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader)
-- [Introduction to Guava Memoizer](http://www.baeldung.com/guava-memoizer)
-- [Guide to Guava’s EventBus](http://www.baeldung.com/guava-eventbus)
-- [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection)
-- [Guide to Mathematical Utilities in Guava](http://www.baeldung.com/guava-math)
-- [Bloom Filter in Java using Guava](http://www.baeldung.com/guava-bloom-filter)
-- [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream)
-- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers)
-- [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter)
-- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers)
+- [Guava Functional Cookbook](https://www.baeldung.com/guava-functions-predicates)
+- [Guide to Guava’s Ordering](https://www.baeldung.com/guava-ordering)
+- [Guide to Guava’s PreConditions](https://www.baeldung.com/guava-preconditions)
+- [Introduction to Guava CacheLoader](https://www.baeldung.com/guava-cacheloader)
+- [Introduction to Guava Memoizer](https://www.baeldung.com/guava-memoizer)
+- [Guide to Guava’s EventBus](https://www.baeldung.com/guava-eventbus)
+- [Guide to Guava’s Reflection Utilities](https://www.baeldung.com/guava-reflection)
+- [Guide to Mathematical Utilities in Guava](https://www.baeldung.com/guava-math)
+- [Bloom Filter in Java using Guava](https://www.baeldung.com/guava-bloom-filter)
+- [Quick Guide to the Guava RateLimiter](https://www.baeldung.com/guava-rate-limiter)
+
diff --git a/guava/pom.xml b/guava/pom.xml
index 34eb7eafa6..3a19901a02 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -27,13 +27,7 @@
test
-
-
- org.hamcrest
- java-hamcrest
- ${java-hamcrest.version}
- test
-
+
@@ -52,7 +46,6 @@
3.6.1
- 2.0.0.0
\ No newline at end of file
diff --git a/guava/src/test/java/org/baeldung/hamcrest/README.md b/guava/src/test/java/org/baeldung/hamcrest/README.md
deleted file mode 100644
index 7266ecda3a..0000000000
--- a/guava/src/test/java/org/baeldung/hamcrest/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide)
diff --git a/guice/README.md b/guice/README.md
index 77c788c363..cc3a8755c0 100644
--- a/guice/README.md
+++ b/guice/README.md
@@ -1,5 +1,5 @@
## Google Guice Tutorials Project
### Relevant Articles
-- [Guide to Google Guice](http://www.baeldung.com/guice)
+- [Guide to Google Guice](https://www.baeldung.com/guice)
- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection)
diff --git a/hazelcast/README.md b/hazelcast/README.md
index 7adb13f2af..8ba6dc122b 100644
--- a/hazelcast/README.md
+++ b/hazelcast/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [Guide to Hazelcast with Java](http://www.baeldung.com/java-hazelcast)
+- [Guide to Hazelcast with Java](https://www.baeldung.com/java-hazelcast)
- [Introduction to Hazelcast Jet](https://www.baeldung.com/hazelcast-jet)
diff --git a/httpclient-simple/README.md b/httpclient-simple/README.md
index e3535a133e..098d5f278e 100644
--- a/httpclient-simple/README.md
+++ b/httpclient-simple/README.md
@@ -1,12 +1,15 @@
-=========
-## This module contains articles that are part of the HTTPClient Ebook
+## HTTPClient Ebook
-- [HttpClient 4 – Get the Status Code](http://www.baeldung.com/httpclient-status-code)
-- [HttpClient with SSL](http://www.baeldung.com/httpclient-ssl)
-- [HttpClient Timeout](http://www.baeldung.com/httpclient-timeout)
-- [HttpClient 4 – Send Custom Cookie](http://www.baeldung.com/httpclient-4-cookies)
-- [Custom HTTP Header with the HttpClient](http://www.baeldung.com/httpclient-custom-http-header)
-- [HttpClient Basic Authentication](http://www.baeldung.com/httpclient-4-basic-authentication)
+This module contains articles about HTTPClient that are part of the HTTPClient Ebook.
+
+### Relevant Articles
+
+- [HttpClient 4 – Get the Status Code](https://www.baeldung.com/httpclient-status-code)
+- [HttpClient with SSL](https://www.baeldung.com/httpclient-ssl)
+- [HttpClient Timeout](https://www.baeldung.com/httpclient-timeout)
+- [HttpClient 4 – Send Custom Cookie](https://www.baeldung.com/httpclient-4-cookies)
+- [Custom HTTP Header with the HttpClient](https://www.baeldung.com/httpclient-custom-http-header)
+- [HttpClient Basic Authentication](https://www.baeldung.com/httpclient-4-basic-authentication)
- [Posting with HttpClient](https://www.baeldung.com/httpclient-post-http-request)
diff --git a/httpclient/README.md b/httpclient/README.md
index a5fc29b089..6bce5567ec 100644
--- a/httpclient/README.md
+++ b/httpclient/README.md
@@ -7,13 +7,13 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [HttpClient 4 – Cancel Request](http://www.baeldung.com/httpclient-cancel-request)
-- [HttpClient 4 Cookbook](http://www.baeldung.com/httpclient4)
-- [Unshorten URLs with HttpClient](http://www.baeldung.com/unshorten-url-httpclient)
-- [HttpClient 4 – Follow Redirects for POST](http://www.baeldung.com/httpclient-redirect-on-http-post)
-- [Multipart Upload with HttpClient 4](http://www.baeldung.com/httpclient-multipart-upload)
-- [HttpAsyncClient Tutorial](http://www.baeldung.com/httpasyncclient-tutorial)
-- [HttpClient 4 Tutorial](http://www.baeldung.com/httpclient-guide)
-- [Advanced HttpClient Configuration](http://www.baeldung.com/httpclient-advanced-config)
-- [HttpClient 4 – Do Not Follow Redirects](http://www.baeldung.com/httpclient-stop-follow-redirect)
-- [Custom User-Agent in HttpClient 4](http://www.baeldung.com/httpclient-user-agent-header)
+- [HttpClient 4 – Cancel Request](https://www.baeldung.com/httpclient-cancel-request)
+- [HttpClient 4 Cookbook](https://www.baeldung.com/httpclient4)
+- [Unshorten URLs with HttpClient](https://www.baeldung.com/unshorten-url-httpclient)
+- [HttpClient 4 – Follow Redirects for POST](https://www.baeldung.com/httpclient-redirect-on-http-post)
+- [Multipart Upload with HttpClient 4](https://www.baeldung.com/httpclient-multipart-upload)
+- [HttpAsyncClient Tutorial](https://www.baeldung.com/httpasyncclient-tutorial)
+- [HttpClient 4 Tutorial](https://www.baeldung.com/httpclient-guide)
+- [Advanced HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config)
+- [HttpClient 4 – Do Not Follow Redirects](https://www.baeldung.com/httpclient-stop-follow-redirect)
+- [Custom User-Agent in HttpClient 4](https://www.baeldung.com/httpclient-user-agent-header)
diff --git a/hystrix/README.md b/hystrix/README.md
index cc5c8a197f..d53baee957 100644
--- a/hystrix/README.md
+++ b/hystrix/README.md
@@ -1,3 +1,7 @@
+## Hystrix
+
+This module contains articles about Hystrix.
+
### Relevant Articles:
-- [Hystrix Integration with Existing Spring Application](http://www.baeldung.com/hystrix-integration-with-spring-aop)
-- [Introduction to Hystrix](http://www.baeldung.com/introduction-to-hystrix)
+- [Hystrix Integration with Existing Spring Application](https://www.baeldung.com/hystrix-integration-with-spring-aop)
+- [Introduction to Hystrix](https://www.baeldung.com/introduction-to-hystrix)
diff --git a/image-processing/README.md b/image-processing/README.md
index 48604bdb1f..adb35c2318 100644
--- a/image-processing/README.md
+++ b/image-processing/README.md
@@ -1,2 +1,6 @@
+## Image Processing
+
+This module contains articles about image processing.
+
### Relevant Articles:
-- [Working with Images in Java](http://www.baeldung.com/java-images)
+- [Working with Images in Java](https://www.baeldung.com/java-images)
diff --git a/immutables/README.md b/immutables/README.md
index b69a14f035..a93a342f9c 100644
--- a/immutables/README.md
+++ b/immutables/README.md
@@ -1,2 +1,6 @@
+## Immutables
+
+This module contains articles about the Immutables library.
+
### Relevant Articles:
-- [Introduction to Immutables](http://www.baeldung.com/immutables)
+- [Introduction to Immutables](https://www.baeldung.com/immutables)
diff --git a/jackson-2/README.md b/jackson-2/README.md
index 920eaa91e8..5e0cb4ec37 100644
--- a/jackson-2/README.md
+++ b/jackson-2/README.md
@@ -1,7 +1,7 @@
-=========
-
## Jackson Cookbooks and Examples
+This module contains articles about Jackson.
+
### The Course
The "REST With Spring" Classes: http://bit.ly/restwithspring
@@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Converting JSON to CSV in Java](https://www.baeldung.com/java-converting-json-to-csv)
- [Compare Two JSON Objects with Jackson](https://www.baeldung.com/jackson-compare-two-json-objects)
- [Calling Default Serializer from Custom Serializer in Jackson](https://www.baeldung.com/jackson-call-default-serializer-from-custom-serializer)
+- More articles: [[<-- prev]](/../jackson)
diff --git a/jackson-simple/README.md b/jackson-simple/README.md
index be647e22d5..302fcb5b05 100644
--- a/jackson-simple/README.md
+++ b/jackson-simple/README.md
@@ -1,13 +1,14 @@
-=========
### Jackson Articles that are also part of the e-book
+This module contains articles about Jackson that are also part of the Jackson Ebook.
+
###The Course
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [Jackson Ignore Properties on Marshalling](http://www.baeldung.com/jackson-ignore-properties-on-serialization)
-- [Jackson Unmarshalling json with Unknown Properties](http://www.baeldung.com/jackson-deserialize-json-unknown-properties)
-- [Jackson Annotation Examples](http://www.baeldung.com/jackson-annotations)
-- [Intro to the Jackson ObjectMapper](http://www.baeldung.com/jackson-object-mapper-tutorial)
-- [Ignore Null Fields with Jackson](http://www.baeldung.com/jackson-ignore-null-fields)
-- [Jackson – Change Name of Field](http://www.baeldung.com/jackson-name-of-property)
+- [Jackson Ignore Properties on Marshalling](https://www.baeldung.com/jackson-ignore-properties-on-serialization)
+- [Jackson Unmarshalling json with Unknown Properties](https://www.baeldung.com/jackson-deserialize-json-unknown-properties)
+- [Jackson Annotation Examples](https://www.baeldung.com/jackson-annotations)
+- [Intro to the Jackson ObjectMapper](https://www.baeldung.com/jackson-object-mapper-tutorial)
+- [Ignore Null Fields with Jackson](https://www.baeldung.com/jackson-ignore-null-fields)
+- [Jackson – Change Name of Field](https://www.baeldung.com/jackson-name-of-property)
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java
similarity index 98%
rename from jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java
index 146f274380..da8b464d03 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.test;
+package com.baeldung.jackson.ignore;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@@ -15,9 +15,9 @@ import com.baeldung.jackson.dtos.MyDtoIncludeNonDefault;
import com.baeldung.jackson.dtos.MyDtoWithFilter;
import com.baeldung.jackson.dtos.MyDtoWithSpecialField;
import com.baeldung.jackson.dtos.MyMixInForIgnoreType;
-import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreField;
-import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreFieldByName;
-import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreNull;
+import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreField;
+import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreFieldByName;
+import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreNull;
import com.baeldung.jackson.serialization.MyDtoNullKeySerializer;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java
similarity index 94%
rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java
index f573501e85..8cbcb773cc 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java
similarity index 95%
rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java
index e7b8ea2a8e..1aee31a1b3 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java
similarity index 96%
rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java
index bc443500a1..75532f18c2 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
diff --git a/jackson/README.md b/jackson/README.md
index 01d9419a27..f96a569617 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -1,35 +1,36 @@
-=========
-
## Jackson Cookbooks and Examples
+This module contains articles about Jackson.
+
###The Course
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
-- [Jackson – Custom Serializer](http://www.baeldung.com/jackson-custom-serialization)
-- [Getting Started with Custom Deserialization in Jackson](http://www.baeldung.com/jackson-deserialization)
-- [Jackson Exceptions – Problems and Solutions](http://www.baeldung.com/jackson-exception)
-- [Jackson Date](http://www.baeldung.com/jackson-serialize-dates)
-- [Jackson – Bidirectional Relationships](http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
-- [Jackson JSON Tutorial](http://www.baeldung.com/jackson)
-- [Jackson – Working with Maps and nulls](http://www.baeldung.com/jackson-map-null-values-or-null-key)
-- [Jackson – Decide What Fields Get Serialized/Deserialized](http://www.baeldung.com/jackson-field-serializable-deserializable-or-not)
-- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson)
-- [XML Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-xml-serialization-and-deserialization)
-- [More Jackson Annotations](http://www.baeldung.com/jackson-advanced-annotations)
-- [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance)
-- [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat)
-- [Using Optional with Jackson](http://www.baeldung.com/jackson-optional)
-- [Map Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-map)
-- [Jackson Streaming API](http://www.baeldung.com/jackson-streaming-api)
-- [Jackson – JsonMappingException (No serializer found for class)](http://www.baeldung.com/jackson-jsonmappingexception)
-- [How To Serialize Enums as JSON Objects with Jackson](http://www.baeldung.com/jackson-serialize-enums)
-- [Jackson – Marshall String to JsonNode](http://www.baeldung.com/jackson-json-to-jsonnode)
-- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
-- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria)
-- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values)
+- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array)
+- [Jackson – Custom Serializer](https://www.baeldung.com/jackson-custom-serialization)
+- [Getting Started with Custom Deserialization in Jackson](https://www.baeldung.com/jackson-deserialization)
+- [Jackson Exceptions – Problems and Solutions](https://www.baeldung.com/jackson-exception)
+- [Jackson Date](https://www.baeldung.com/jackson-serialize-dates)
+- [Jackson – Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
+- [Jackson JSON Tutorial](https://www.baeldung.com/jackson)
+- [Jackson – Working with Maps and nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key)
+- [Jackson – Decide What Fields Get Serialized/Deserialized](https://www.baeldung.com/jackson-field-serializable-deserializable-or-not)
+- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson)
+- [XML Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-xml-serialization-and-deserialization)
+- [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations)
+- [Inheritance with Jackson](https://www.baeldung.com/jackson-inheritance)
+- [Guide to @JsonFormat in Jackson](https://www.baeldung.com/jackson-jsonformat)
+- [Using Optional with Jackson](https://www.baeldung.com/jackson-optional)
+- [Map Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-map)
+- [Jackson Streaming API](https://www.baeldung.com/jackson-streaming-api)
+- [Jackson – JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception)
+- [How To Serialize Enums as JSON Objects with Jackson](https://www.baeldung.com/jackson-serialize-enums)
+- [Jackson – Marshall String to JsonNode](https://www.baeldung.com/jackson-json-to-jsonnode)
+- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array)
+- [Serialize Only Fields that meet a Custom Criteria with Jackson](https://www.baeldung.com/jackson-serialize-field-custom-criteria)
+- [Mapping Nested Values with Jackson](https://www.baeldung.com/jackson-nested-values)
- [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json)
- [Deserialize Immutable Objects with Jackson](https://www.baeldung.com/jackson-deserialize-immutable-objects)
- [Mapping a Dynamic JSON Object with Jackson](https://www.baeldung.com/jackson-mapping-dynamic-object)
+- More articles: [[next -->]](/../jackson-2)
diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java
similarity index 99%
rename from jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java
index cd2c2925d6..dd0fe8dc56 100644
--- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.test;
+package com.baeldung.jackson.exception.test;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
diff --git a/java-blockchain/README.md b/java-blockchain/README.md
index 600f4dd610..5afd0d356b 100644
--- a/java-blockchain/README.md
+++ b/java-blockchain/README.md
@@ -1,6 +1,7 @@
-=========
+## Java Blockchain
-## Basic Implementation of Blockchian in Java
+This module contains articles about Blockchain in Java
### Relevant Articles:
-- []()
+
+- [Implementing a Simple Blockchain in Java](https://www.baeldung.com/java-blockchain)
diff --git a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java
index 264e3c4b69..6b4e971cd7 100644
--- a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java
+++ b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java
@@ -3,7 +3,6 @@ package com.baeldung.blockchain;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -17,10 +16,10 @@ public class Block {
private long timeStamp;
private int nonce;
- public Block(String data, String previousHash) {
+ public Block(String data, String previousHash, long timeStamp) {
this.data = data;
this.previousHash = previousHash;
- this.timeStamp = new Date().getTime();
+ this.timeStamp = timeStamp;
this.hash = calculateBlockHash();
}
diff --git a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java
index acbf651e78..883e55c351 100644
--- a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java
+++ b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java
@@ -3,6 +3,7 @@ package com.baeldung.blockchain;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import org.junit.AfterClass;
@@ -17,10 +18,10 @@ public class BlockchainUnitTest {
@BeforeClass
public static void setUp() {
- Block genesisBlock = new Block("The is the Genesis Block.", "0");
+ Block genesisBlock = new Block("The is the Genesis Block.", "0", new Date().getTime());
genesisBlock.mineBlock(prefix);
blockchain.add(genesisBlock);
- Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash());
+ Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash(), new Date().getTime());
firstBlock.mineBlock(prefix);
blockchain.add(firstBlock);
}
@@ -28,7 +29,7 @@ public class BlockchainUnitTest {
@Test
public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
Block newBlock = new Block("The is a New Block.", blockchain.get(blockchain.size() - 1)
- .getHash());
+ .getHash(), new Date().getTime());
newBlock.mineBlock(prefix);
assertTrue(newBlock.getHash()
.substring(0, prefix)
diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md
index 614f20f186..6d4f6ddb3a 100644
--- a/java-collections-conversions/README.md
+++ b/java-collections-conversions/README.md
@@ -1,14 +1,14 @@
-=========
-
## Java Collections Cookbooks and Examples
+This module contains articles about conversions among Collection types and arrays in Java.
+
### Relevant Articles:
-- [Converting between an Array and a List in Java](http://www.baeldung.com/convert-array-to-list-and-list-to-array)
-- [Converting between an Array and a Set in Java](http://www.baeldung.com/convert-array-to-set-and-set-to-array)
-- [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list)
-- [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set)
-- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string)
-- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map)
+- [Converting between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array)
+- [Converting between an Array and a Set in Java](https://www.baeldung.com/convert-array-to-set-and-set-to-array)
+- [Converting between a List and a Set in Java](https://www.baeldung.com/convert-list-to-set-and-set-to-list)
+- [Convert a Map to an Array, List or Set in Java](https://www.baeldung.com/convert-map-values-to-array-list-set)
+- [Converting a List to String in Java](https://www.baeldung.com/java-list-to-string)
+- [How to Convert List to Map in Java](https://www.baeldung.com/java-list-to-map)
- [Array to String Conversions](https://www.baeldung.com/java-array-to-string)
- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist)
- [Java 8 Collectors toMap](https://www.baeldung.com/java-collectors-tomap)
diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md
index ff84e93ce4..0db83fbae7 100644
--- a/java-collections-maps-2/README.md
+++ b/java-collections-maps-2/README.md
@@ -1,3 +1,17 @@
-## Relevant Articles:
+## Java Collections Cookbooks and Examples
+
+This module contains articles about Map data structures in Java.
+
+### Relevant Articles:
- [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives)
- [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap)
+- [Guide to Java HashMap]()
+- [Guide to WeakHashMap in Java](https://www.baeldung.com/java-weakhashmap)
+- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion)
+- [Iterate over a Map in Java](https://www.baeldung.com/java-iterate-map)
+- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps)
+- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort)
+- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max)
+- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap)
+- More articles: [[<-- prev>]](/../java-collections-maps)
diff --git a/java-collections-maps-2/pom.xml b/java-collections-maps-2/pom.xml
index e242a8655e..a246559f61 100644
--- a/java-collections-maps-2/pom.xml
+++ b/java-collections-maps-2/pom.xml
@@ -41,6 +41,22 @@
commons-lang3${commons-lang3.version}
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+ org.assertjassertj-core
@@ -50,6 +66,9 @@
+ 0.6.5
+ 4.1
+ 1.7.08.2.03.0.28.1.0
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
new file mode 100644
index 0000000000..5559895730
--- /dev/null
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
@@ -0,0 +1,133 @@
+package com.baeldung.map;
+
+import java.util.*;
+
+public class Product {
+
+ private String name;
+ private String description;
+ private List tags;
+
+ public Product(String name, String description) {
+ this.name = name;
+ this.description = description;
+ this.tags = new ArrayList<>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public List getTags() {
+ return tags;
+ }
+
+ public Product addTagsOfOtherProdcut(Product product) {
+ this.tags.addAll(product.getTags());
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Product product = (Product) o;
+ return Objects.equals(name, product.name) &&
+ Objects.equals(description, product.description);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, description);
+ }
+
+ public static void forEach() {
+
+ HashMap productsByName = new HashMap<>();
+ productsByName.forEach( (key, product)
+ -> System.out.println("Key: " + key + " Product:" + product.getDescription())
+ //do something with the key and value
+ );
+
+ //Prior to Java 8:
+ for(Map.Entry entry : productsByName.entrySet()) {
+ Product product = entry.getValue();
+ String key = entry.getKey();
+ //do something with the key and value
+ }
+ }
+
+ public static void getOrDefault() {
+
+ HashMap productsByName = new HashMap<>();
+ Product chocolate = new Product("chocolate", "something sweet");
+ Product defaultProduct = productsByName.getOrDefault("horse carriage", chocolate);
+ Product bike = productsByName.getOrDefault("E-Bike", chocolate);
+
+ //Prior to Java 8:
+ Product bike2 = productsByName.containsKey("E-Bike")
+ ? productsByName.get("E-Bike")
+ : chocolate;
+ Product defaultProduct2 = productsByName.containsKey("horse carriage")
+ ? productsByName.get("horse carriage")
+ : chocolate;
+ }
+
+ public static void putIfAbsent() {
+
+ HashMap productsByName = new HashMap<>();
+ Product chocolate = new Product("chocolate", "something sweet");
+ productsByName.putIfAbsent("E-Bike", chocolate);
+
+ //Prior to Java 8:
+ if(productsByName.containsKey("E-Bike")) {
+ productsByName.put("E-Bike", chocolate);
+ }
+ }
+
+ public static void merge() {
+
+ HashMap productsByName = new HashMap<>();
+ Product eBike2 = new Product("E-Bike", "A bike with a battery");
+ eBike2.getTags().add("sport");
+ productsByName.merge("E-Bike", eBike2, Product::addTagsOfOtherProdcut);
+
+ //Prior to Java 8:
+ if(productsByName.containsKey("E-Bike")) {
+ productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2);
+ } else {
+ productsByName.put("E-Bike", eBike2);
+ }
+ }
+
+ public static void compute() {
+
+ HashMap productsByName = new HashMap<>();
+ Product eBike2 = new Product("E-Bike", "A bike with a battery");
+
+ productsByName.compute("E-Bike", (k,v) -> {
+ if(v != null) {
+ return v.addTagsOfOtherProdcut(eBike2);
+ } else {
+ return eBike2;
+ }
+ });
+
+ //Prior to Java 8:
+ if(productsByName.containsKey("E-Bike")) {
+ productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2);
+ } else {
+ productsByName.put("E-Bike", eBike2);
+ }
+ }
+}
diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
similarity index 96%
rename from java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
index aca0d05ef1..d13be924ff 100644
--- a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import com.google.common.base.Joiner;
import org.apache.commons.lang3.StringUtils;
diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
similarity index 94%
rename from java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
index caabca4a09..416ba4dd9a 100644
--- a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import com.google.common.base.Splitter;
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
similarity index 98%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
index 2ebc9413c8..cb18f3aa11 100644
--- a/java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
@@ -1,4 +1,6 @@
-package com.baeldung.map;
+package com.baeldung.map.copyhashmap;
+
+import org.apache.commons.lang3.SerializationUtils;
import java.util.HashMap;
import java.util.Map;
@@ -6,8 +8,6 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.SerializationUtils;
-
public class CopyHashMap {
public static HashMap copyUsingConstructor(HashMap originalMap) {
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
similarity index 98%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
index 4dbaceac62..4d63abcfd0 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map.initialize;
+package com.baeldung.map.initialize;
import java.util.AbstractMap;
import java.util.Collections;
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java b/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
similarity index 100%
rename from java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
similarity index 94%
rename from java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
index 93a98ba6fd..8c33c857ee 100644
--- a/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
@@ -1,11 +1,7 @@
-package com.baeldung.map.util;
+package com.baeldung.map.mapmax;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
import java.util.Map.Entry;
-import java.util.Optional;
public class MapMax {
diff --git a/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/sort/Employee.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
index b5e56f6141..d7fb0d1a1d 100644
--- a/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.sort;
+package com.baeldung.map.mergemaps;
public class Employee implements Comparable {
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
index 052cfb8bad..4f187bad90 100644
--- a/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
@@ -1,7 +1,7 @@
-package com.baeldung.map.java_8;
+package com.baeldung.map.mergemaps;
-import com.baeldung.sort.Employee;
import one.util.streamex.EntryStream;
+
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
similarity index 98%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
index d835950c68..30bec12ccc 100644
--- a/java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
@@ -1,4 +1,4 @@
-package com.baeldung.map;
+package com.baeldung.map.primitives;
import cern.colt.map.AbstractIntDoubleMap;
import cern.colt.map.OpenIntDoubleHashMap;
diff --git a/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
index b8a2b32060..14610ffb00 100644
--- a/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
@@ -1,8 +1,8 @@
-package com.baeldung.sort;
+package com.baeldung.map.sort;
+import com.baeldung.map.mergemaps.Employee;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import java.util.*;
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
new file mode 100644
index 0000000000..2015909870
--- /dev/null
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
@@ -0,0 +1,124 @@
+package com.baeldung.map;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ProductUnitTest {
+
+
+ @Test
+ public void getExistingValue() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+
+ Product nextPurchase = productsByName.get("E-Bike");
+
+ assertEquals("A bike with a battery", nextPurchase.getDescription());
+ }
+
+ @Test
+ public void getNonExistingValue() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+
+ Product nextPurchase = productsByName.get("Car");
+
+ assertNull(nextPurchase);
+ }
+
+ @Test
+ public void getExistingValueAfterSameKeyInsertedTwice() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+ Product newEBike = new Product("E-Bike", "A bike with a better battery");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+ productsByName.put(newEBike.getName(), newEBike);
+
+ Product nextPurchase = productsByName.get("E-Bike");
+
+ assertEquals("A bike with a better battery", nextPurchase.getDescription());
+ }
+
+ @Test
+ public void getExistingValueWithNullKey() {
+ HashMap productsByName = new HashMap<>();
+
+ Product defaultProduct = new Product("Chocolate", "At least buy chocolate");
+
+ productsByName.put(null, defaultProduct);
+ productsByName.put(defaultProduct.getName(), defaultProduct);
+
+ Product nextPurchase = productsByName.get(null);
+ assertEquals("At least buy chocolate", nextPurchase.getDescription());
+
+ nextPurchase = productsByName.get("Chocolate");
+ assertEquals("At least buy chocolate", nextPurchase.getDescription());
+ }
+
+ @Test
+ public void insertSameObjectWithDifferentKey() {
+ HashMap productsByName = new HashMap<>();
+
+ Product defaultProduct = new Product("Chocolate", "At least buy chocolate");
+
+ productsByName.put(null, defaultProduct);
+ productsByName.put(defaultProduct.getName(), defaultProduct);
+
+ assertSame(productsByName.get(null), productsByName.get("Chocolate"));
+ }
+
+ @Test
+ public void checkIfKeyExists() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+
+ productsByName.put(eBike.getName(), eBike);
+
+ assertTrue(productsByName.containsKey("E-Bike"));
+ }
+
+ @Test
+ public void checkIfValueExists() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+
+ productsByName.put(eBike.getName(), eBike);
+
+ assertTrue(productsByName.containsValue(eBike));
+ }
+
+ @Test
+ public void removeExistingKey() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+
+ productsByName.remove("E-Bike");
+
+ assertNull(productsByName.get("E-Bike"));
+ }
+
+}
diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
similarity index 97%
rename from java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
index d9923e74a0..4517dea328 100644
--- a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import org.apache.commons.collections4.MapUtils;
import org.junit.Assert;
diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
similarity index 95%
rename from java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
index 8fb906efd0..2f80b30871 100644
--- a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
similarity index 98%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
index c400eea153..e2d5e327e1 100644
--- a/java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
@@ -1,13 +1,12 @@
-package com.baeldung.map;
+package com.baeldung.map.copyhashmap;
-import static org.assertj.core.api.Assertions.assertThat;
+import com.google.common.collect.ImmutableMap;
+import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
+import static org.assertj.core.api.Assertions.assertThat;
public class CopyHashMapUnitTest {
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
similarity index 91%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
index 7963fa811c..5db55c26ea 100644
--- a/java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.map;
+package com.baeldung.map.copyhashmap;
import java.io.Serializable;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
similarity index 94%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
index 80a8983d6f..7c6dffe787 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
@@ -1,10 +1,10 @@
-package com.baeldung.java.map.initialize;
+package com.baeldung.map.initialize;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.Map;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class MapInitializerUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
similarity index 97%
rename from java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
index 883265cc8b..30b945bfc8 100644
--- a/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
@@ -1,14 +1,13 @@
-package com.baeldung.map.util;
+package com.baeldung.map.mapmax;
-
-import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class MapMaxUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java b/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
similarity index 91%
rename from java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
index f2dfc992c2..1057e3b9f0 100644
--- a/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
@@ -1,16 +1,14 @@
-package com.baeldung.collection;
-
-import java.util.ConcurrentModificationException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
+package com.baeldung.map.treemaphashmap;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
-public class WhenComparingTreeMapVsHashMap {
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class TreeMapVsHashMapUnitTest {
@Test
public void whenInsertObjectsTreeMap_thenNaturalOrder() {
diff --git a/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
similarity index 98%
rename from java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
index d7bcb31867..293f24c378 100644
--- a/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.weakhashmap;
+package com.baeldung.map.weakhashmap;
import org.junit.Test;
diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md
index 2eeb2c8843..87fefe1b9d 100644
--- a/java-collections-maps/README.md
+++ b/java-collections-maps/README.md
@@ -1,23 +1,16 @@
-=========
-
## Java Collections Cookbooks and Examples
+This module contains articles about Map data structures in Java.
+
### Relevant Articles:
-- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap)
-- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap)
-- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap)
-- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap)
-- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap)
-- [Iterate over a Map in Java](http://www.baeldung.com/java-iterate-map)
-- [Java TreeMap vs HashMap](http://www.baeldung.com/java-treemap-vs-hashmap)
-- [How to Store Duplicate Keys in a Map in Java?](http://www.baeldung.com/java-map-duplicate-keys)
-- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap)
+- [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap)
+- [A Guide to LinkedHashMap in Java](https://www.baeldung.com/java-linked-hashmap)
+- [A Guide to TreeMap in Java](https://www.baeldung.com/java-treemap)
+- [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys)
- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value)
-- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort)
-- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max)
-- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps)
- [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists)
- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps)
- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps)
-- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion)
- [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map)
+- More articles: [[next -->]](/../java-collections-maps-2)
diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml
index 83cc97a21e..b755582580 100644
--- a/java-collections-maps/pom.xml
+++ b/java-collections-maps/pom.xml
@@ -36,11 +36,6 @@
${assertj.version}test
-
- one.util
- streamex
- ${streamex.version}
-
@@ -49,6 +44,5 @@
1.7.03.6.17.1.0
- 0.6.5
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
similarity index 96%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java
rename to java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
index 688c7592f3..91b7197a92 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java
+++ b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
@@ -1,12 +1,12 @@
/**
*
*/
-package com.baeldung.java.map;
+package com.baeldung.map;
import java.util.HashSet;
import java.util.Map;
-import java.util.Set;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.stream.Stream;
/**
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java
rename to java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
index ae3c3edc39..9993d7862c 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java
+++ b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
similarity index 94%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
rename to java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
index 1e237580ec..b687e57d85 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
+++ b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
import java.util.LinkedHashMap;
import java.util.Map;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
similarity index 92%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
index b239ae07d8..d308aac7eb 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
@@ -1,16 +1,13 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import com.google.common.collect.ImmutableMap;
+import org.junit.jupiter.api.Test;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import org.junit.jupiter.api.Test;
-
-import com.google.common.collect.ImmutableMap;
+import static org.junit.jupiter.api.Assertions.*;
public class ImmutableMapUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
similarity index 78%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
index 2c97a97690..dbad2e5b5e 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
@@ -1,13 +1,11 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.Test;
import java.util.Collections;
import java.util.Map;
-import org.junit.Test;
+import static org.junit.Assert.*;
public class KeyCheckUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
similarity index 96%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
index 3a0affa6f3..721b48ea7b 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
@@ -1,13 +1,9 @@
-package com.baeldung.java.map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+package com.baeldung.map;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.TreeMultimap;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.MultiMapUtils;
import org.apache.commons.collections4.MultiValuedMap;
@@ -18,10 +14,9 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.TreeMultimap;
+import java.util.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
public class MapMultipleValuesUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(MapMultipleValuesUnitTest.class);
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
similarity index 99%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
index 7582eb87fb..eaf68ccba5 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
import org.junit.Test;
import org.slf4j.Logger;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
similarity index 99%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
index e31385e972..f8e4c8fd8a 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
@@ -1,9 +1,12 @@
/**
*
*/
-package com.baeldung.java.map;
+package com.baeldung.map;
-import static org.junit.Assert.assertEquals;
+import com.google.common.collect.HashBiMap;
+import org.apache.commons.collections4.BidiMap;
+import org.apache.commons.collections4.bidimap.DualHashBidiMap;
+import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
@@ -11,11 +14,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.stream.Collectors;
-import org.apache.commons.collections4.BidiMap;
-import org.apache.commons.collections4.bidimap.DualHashBidiMap;
-import org.junit.Test;
-
-import com.google.common.collect.HashBiMap;
+import static org.junit.Assert.assertEquals;
/**
* @author swpraman
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
similarity index 99%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
index b3aaf8925f..686c1cef87 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
@@ -1,15 +1,4 @@
-package com.baeldung.java.map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
+package com.baeldung.map;
import org.apache.commons.collections4.MultiMapUtils;
import org.apache.commons.collections4.MultiSet;
@@ -18,6 +7,17 @@ import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
import org.junit.Test;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
public class MultiValuedMapUnitTest {
@Test
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
similarity index 97%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
index e8aa12d4bd..0edd0cd87b 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
@@ -1,24 +1,21 @@
-package com.baeldung.java.map.compare;
+package com.baeldung.map.compare;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsMapContaining.hasEntry;
-import static org.hamcrest.collection.IsMapContaining.hasKey;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import com.google.common.base.Equivalence;
+import com.google.common.collect.MapDifference;
+import com.google.common.collect.MapDifference.ValueDifference;
+import com.google.common.collect.Maps;
+import org.junit.Before;
+import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.base.Equivalence;
-import com.google.common.collect.MapDifference;
-import com.google.common.collect.MapDifference.ValueDifference;
-import com.google.common.collect.Maps;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsMapContaining.hasEntry;
+import static org.hamcrest.collection.IsMapContaining.hasKey;
+import static org.junit.Assert.*;
public class HashMapComparisonUnitTest {
diff --git a/java-dates-2/pom.xml b/java-dates-2/pom.xml
index c1419514ef..08b2076d03 100644
--- a/java-dates-2/pom.xml
+++ b/java-dates-2/pom.xml
@@ -20,7 +20,13 @@
joda-time${joda-time.version}
-
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
commons-validator
@@ -63,6 +69,7 @@
3.6.12.10
+ 3.91.61.91.9
diff --git a/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java b/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
new file mode 100644
index 0000000000..4d732df795
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
@@ -0,0 +1,35 @@
+package com.baeldung.date.comparison;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import static java.time.temporal.ChronoUnit.*;
+
+public class DateTimeComparisonUtils {
+
+ public static boolean isSameDay(LocalDateTime timestamp, LocalDate localDateToCompare) {
+ return timestamp.toLocalDate().isEqual(localDateToCompare);
+ }
+
+ public static boolean isSameDay(LocalDateTime timestamp, LocalDateTime timestampToCompare) {
+ return timestamp.truncatedTo(DAYS).isEqual(timestampToCompare.truncatedTo(DAYS));
+ }
+
+ public static boolean isSameHour(LocalDateTime timestamp, LocalDateTime timestampToCompare) {
+ return timestamp.truncatedTo(HOURS).isEqual(timestampToCompare.truncatedTo(HOURS));
+ }
+
+ public static boolean isSameMinute(LocalDateTime timestamp, LocalDateTime timestampToCompare) {
+ return timestamp.truncatedTo(MINUTES).isEqual(timestampToCompare.truncatedTo(MINUTES));
+ }
+
+ public static boolean isSameHour(ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) {
+ return zonedTimestamp.truncatedTo(HOURS).isEqual(zonedTimestampToCompare.truncatedTo(HOURS));
+ }
+
+ public static boolean isSameHour(ZonedDateTime zonedDateTime, LocalDateTime localDateTime, ZoneId zoneId) {
+ return isSameHour(zonedDateTime, localDateTime.atZone(zoneId));
+ }
+}
diff --git a/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java b/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
new file mode 100644
index 0000000000..9519bc316a
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
@@ -0,0 +1,17 @@
+package com.baeldung.date.comparison;
+
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class LegacyDateComparisonUtils {
+
+ public static boolean isSameDay(Date date, Date dateToCompare) {
+ return DateUtils.isSameDay(date, dateToCompare);
+ }
+
+ public static boolean isSameHour(Date date, Date dateToCompare) {
+ return DateUtils.truncatedEquals(date, dateToCompare, Calendar.HOUR);
+ }
+}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
new file mode 100644
index 0000000000..0db0d1e8d7
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.date.comparison;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+class DateTimeComparisonUtilsUnitTest {
+
+ @Test
+ void givenLocalDateTimes_whenIsSameDay_thenCompareTrue() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 11, 00, 0);
+ LocalDateTime secondTimestamp = firstTimestamp.plusHours(5);
+ LocalDateTime thirdTimestamp = firstTimestamp.plusDays(1);
+
+ assertThat(DateTimeComparisonUtils.isSameDay(firstTimestamp, secondTimestamp), is(true));
+
+ assertThat(DateTimeComparisonUtils.isSameDay(secondTimestamp, thirdTimestamp), is(false));
+ }
+
+ @Test
+ void givenLocalDateAndLocalDateTime_whenIsSameDay_thenCompareTrue() {
+ LocalDate localDate = LocalDate.of(2019, 8, 10);
+ LocalDateTime localDateTime = LocalDateTime.of(2019, 8, 10, 11, 30, 0);
+
+ assertThat(DateTimeComparisonUtils.isSameDay(localDateTime, localDate), is(true));
+ }
+
+ @Test
+ void givenLocalDateTimes_whenIsSameHour_thenCompareTrue() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 8, 00, 0);
+ LocalDateTime secondTimestamp = firstTimestamp.plusMinutes(15);
+ LocalDateTime thirdTimestamp = firstTimestamp.plusHours(2);
+
+ assertThat(DateTimeComparisonUtils.isSameHour(firstTimestamp, secondTimestamp), is(true));
+
+ assertThat(DateTimeComparisonUtils.isSameHour(secondTimestamp, thirdTimestamp), is(false));
+ }
+
+ @Test
+ void givenLocalDateTimes_whenIsSameMinute_thenCompareTrue() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 8, 15, 0);
+ LocalDateTime secondTimestamp = firstTimestamp.plusSeconds(30);
+ LocalDateTime thirdTimestamp = firstTimestamp.plusMinutes(5);
+
+ assertThat(DateTimeComparisonUtils.isSameMinute(firstTimestamp, secondTimestamp), is(true));
+
+ assertThat(DateTimeComparisonUtils.isSameMinute(secondTimestamp, thirdTimestamp), is(false));
+ }
+
+ @Test
+ void givenZonedDateTimes_whenIsSameHour_thenCompareTrue() {
+ ZonedDateTime zonedTimestamp = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 30,
+ ZoneId.of("America/New_York"));
+ ZonedDateTime zonedTimestampToCompare = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0,
+ ZoneId.of("Europe/Berlin"));
+
+ assertThat(DateTimeComparisonUtils.isSameHour(zonedTimestamp, zonedTimestampToCompare), is(true));
+ }
+
+ @Test
+ void givenZonedDateTimeAndLocalDateTime_whenIsSameHour_thenCompareTrue() {
+ ZonedDateTime zonedTimestamp = ZonedDateTime.of(2019, 8, 10, 8, 15, 0, 0,
+ ZoneId.of("America/New_York"));
+ LocalDateTime localTimestamp = LocalDateTime.of(2019, 8, 10, 14, 20, 0);
+ ZoneId zoneId = ZoneId.of("Europe/Berlin");
+
+ assertThat(DateTimeComparisonUtils.isSameHour(zonedTimestamp, localTimestamp, zoneId), is(true));
+ }
+}
\ No newline at end of file
diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
new file mode 100644
index 0000000000..ff51476e7c
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.date.comparison;
+
+import org.junit.Test;
+
+import java.time.*;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+public class Java8DateTimeApiGeneralComparisonsUnitTest {
+
+ @Test
+ public void givenLocalDates_whenComparing_thenAssertsPass() {
+ LocalDate firstDate = LocalDate.of(2019, 8, 10);
+ LocalDate secondDate = LocalDate.of(2019, 7, 1);
+ LocalDate thirdDate = LocalDate.of(2019, 7, 1); // same date as secondDate
+
+ assertThat(firstDate.isAfter(secondDate), is(true));
+ assertThat(firstDate.isBefore(secondDate), is(false));
+
+ assertThat(firstDate.isEqual(secondDate), is(false));
+ assertThat(firstDate.equals(secondDate), is(false));
+
+ assertThat(firstDate.compareTo(secondDate), is(1));
+ assertThat(secondDate.compareTo(firstDate), is(-1));
+
+ assertThat(secondDate.isAfter(thirdDate), is(false));
+ assertThat(secondDate.isBefore(thirdDate), is(false));
+ assertThat(secondDate.isEqual(thirdDate), is(true));
+ assertThat(secondDate.equals(thirdDate), is(true));
+ assertThat(secondDate.compareTo(thirdDate), is(0));
+ }
+
+ @Test
+ public void givenLocalDateTimes_whenComparing_thenAssertsPass() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 11, 30, 0);
+ LocalDateTime secondTimestamp = LocalDateTime.of(2019, 8, 10, 11, 15, 0);
+ LocalDateTime thirdTimestamp = LocalDateTime.of(2019, 8, 10, 11, 15, 0); // same as secondTimestamp
+
+ assertThat(firstTimestamp.isAfter(secondTimestamp), is(true));
+ assertThat(firstTimestamp.isBefore(secondTimestamp), is(false));
+
+ assertThat(firstTimestamp.isEqual(secondTimestamp), is(false));
+ assertThat(firstTimestamp.equals(secondTimestamp), is(false));
+
+ assertThat(firstTimestamp.compareTo(secondTimestamp), is(1));
+ assertThat(secondTimestamp.compareTo(firstTimestamp), is(-1));
+
+ assertThat(secondTimestamp.isAfter(thirdTimestamp), is(false));
+ assertThat(secondTimestamp.isBefore(thirdTimestamp), is(false));
+ assertThat(secondTimestamp.isEqual(thirdTimestamp), is(true));
+ assertThat(secondTimestamp.compareTo(thirdTimestamp), is(0));
+ }
+
+ @Test
+ public void givenZonedDateTimes_whenComparing_thenAssertsPass() {
+ ZonedDateTime timeInNewYork = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 0,
+ ZoneId.of("America/New_York"));
+ ZonedDateTime timeInBerlin = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0,
+ ZoneId.of("Europe/Berlin"));
+
+ assertThat(timeInNewYork.isAfter(timeInBerlin), is(false));
+ assertThat(timeInNewYork.isBefore(timeInBerlin), is(false));
+
+ assertThat(timeInNewYork.isEqual(timeInBerlin), is(true));
+ assertThat(timeInNewYork.equals(timeInBerlin), is(false));
+
+ assertThat(timeInNewYork.compareTo(timeInBerlin), is(-1));
+ }
+
+ @Test
+ public void givenLocalTimes_whenComparing_thenAssertsPass() {
+ LocalTime firstTime = LocalTime.of(8, 30);
+ LocalTime secondTime = LocalTime.of(9, 45);
+
+ assertThat(firstTime.isAfter(secondTime), is(false));
+ assertThat(firstTime.isBefore(secondTime), is(true));
+
+ assertThat(firstTime.equals(secondTime), is(false));
+
+ assertThat(firstTime.compareTo(secondTime), is(-1));
+ }
+}
\ No newline at end of file
diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
new file mode 100644
index 0000000000..a501cb8888
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.date.comparison;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+class LegacyDateComparisonUtilsUnitTest {
+
+ private Date toDate(LocalDateTime localDateTime) {
+ return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+ @Test
+ void givenDatesWithDifferentHours_whenIsSameDay_thenReturnsTrue() {
+ Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 00, 00));
+ Date secondDate = toDate(LocalDateTime.of(2019, 8, 10, 12, 00, 00));
+ Date thirdDate = toDate(LocalDateTime.of(2019, 8, 15, 12, 00, 00));
+
+ assertThat(LegacyDateComparisonUtils.isSameDay(firstDate, secondDate), is(true));
+ assertThat(LegacyDateComparisonUtils.isSameDay(secondDate, thirdDate), is(false));
+ }
+
+ @Test
+ void givenDatesWithingSameHour_whenIsSameHour_thenReturnsTrue() {
+ Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 00, 00));
+ Date secondDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 15, 00));
+ Date thirdDate = toDate(LocalDateTime.of(2019, 8, 10, 12, 00, 00));
+
+ assertThat(LegacyDateComparisonUtils.isSameHour(firstDate, secondDate), is(true));
+ assertThat(LegacyDateComparisonUtils.isSameHour(secondDate, thirdDate), is(false));
+ }
+
+ @Test
+ void givenDates__whenComparing_thenAssertsPass() {
+ Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 0, 00, 00));
+ Date secondDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00));
+ Date thirdDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00)); // same date as secondDate
+
+ assertThat(firstDate.after(secondDate), is(false));
+ assertThat(firstDate.before(secondDate), is(true));
+ assertThat(firstDate.compareTo(secondDate), is(-1));
+ assertThat(firstDate.equals(secondDate), is(false));
+
+ assertThat(thirdDate.after(secondDate), is(false));
+ assertThat(thirdDate.before(secondDate), is(false));
+ assertThat(thirdDate.compareTo(secondDate), is(0));
+ assertThat(thirdDate.equals(secondDate), is(true));
+ }
+}
\ No newline at end of file
diff --git a/java-dates/README.md b/java-dates/README.md
index 7da309924d..3a215f9094 100644
--- a/java-dates/README.md
+++ b/java-dates/README.md
@@ -3,25 +3,25 @@
## Java Dates Cookbooks and Examples
### Relevant Articles:
-- [TemporalAdjuster in Java](http://www.baeldung.com/java-temporal-adjuster)
-- [Handling Daylight Savings Time in Java](http://www.baeldung.com/java-daylight-savings)
-- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
-- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference)
-- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions)
-- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api)
-- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro)
-- [Get the Current Date, Time and Timestamp in Java 8](http://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
-- [Get Date Without Time in Java](http://www.baeldung.com/java-date-without-time)
-- [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates)
-- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime)
-- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones)
-- [Extracting Year, Month and Day from Date in Java](http://www.baeldung.com/java-year-month-day)
-- [Guide to java.util.GregorianCalendar](http://www.baeldung.com/java-gregorian-calendar)
-- [Measure Elapsed Time in Java](http://www.baeldung.com/java-measure-elapsed-time)
-- [How to Get the Start and the End of a Day using Java](http://www.baeldung.com/java-day-start-end)
-- [Calculate Age in Java](http://www.baeldung.com/java-get-age)
-- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
-- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
+- [TemporalAdjuster in Java](https://www.baeldung.com/java-temporal-adjuster)
+- [Handling Daylight Savings Time in Java](https://www.baeldung.com/java-daylight-savings)
+- [Period and Duration in Java](https://www.baeldung.com/java-period-duration)
+- [Difference Between Two Dates in Java](https://www.baeldung.com/java-date-difference)
+- [RegEx for matching Date Pattern in Java](https://www.baeldung.com/java-date-regular-expressions)
+- [Migrating to the New Java 8 Date Time API](https://www.baeldung.com/migrating-to-java-8-date-time-api)
+- [Introduction to the Java 8 Date/Time API](https://www.baeldung.com/java-8-date-time-intro)
+- [Get the Current Date, Time and Timestamp in Java 8](https://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
+- [Get Date Without Time in Java](https://www.baeldung.com/java-date-without-time)
+- [How to Get All Dates Between Two Dates?](https://www.baeldung.com/java-between-dates)
+- [Convert Date to LocalDate or LocalDateTime and Back](https://www.baeldung.com/java-date-to-localdate-and-localdatetime)
+- [Display All Time Zones With GMT And UTC in Java](https://www.baeldung.com/java-time-zones)
+- [Extracting Year, Month and Day from Date in Java](https://www.baeldung.com/java-year-month-day)
+- [Guide to java.util.GregorianCalendar](https://www.baeldung.com/java-gregorian-calendar)
+- [Measure Elapsed Time in Java](https://www.baeldung.com/java-measure-elapsed-time)
+- [How to Get the Start and the End of a Day using Java](https://www.baeldung.com/java-day-start-end)
+- [Calculate Age in Java](https://www.baeldung.com/java-get-age)
+- [Increment Date in Java](https://www.baeldung.com/java-increment-date)
+- [Add Hours To a Date In Java](https://www.baeldung.com/java-add-hours-date)
- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp)
@@ -29,4 +29,4 @@
- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
- [Differences Between ZonedDateTime and OffsetDateTime](https://www.baeldung.com/java-zoneddatetime-offsetdatetime)
-- [Introduction to Joda-Time](http://www.baeldung.com/joda-time)
+- [Introduction to Joda-Time](https://www.baeldung.com/joda-time)
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
similarity index 96%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java
rename to java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
index c794c57e87..80bccb399a 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java
+++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.Instant;
import java.time.LocalDate;
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
similarity index 96%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java
rename to java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
index 17ca5b1122..1d1e3b7d92 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java
+++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.Instant;
import java.time.LocalDateTime;
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
similarity index 94%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java
rename to java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
index f219dcf038..9a6bb248fa 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java
+++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.LocalDateTime;
import java.time.ZoneId;
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
similarity index 94%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java
rename to java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
index f9893da5d0..f679ffb77a 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java
+++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.LocalDate;
import java.time.ZoneId;
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java
rename to java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
index f7f07500f1..b5a54e28eb 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -12,7 +12,7 @@ import java.util.Date;
import org.junit.Test;
-import com.baeldung.java9.datetime.DateToLocalDateConverter;
+import com.baeldung.datetolocaldate.DateToLocalDateConverter;
/**
* JUnits for {@link DateToLocalDateConverter} class.
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
similarity index 97%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java
rename to java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
index 9ad29ea673..e6098cec1c 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -12,7 +12,7 @@ import java.util.Date;
import org.junit.Test;
-import com.baeldung.java9.datetime.DateToLocalDateTimeConverter;
+import com.baeldung.datetolocaldate.DateToLocalDateTimeConverter;
/**
* JUnits for {@link DateToLocalDateTimeConverter} class.
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
similarity index 94%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java
rename to java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
index e5a541c546..c8e596c220 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -11,6 +11,8 @@ import java.util.Date;
import org.junit.Test;
+import com.baeldung.datetolocaldate.LocalDateTimeToDateConverter;
+
/**
*
* JUnits for {@link LocalDateTimeToDateConverter} class.
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
similarity index 93%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java
rename to java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
index 4e4dd20f2f..4ff3682158 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -11,6 +11,8 @@ import java.util.Date;
import org.junit.Test;
+import com.baeldung.datetolocaldate.LocalDateToDateConverter;
+
/**
*
* JUnits for {@link LocalDateToDateConverter} class.
diff --git a/java-ee-8-security-api/README.md b/java-ee-8-security-api/README.md
index 1735419236..b01a073e35 100644
--- a/java-ee-8-security-api/README.md
+++ b/java-ee-8-security-api/README.md
@@ -1,3 +1,7 @@
+## Java EE 8 Security API
+
+This module contains articles about the Security API in Java EE 8.
+
### Relevant articles
- - [Java EE 8 Security API](http://www.baeldung.com/java-ee-8-security)
+ - [Java EE 8 Security API](https://www.baeldung.com/java-ee-8-security)
diff --git a/java-jdi/README.md b/java-jdi/README.md
new file mode 100644
index 0000000000..c8c2d3e9ab
--- /dev/null
+++ b/java-jdi/README.md
@@ -0,0 +1,7 @@
+## Java JDI
+
+This module contains articles about JDI, the Java Debug Interface.
+
+###Relevant articles
+
+- [An Intro to the Java Debug Interface (JDI)](https://www.baeldung.com/java-debug-interface)
diff --git a/java-lite/README.md b/java-lite/README.md
index a4e2edd49f..96fb6f1a93 100644
--- a/java-lite/README.md
+++ b/java-lite/README.md
@@ -1,4 +1,8 @@
+## JavaLite
+
+This module contains articles about JavaLite.
+
### Relevant Articles:
-- [A Guide to JavaLite – Building a RESTful CRUD application](http://www.baeldung.com/javalite-rest)
-- [Introduction to ActiveWeb](http://www.baeldung.com/activeweb)
+- [A Guide to JavaLite – Building a RESTful CRUD application](https://www.baeldung.com/javalite-rest)
+- [Introduction to ActiveWeb](https://www.baeldung.com/activeweb)
diff --git a/java-math/README.md b/java-math/README.md
index 244417d1a5..49ff5afde1 100644
--- a/java-math/README.md
+++ b/java-math/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Java Math
+
+This module contains articles about math in Java.
+
+### Relevant articles:
- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial)
- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm)
@@ -9,3 +13,4 @@
- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage)
- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging)
+- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication)
diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md
index 52ffc822b9..48f9acd32d 100644
--- a/java-numbers-2/README.md
+++ b/java-numbers-2/README.md
@@ -1,2 +1,16 @@
-## Relevant Articles
+## Java Number Cookbooks and Examples
+
+This module contains articles about numbers in Java.
+
+### Relevant Articles
- [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion)
+- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math)
+- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area)
+- [NaN in Java](https://www.baeldung.com/java-not-a-number)
+- [Generating Prime Numbers in Java](https://www.baeldung.com/java-generate-prime-numbers)
+- [Using Math.pow in Java](https://www.baeldung.com/java-math-pow)
+- [Check If a Number Is Prime in Java](https://www.baeldung.com/java-prime-numbers)
+- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
+- [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple)
+- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
+- More articles: [[<-- prev]](/../java-numbers)
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/area/circle/Circle.java b/java-numbers-2/src/main/java/com/baeldung/area/circle/Circle.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/area/circle/Circle.java
rename to java-numbers-2/src/main/java/com/baeldung/area/circle/Circle.java
diff --git a/java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java b/java-numbers-2/src/main/java/com/baeldung/area/circle/CircleArea.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java
rename to java-numbers-2/src/main/java/com/baeldung/area/circle/CircleArea.java
diff --git a/java-numbers/src/main/java/com/baeldung/nan/NaNExample.java b/java-numbers-2/src/main/java/com/baeldung/nan/NaNExample.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/nan/NaNExample.java
rename to java-numbers-2/src/main/java/com/baeldung/nan/NaNExample.java
diff --git a/java-numbers/src/main/java/com/baeldung/pow/PowerExample.java b/java-numbers-2/src/main/java/com/baeldung/pow/PowerExample.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/pow/PowerExample.java
rename to java-numbers-2/src/main/java/com/baeldung/pow/PowerExample.java
diff --git a/java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java b/java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java
similarity index 96%
rename from java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java
rename to java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java
index 750807ce77..7511141a84 100644
--- a/java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java
+++ b/java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java
@@ -1,59 +1,59 @@
-package com.baeldung.prime;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-public class PrimeGenerator {
- public static List sieveOfEratosthenes(int n) {
- final boolean prime[] = new boolean[n + 1];
- Arrays.fill(prime, true);
-
- for (int p = 2; p * p <= n; p++) {
- if (prime[p]) {
- for (int i = p * 2; i <= n; i += p)
- prime[i] = false;
- }
- }
-
- final List primes = new LinkedList<>();
- for (int i = 2; i <= n; i++) {
- if (prime[i])
- primes.add(i);
- }
- return primes;
- }
-
- public static List primeNumbersBruteForce(int max) {
- final List primeNumbers = new LinkedList();
- for (int i = 2; i <= max; i++) {
- if (isPrimeBruteForce(i)) {
- primeNumbers.add(i);
- }
- }
- return primeNumbers;
- }
-
- private static boolean isPrimeBruteForce(int x) {
- for (int i = 2; i < x; i++) {
- if (x % i == 0) {
- return false;
- }
- }
- return true;
- }
-
- public static List primeNumbersTill(int max) {
- return IntStream.rangeClosed(2, max)
- .filter(x -> isPrime(x))
- .boxed()
- .collect(Collectors.toList());
- }
-
- private static boolean isPrime(int x) {
- return IntStream.rangeClosed(2, (int) (Math.sqrt(x)))
- .allMatch(n -> x % n != 0);
- }
-}
+package com.baeldung.prime;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class PrimeGenerator {
+ public static List sieveOfEratosthenes(int n) {
+ final boolean prime[] = new boolean[n + 1];
+ Arrays.fill(prime, true);
+
+ for (int p = 2; p * p <= n; p++) {
+ if (prime[p]) {
+ for (int i = p * 2; i <= n; i += p)
+ prime[i] = false;
+ }
+ }
+
+ final List primes = new LinkedList<>();
+ for (int i = 2; i <= n; i++) {
+ if (prime[i])
+ primes.add(i);
+ }
+ return primes;
+ }
+
+ public static List primeNumbersBruteForce(int max) {
+ final List primeNumbers = new LinkedList();
+ for (int i = 2; i <= max; i++) {
+ if (isPrimeBruteForce(i)) {
+ primeNumbers.add(i);
+ }
+ }
+ return primeNumbers;
+ }
+
+ private static boolean isPrimeBruteForce(int x) {
+ for (int i = 2; i < x; i++) {
+ if (x % i == 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static List primeNumbersTill(int max) {
+ return IntStream.rangeClosed(2, max)
+ .filter(x -> isPrime(x))
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ private static boolean isPrime(int x) {
+ return IntStream.rangeClosed(2, (int) (Math.sqrt(x)))
+ .allMatch(n -> x % n != 0);
+ }
+}
diff --git a/java-numbers/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java
similarity index 100%
rename from java-numbers/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java
rename to java-numbers-2/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java
diff --git a/java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/java/math/MathUnitTest.java
similarity index 100%
rename from java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java
rename to java-numbers-2/src/test/java/com/baeldung/java/math/MathUnitTest.java
diff --git a/java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
similarity index 97%
rename from java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
rename to java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
index 210bde076b..2509bd73d4 100644
--- a/java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
+++ b/java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
@@ -1,28 +1,29 @@
-package com.baeldung.prime;
-
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Test;
-
-import static com.baeldung.prime.PrimeGenerator.*;
-import static org.junit.Assert.*;
-
-public class PrimeGeneratorUnitTest {
- @Test
- public void whenBruteForced_returnsSuccessfully() {
- final List primeNumbers = primeNumbersBruteForce(20);
- assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
- }
-
- @Test
- public void whenOptimized_returnsSuccessfully() {
- final List primeNumbers = primeNumbersTill(20);
- assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
- }
-
- @Test
- public void whenSieveOfEratosthenes_returnsSuccessfully() {
- final List primeNumbers = sieveOfEratosthenes(20);
- assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
- }
-}
+package com.baeldung.prime;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.baeldung.prime.PrimeGenerator.*;
+import static org.junit.Assert.*;
+
+public class PrimeGeneratorUnitTest {
+ @Test
+ public void whenBruteForced_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersBruteForce(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenOptimized_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersTill(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenSieveOfEratosthenes_returnsSuccessfully() {
+ final List primeNumbers = sieveOfEratosthenes(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+}
diff --git a/java-numbers/README.md b/java-numbers/README.md
index 2b1131f325..eee6fceab1 100644
--- a/java-numbers/README.md
+++ b/java-numbers/README.md
@@ -1,14 +1,10 @@
-=========
-
## Java Number Cookbooks and Examples
+This module contains articles about numbers in Java.
+
### Relevant Articles:
- [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int)
-- [NaN in Java](http://www.baeldung.com/java-not-a-number)
- [How to Round a Number to N Decimal Places in Java](http://www.baeldung.com/java-round-decimal-number)
-- [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers)
-- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow)
-- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers)
- [BigDecimal and BigInteger in Java](http://www.baeldung.com/java-bigdecimal-biginteger)
- [Find All Pairs of Numbers in an Array That Add Up to a Given Sum](http://www.baeldung.com/java-algorithm-number-pairs-sum)
- [Java – Random Long, Float, Integer and Double](http://www.baeldung.com/java-generate-random-long-float-integer-double)
@@ -17,5 +13,4 @@
- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root)
- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string)
- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order)
-- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area)
-- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math)
\ No newline at end of file
+- More articles: [[next -->]](/../java-numbers-2)
diff --git a/java-rmi/README.md b/java-rmi/README.md
index 4d12060395..244f986639 100644
--- a/java-rmi/README.md
+++ b/java-rmi/README.md
@@ -1,3 +1,7 @@
+## Java RMI
+
+This module contains articles about RMI (Remote Method Invocation) in Java.
+
### Relevant articles
-- [Getting Started with Java RMI](http://www.baeldung.com/java-rmi)
+- [Getting Started with Java RMI](https://www.baeldung.com/java-rmi)
diff --git a/java-spi/README.md b/java-spi/README.md
index d2658c42fe..2ccef98a10 100644
--- a/java-spi/README.md
+++ b/java-spi/README.md
@@ -1,4 +1,7 @@
+## Java SPI
+
+This module contains articles about the SPI (Service Provider Interface) in Java.
### Relevant Articles:
-- [Java Service Provider Interface](http://www.baeldung.com/java-spi)
+- [Java Service Provider Interface](https://www.baeldung.com/java-spi)
diff --git a/java-streams-2/README.md b/java-streams-2/README.md
index 851d3d71e2..66fbe69ed4 100644
--- a/java-streams-2/README.md
+++ b/java-streams-2/README.md
@@ -1,4 +1,9 @@
+## Java Streams Cookbooks and Examples
+
+This module contains articles about the Stream API in Java.
+
### Relevant Articles:
- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce)
- [How to Break from Java Stream forEach](https://www.baeldung.com/java-break-stream-foreach)
- [Java IntStream Conversions](https://www.baeldung.com/java-intstream-convert)
+- More articles: [[<-- prev]](/java-streams)
diff --git a/java-streams/README.md b/java-streams/README.md
index 0c9588c47e..5c231f756f 100644
--- a/java-streams/README.md
+++ b/java-streams/README.md
@@ -1,20 +1,21 @@
-=========
-
## Java Streams Cookbooks and Examples
+This module contains articles about the Stream API in Java.
+
### Relevant Articles:
-- [The Java 8 Stream API Tutorial](http://www.baeldung.com/java-8-streams)
-- [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction)
-- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams)
-- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany)
-- [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element)
-- [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception)
-- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream)
-- [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices)
-- [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams)
+- [The Java 8 Stream API Tutorial](https://www.baeldung.com/java-8-streams)
+- [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction)
+- [Java 8 and Infinite Streams](https://www.baeldung.com/java-inifinite-streams)
+- [Java 8 Stream findFirst() vs. findAny()](https://www.baeldung.com/java-stream-findfirst-vs-findany)
+- [How to Get the Last Element of a Stream in Java?](https://www.baeldung.com/java-stream-last-element)
+- [“Stream has already been operated upon or closed” Exception in Java](https://www.baeldung.com/java-stream-operated-upon-or-closed-exception)
+- [Iterable to Stream in Java](https://www.baeldung.com/java-iterable-to-stream)
+- [How to Iterate Over a Stream With Indices](https://www.baeldung.com/java-stream-indices)
+- [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams)
- [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering)
- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda)
- [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count)
- [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api)
- [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams)
+- More articles: [[next -->]](/../java-streams-2)
diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java
similarity index 97%
rename from java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java
index 8c2e0628fa..5f52fe375e 100644
--- a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
+++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.java8.streams;
import org.junit.Test;
diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java
similarity index 99%
rename from java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java
index 5005cf7f47..75cfbc049f 100644
--- a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
+++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.java8.streams;
import com.baeldung.stream.Product;
import org.junit.Before;
diff --git a/java-strings-2/README.md b/java-strings-2/README.md
index ad0a46fd96..82f33997c5 100644
--- a/java-strings-2/README.md
+++ b/java-strings-2/README.md
@@ -1,10 +1,14 @@
-## Relevant Articles:
+## Java Strings Cookbooks and Examples
+
+This module contains articles about strings in Java.
+
+### Relevant Articles:
- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting)
- [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring)
- [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords)
-- [Java – Generate Random String](http://www.baeldung.com/java-random-string)
-- [Image to Base64 String Conversion](http://www.baeldung.com/java-base64-image-string)
+- [Java – Generate Random String](https://www.baeldung.com/java-random-string)
+- [Image to Base64 String Conversion](https://www.baeldung.com/java-base64-image-string)
- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
- [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char)
@@ -12,7 +16,7 @@
- [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string)
- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)
- [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list)
-- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter)
+- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter)
- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters)
- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation)
- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
@@ -24,3 +28,5 @@
- [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring)
- [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string)
- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
+- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer)
+- More articles: [[<-- prev>]](/java-strings) [[next -->]](/java-strings-3)
diff --git a/java-strings-3/README.md b/java-strings-3/README.md
index 6c2339028f..f0aaddefcb 100644
--- a/java-strings-3/README.md
+++ b/java-strings-3/README.md
@@ -1,3 +1,8 @@
-## Relevant Articles:
+## Java Strings Cookbooks and Examples
+
+This module contains articles about strings in Java.
+
+### Relevant Articles:
- [Converting Java String to Double](https://www.baeldung.com/java-string-to-double)
+- More articles: [[<-- prev>]](/java-strings-2)
diff --git a/java-strings-3/pom.xml b/java-strings-3/pom.xml
index 1e5f757943..4589780c15 100644
--- a/java-strings-3/pom.xml
+++ b/java-strings-3/pom.xml
@@ -68,6 +68,12 @@
${assertj.version}test
+
+ org.bitbucket.cowwoc
+ diff-match-patch
+ 1.2
+ test
+
diff --git a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java
new file mode 100644
index 0000000000..1030185c3e
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.string.charArrayToString;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import com.google.common.base.Joiner;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class CharArrayToStringConversionUnitTest {
+
+ @Test
+ public void whenStringConstructor_thenOK() {
+ final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = new String(charArray);
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenStringCopyValueOf_thenOK() {
+ final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = String.copyValueOf(charArray);
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenStringValueOf_thenOK() {
+ final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = String.valueOf(charArray);
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenStringBuilder_thenOK() {
+ final char[][] arrayOfCharArray = { { 'b', 'a' }, { 'e', 'l', 'd', 'u' }, { 'n', 'g' } };
+
+ StringBuilder sb = new StringBuilder();
+ for (char[] subArray : arrayOfCharArray) {
+ sb.append(subArray);
+ }
+
+ assertThat(sb.toString(), is("baeldung"));
+ }
+
+ @Test
+ public void whenStreamCollectors_thenOK() {
+ final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ Stream charStream = Arrays.stream(charArray);
+ String string = charStream.map(String::valueOf).collect(Collectors.joining());
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenGoogleCommonBaseJoiners_thenOK() {
+ final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = Joiner.on("|").join(charArray);
+
+ assertThat(string, is("b|a|e|l|d|u|n|g"));
+ }
+}
diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java
new file mode 100644
index 0000000000..20e87a1f4e
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.stringdiff;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@State(Scope.Benchmark)
+public class StringDiffBenchmarkUnitTest {
+
+ private DiffMatchPatch diffMatchPatch = new DiffMatchPatch();
+
+ private List inputs = randomizeInputs(10000);
+
+ public static void main(String[] args) throws RunnerException {
+ Options opts = new OptionsBuilder().include(".*")
+ .warmupIterations(1)
+ .measurementIterations(50)
+ .jvmArgs("-Xms2g", "-Xmx2g")
+ .shouldDoGC(true)
+ .forks(1)
+ .build();
+
+ new Runner(opts).run();
+ }
+
+ @Benchmark
+ public int diffMatchPatch() {
+ for (int i = 0; i < inputs.size() - 1; i++) {
+ diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false);
+ }
+ return inputs.size();
+ }
+
+ @Benchmark
+ public int stringUtils() {
+ for (int i = 0; i < inputs.size() - 1; i++) {
+ StringUtils.difference(inputs.get(i), inputs.get(i + 1));
+ }
+ return inputs.size();
+ }
+
+ /**
+ * Creates a list of a given size, containing 30 character long strings,
+ * each starting with a static prefix of 10 characters and followed by
+ * a random 20 character suffix
+ *
+ * @return a {@link List} of randomised strings
+ */
+ private List randomizeInputs(int size) {
+ String staticPart = "ABCDEF1234";
+ List inputs = new ArrayList<>();
+ for (int i = 0; i < size; i++) {
+ inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20));
+ }
+ return inputs;
+ }
+}
diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java
new file mode 100644
index 0000000000..94b7deb64d
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.stringdiff;
+
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.commons.lang3.StringUtils;
+import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch;
+import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Operation;
+import org.junit.Test;
+
+public class StringDiffUnitTest {
+
+ private DiffMatchPatch diffMatchPatch = new DiffMatchPatch();
+
+ // Test samples
+ private final String text1 = "ABCDELMN";
+ private final String text2 = "ABCFGLMN";
+
+ @Test
+ public void givenTwoStrings_whenDiffMatchPatch_thenReturnCorrectDiff() {
+ assertThat(diffMatchPatch.diffMain(text1, text2, false), containsInAnyOrder(
+ new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"),
+ new DiffMatchPatch.Diff(Operation.DELETE, "DE"),
+ new DiffMatchPatch.Diff(Operation.INSERT, "FG"),
+ new DiffMatchPatch.Diff(Operation.EQUAL, "LMN")));
+ assertThat(diffMatchPatch.diffMain(text2, text1, false), containsInAnyOrder(
+ new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"),
+ new DiffMatchPatch.Diff(Operation.INSERT, "DE"),
+ new DiffMatchPatch.Diff(Operation.DELETE, "FG"),
+ new DiffMatchPatch.Diff(Operation.EQUAL, "LMN")));
+ }
+
+ @Test
+ public void givenTwoStrings_whenStringUtilsDifference_thenReturnCorrectDiff() {
+ assertThat(StringUtils.difference(text1, text2), is("FGLMN"));
+ assertThat(StringUtils.difference(text2, text1), is("DELMN"));
+ }
+}
diff --git a/java-strings-ops/README.md b/java-strings-ops/README.md
index d909f171a7..31c5f48022 100644
--- a/java-strings-ops/README.md
+++ b/java-strings-ops/README.md
@@ -1,22 +1,22 @@
-=========
-
## Java Strings Cookbooks and Examples
+This module contains articles about operations on strings in Java.
+
### Relevant Articles:
-- [Convert char to String in Java](http://www.baeldung.com/java-convert-char-to-string)
-- [Convert String to int or Integer in Java](http://www.baeldung.com/java-convert-string-to-int-or-integer)
+- [Convert char to String in Java](https://www.baeldung.com/java-convert-char-to-string)
+- [Convert String to int or Integer in Java](https://www.baeldung.com/java-convert-string-to-int-or-integer)
- [Java String Conversions](https://www.baeldung.com/java-string-conversions)
-- [Check if a String is a Palindrome](http://www.baeldung.com/java-palindrome)
-- [Comparing Strings in Java](http://www.baeldung.com/java-compare-strings)
-- [Check If a String Is Numeric in Java](http://www.baeldung.com/java-check-string-number)
+- [Check if a String is a Palindrome](https://www.baeldung.com/java-palindrome)
+- [Comparing Strings in Java](https://www.baeldung.com/java-compare-strings)
+- [Check If a String Is Numeric in Java](https://www.baeldung.com/java-check-string-number)
- [Get Substring from String in Java](https://www.baeldung.com/java-substring)
-- [How to Remove the Last Character of a String?](http://www.baeldung.com/java-remove-last-character-of-string)
+- [How to Remove the Last Character of a String?](https://www.baeldung.com/java-remove-last-character-of-string)
- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string)
-- [Count Occurrences of a Char in a String](http://www.baeldung.com/java-count-chars)
-- [Guide to Java String Pool](http://www.baeldung.com/java-string-pool)
-- [Split a String in Java](http://www.baeldung.com/java-split-string)
+- [Count Occurrences of a Char in a String](https://www.baeldung.com/java-count-chars)
+- [Guide to Java String Pool](https://www.baeldung.com/java-string-pool)
+- [Split a String in Java](https://www.baeldung.com/java-split-string)
- [Common String Operations in Java](https://www.baeldung.com/java-string-operations)
- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array)
- [Java toString() Method](https://www.baeldung.com/java-tostring)
-- [CharSequence vs. String in Java](http://www.baeldung.com/java-char-sequence-string)
-- [StringBuilder and StringBuffer in Java](http://www.baeldung.com/java-string-builder-string-buffer)
\ No newline at end of file
+- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
+- [StringBuilder and StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
diff --git a/java-strings/README.md b/java-strings/README.md
index ef536b4099..1faa11f606 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -1,16 +1,16 @@
-=========
-
## Java Strings Cookbooks and Examples
+This module contains articles about strings in Java.
+
### Relevant Articles:
-- [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings)
-- [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream)
-- [Java 8 StringJoiner](http://www.baeldung.com/java-string-joiner)
-- [Converting Strings to Enums in Java](http://www.baeldung.com/java-string-to-enum)
-- [Quick Guide to the Java StringTokenizer](http://www.baeldung.com/java-stringtokenizer)
-- [Use char[] Array Over a String for Manipulating Passwords in Java?](http://www.baeldung.com/java-storing-passwords)
-- [Convert a String to Title Case](http://www.baeldung.com/java-string-title-case)
-- [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string)
+- [String Operations with Java Streams](https://www.baeldung.com/java-stream-operations-on-strings)
+- [Converting String to Stream of chars](https://www.baeldung.com/java-string-to-stream)
+- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner)
+- [Converting Strings to Enums in Java](https://www.baeldung.com/java-string-to-enum)
+- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer)
+- [Use char[] Array Over a String for Manipulating Passwords in Java?](https://www.baeldung.com/java-storing-passwords)
+- [Convert a String to Title Case](https://www.baeldung.com/java-string-title-case)
+- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string)
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
- [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string)
- [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string)
@@ -20,4 +20,5 @@
- [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences)
- [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline)
- [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part)
-- [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index)
\ No newline at end of file
+- [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index)
+- More articles: [[next -->]](/java-strings-2)
diff --git a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java
similarity index 98%
rename from java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
rename to java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java
index b522f7337b..48b71eed12 100644
--- a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
+++ b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.string.newline;
public class AddingNewLineToString {
diff --git a/java-vavr-stream/README.md b/java-vavr-stream/README.md
index 64299cde11..4e8b5ccd66 100644
--- a/java-vavr-stream/README.md
+++ b/java-vavr-stream/README.md
@@ -1,5 +1,8 @@
+## Vavr Streams
+
+This module contains articles about streams in Vavr.
### Relevant Articles:
-- [Java Streams vs Vavr Streams](http://www.baeldung.com/vavr-java-streams)
+- [Java Streams vs Vavr Streams](https://www.baeldung.com/vavr-java-streams)
diff --git a/java-websocket/README.md b/java-websocket/README.md
index f9f0784043..f48b8c6804 100644
--- a/java-websocket/README.md
+++ b/java-websocket/README.md
@@ -1,3 +1,7 @@
+## Java WebSocket
+
+This module contains articles about WebSocket in Java.
+
### Relevant articles
-- [A Guide to the Java API for WebSocket](http://www.baeldung.com/java-websockets)
+- [A Guide to the Java API for WebSocket](https://www.baeldung.com/java-websockets)
diff --git a/javafx/README.md b/javafx/README.md
index 66c81f17ad..80c4f49026 100644
--- a/javafx/README.md
+++ b/javafx/README.md
@@ -1,3 +1,7 @@
-### Relevant Articles:
--[Introduction to JavaFX](http://www.baeldung.com/javafx)
+## JavaFX
+
+This module contains articles about JavaFX.
+
+### Relevant Articles:
+-[Introduction to JavaFX](https://www.baeldung.com/javafx)
diff --git a/javax-servlets/README.md b/javax-servlets/README.md
index 3c3b17996b..085cc04f87 100644
--- a/javax-servlets/README.md
+++ b/javax-servlets/README.md
@@ -1,9 +1,14 @@
+## Servlets
+
+This module contains articles about Servlets.
+
### Relevant Articles:
-- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets)
-- [An MVC Example with Servlets and JSP](http://www.baeldung.com/mvc-servlet-jsp)
-- [Handling Cookies and a Session in a Java Servlet](http://www.baeldung.com/java-servlet-cookies-session)
-- [Uploading Files with Servlets and JSP](http://www.baeldung.com/upload-file-servlet)
-- [Example of Downloading File in a Servlet](http://www.baeldung.com/servlet-download-file)
-- [Returning a JSON Response from a Servlet](http://www.baeldung.com/servlet-json-response)
-- [Java EE Servlet Exception Handling](http://www.baeldung.com/servlet-exceptions)
-- [Context and Servlet Initialization Parameters](http://www.baeldung.com/context-servlet-initialization-param)
+- [Introduction to Java Servlets](https://www.baeldung.com/intro-to-servlets)
+- [An MVC Example with Servlets and JSP](https://www.baeldung.com/mvc-servlet-jsp)
+- [Handling Cookies and a Session in a Java Servlet](https://www.baeldung.com/java-servlet-cookies-session)
+- [Uploading Files with Servlets and JSP](https://www.baeldung.com/upload-file-servlet)
+- [Example of Downloading File in a Servlet](https://www.baeldung.com/servlet-download-file)
+- [Returning a JSON Response from a Servlet](https://www.baeldung.com/servlet-json-response)
+- [Java EE Servlet Exception Handling](https://www.baeldung.com/servlet-exceptions)
+- [Context and Servlet Initialization Parameters](https://www.baeldung.com/context-servlet-initialization-param)
+- [The Difference between getRequestURI and getPathInfo in HttpServletRequest](https://www.baeldung.com/http-servlet-request-requesturi-pathinfo)
diff --git a/javaxval/README.md b/javaxval/README.md
index 3a975022ad..64903d7463 100644
--- a/javaxval/README.md
+++ b/javaxval/README.md
@@ -1,12 +1,12 @@
-=========
-
## Java Bean Validation Examples
-###The Course
-The "REST With Spring" Classes: http://bit.ly/restwithspring
+This module contains articles about Bean Validation.
### Relevant Articles:
-- [Java Bean Validation Basics](http://www.baeldung.com/javax-validation)
-- [Validating Container Elements with Bean Validation 2.0](http://www.baeldung.com/bean-validation-container-elements)
-- [Method Constraints with Bean Validation 2.0](http://www.baeldung.com/javax-validation-method-constraints)
+- [Java Bean Validation Basics](https://www.baeldung.com/javax-validation)
+- [Validating Container Elements with Bean Validation 2.0](https://www.baeldung.com/bean-validation-container-elements)
+- [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints)
- [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank)
+- [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation)
+- [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups)
+- [Javax Validations for Enums](https://www.baeldung.com/javax-validations-for-enums/)
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java
deleted file mode 100644
index c9f2ab6f98..0000000000
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.baeldung.javabeanconstraints.appplication;
-
-import javax.validation.Validation;
-import javax.validation.Validator;
-import org.baeldung.javabeanconstraints.entities.UserNotBlank;
-
-public class Application {
-
- public static void main(String[] args) throws Exception {
- Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
- UserNotBlank user = new UserNotBlank(" ");
- validator.validate(user).stream().forEach(violation -> System.out.println(violation.getMessage()));
- }
-}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java
deleted file mode 100644
index 6df1b79a60..0000000000
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.baeldung.javabeanconstraints.bigdecimal;
-
-import java.math.BigDecimal;
-
-import javax.validation.constraints.DecimalMin;
-import javax.validation.constraints.Digits;
-
-public class Invoice {
-
- @DecimalMin(value = "0.0", inclusive = false)
- @Digits(integer=3, fraction=2)
- private BigDecimal price;
- private String description;
-
- public Invoice(BigDecimal price, String description) {
- this.price = price;
- this.description = description;
- }
-}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java
deleted file mode 100644
index 4d5df052c2..0000000000
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.baeldung.javabeanconstraints.validationgroup;
-
-public interface AdvanceInfo {
-
-}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java
deleted file mode 100644
index 4564a7a702..0000000000
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.baeldung.javabeanconstraints.validationgroup;
-
-public interface BasicInfo {
-
-}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java
deleted file mode 100644
index 57c06648a7..0000000000
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.baeldung.javabeanconstraints.validationgroup;
-
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotBlank;
-
-public class RegistrationForm {
- @NotBlank(groups=BasicInfo.class)
- private String firstName;
- @NotBlank(groups=BasicInfo.class)
- private String lastName;
- @Email(groups=BasicInfo.class)
- private String email;
- @NotBlank(groups=BasicInfo.class)
- private String phone;
-
- @NotBlank(groups=AdvanceInfo.class)
- private String street;
- @NotBlank(groups=AdvanceInfo.class)
- private String houseNumber;
- @NotBlank(groups=AdvanceInfo.class)
- private String zipCode;
- @NotBlank(groups=AdvanceInfo.class)
- private String city;
- @NotBlank(groups=AdvanceInfo.class)
- private String contry;
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-
- public String getHouseNumber() {
- return houseNumber;
- }
-
- public void setHouseNumber(String houseNumber) {
- this.houseNumber = houseNumber;
- }
-
- public String getZipCode() {
- return zipCode;
- }
-
- public void setZipCode(String zipCode) {
- this.zipCode = zipCode;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getContry() {
- return contry;
- }
-
- public void setContry(String contry) {
- this.contry = contry;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getPhone() {
- return phone;
- }
-
- public void setPhone(String phone) {
- this.phone = phone;
- }
-
-}
diff --git a/javaxval/src/main/java/org/baeldung/User.java b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java
similarity index 95%
rename from javaxval/src/main/java/org/baeldung/User.java
rename to javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java
index e2f2732399..8303edd033 100644
--- a/javaxval/src/main/java/org/baeldung/User.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.beanvalidation;
import java.time.LocalDate;
import java.util.List;
@@ -8,10 +8,10 @@ import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
-import javax.validation.constraints.NotBlank;
public class User {
@@ -30,9 +30,9 @@ public class User {
@Email(message = "Email should be valid")
private String email;
-
- List<@NotBlank String> preferences;
-
+
+ private List<@NotBlank String> preferences;
+
private LocalDate dateOfBirth;
public int getAge() {
@@ -90,5 +90,4 @@ public class User {
public void setPreferences(List preferences) {
this.preferences = preferences;
}
-
}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java b/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java
new file mode 100644
index 0000000000..087701f166
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java
@@ -0,0 +1,19 @@
+package org.baeldung.javaxval.bigdecimal;
+
+import java.math.BigDecimal;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.Digits;
+
+public class Invoice {
+
+ @DecimalMin(value = "0.0", inclusive = false)
+ @Digits(integer = 3, fraction = 2)
+ private BigDecimal price;
+ private String description;
+
+ public Invoice(BigDecimal price, String description) {
+ this.price = price;
+ this.description = description;
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java
similarity index 85%
rename from javaxval/src/main/java/org/baeldung/Customer.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java
index a90fb419de..6ca5ba3ee1 100644
--- a/javaxval/src/main/java/org/baeldung/Customer.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
import java.util.List;
import java.util.Optional;
@@ -10,17 +10,17 @@ import javax.validation.constraints.PositiveOrZero;
public class Customer {
- @NotBlank(message="Name cannot be empty")
+ @NotBlank(message = "Name cannot be empty")
private String name;
- private List<@NotBlank(message="Address must not be blank") String> addresses;
-
+ private List<@NotBlank(message = "Address must not be blank") String> addresses;
+
private Integer age;
-
+
@PositiveOrZero
private OptionalInt numberOfOrders;
-
- //@NotBlank
+
+ @NotBlank
private Profile profile;
public String getName() {
diff --git a/javaxval/src/main/java/org/baeldung/CustomerMap.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java
similarity index 69%
rename from javaxval/src/main/java/org/baeldung/CustomerMap.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java
index 37446cf86e..82cf0f2b0c 100644
--- a/javaxval/src/main/java/org/baeldung/CustomerMap.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
import java.util.Map;
@@ -6,8 +6,8 @@ import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
public class CustomerMap {
-
- private Map<@Email(message="Must be a valid email") String, @NotNull Customer> customers;
+
+ private Map<@Email(message = "Must be a valid email") String, @NotNull Customer> customers;
public Map getCustomers() {
return customers;
diff --git a/javaxval/src/main/java/org/baeldung/Profile.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java
similarity index 81%
rename from javaxval/src/main/java/org/baeldung/Profile.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java
index ec73a5c62f..41260540fc 100644
--- a/javaxval/src/main/java/org/baeldung/Profile.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
public class Profile {
private String companyName;
diff --git a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java
similarity index 79%
rename from javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java
index f192034261..ebc618e80e 100644
--- a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java
@@ -1,10 +1,10 @@
-package org.baeldung.valueextractors;
+package org.baeldung.javaxval.container.validation.valueextractors;
import javax.validation.valueextraction.ExtractedValue;
import javax.validation.valueextraction.UnwrapByDefault;
import javax.validation.valueextraction.ValueExtractor;
-import org.baeldung.Profile;
+import org.baeldung.javaxval.container.validation.Profile;
@UnwrapByDefault
public class ProfileValueExtractor implements ValueExtractor<@ExtractedValue(type = String.class) Profile> {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java
new file mode 100644
index 0000000000..c730cb937f
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java
@@ -0,0 +1,24 @@
+package org.baeldung.javaxval.enums;
+
+import java.util.Arrays;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+
+public class CustomerTypeSubSetValidator implements ConstraintValidator {
+ private CustomerType[] subset;
+
+ @Override
+ public void initialize(CustomerTypeSubset constraint) {
+ this.subset = constraint.anyOf();
+ }
+
+ @Override
+ public boolean isValid(CustomerType value, ConstraintValidatorContext context) {
+ return value == null || Arrays.asList(subset)
+ .contains(value);
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java
new file mode 100644
index 0000000000..a279813461
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java
@@ -0,0 +1,33 @@
+package org.baeldung.javaxval.enums;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.baeldung.javaxval.enums.constraints.EnumNamePattern;
+
+public class EnumNamePatternValidator implements ConstraintValidator> {
+ private Pattern pattern;
+
+ @Override
+ public void initialize(EnumNamePattern constraintAnnotation) {
+ try {
+ pattern = Pattern.compile(constraintAnnotation.regexp());
+ } catch (PatternSyntaxException e) {
+ throw new IllegalArgumentException("Given regex is invalid", e);
+ }
+ }
+
+ @Override
+ public boolean isValid(Enum> value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+
+ Matcher m = pattern.matcher(value.name());
+ return m.matches();
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java
new file mode 100644
index 0000000000..339b4fb03b
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java
@@ -0,0 +1,25 @@
+package org.baeldung.javaxval.enums;
+
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+public abstract class EnumSubSetValidator implements ConstraintValidator {
+ private U[] subset;
+
+ protected void initialize(U[] subset) {
+ this.subset = subset;
+ }
+
+ @Override
+ public boolean isValid(U value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+
+ return Arrays.asList(subset)
+ .contains(value);
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java
new file mode 100644
index 0000000000..1cd31c4187
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java
@@ -0,0 +1,11 @@
+package org.baeldung.javaxval.enums;
+
+import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+
+public class InheritedCustomerTypeSubSetValidator extends EnumSubSetValidator {
+ @Override
+ public void initialize(CustomerTypeSubset constraint) {
+ super.initialize(constraint.anyOf());
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java
new file mode 100644
index 0000000000..7184dae49b
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java
@@ -0,0 +1,31 @@
+package org.baeldung.javaxval.enums;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.baeldung.javaxval.enums.constraints.ValueOfEnum;
+
+public class ValueOfEnumValidator implements ConstraintValidator {
+ private List acceptedValues;
+
+ @Override
+ public void initialize(ValueOfEnum annotation) {
+ acceptedValues = Stream.of(annotation.enumClass()
+ .getEnumConstants())
+ .map(Enum::name)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+
+ return acceptedValues.contains(value.toString());
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java
new file mode 100644
index 0000000000..44009e6723
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java
@@ -0,0 +1,45 @@
+package org.baeldung.javaxval.enums.constraints;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.baeldung.javaxval.enums.CustomerTypeSubSetValidator;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = CustomerTypeSubSetValidator.class)
+public @interface CustomerTypeSubset {
+ /**
+ * @return subset of CustomerType enum
+ */
+ CustomerType[] anyOf();
+
+ /**
+ * @return the error message template
+ */
+ String message() default "must be any of {anyOf}";
+
+ /**
+ * @return the groups the constraint belongs to
+ */
+ Class>[] groups() default {};
+
+ /**
+ * @return the payload associated to the constraint
+ */
+ Class extends Payload>[] payload() default {};
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java
new file mode 100644
index 0000000000..403cdcd0b4
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java
@@ -0,0 +1,45 @@
+package org.baeldung.javaxval.enums.constraints;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.baeldung.javaxval.enums.EnumNamePatternValidator;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = EnumNamePatternValidator.class)
+public @interface EnumNamePattern {
+
+ /**
+ * @return the regular expression to match
+ */
+ String regexp();
+
+ /**
+ * @return the error message template
+ */
+ String message() default "must match \"{regexp}\"";
+
+ /**
+ * @return the groups the constraint belongs to
+ */
+ Class>[] groups() default {};
+
+ /**
+ * @return the payload associated to the constraint
+ */
+ Class extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java
new file mode 100644
index 0000000000..0f9677d982
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java
@@ -0,0 +1,44 @@
+package org.baeldung.javaxval.enums.constraints;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.baeldung.javaxval.enums.ValueOfEnumValidator;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = ValueOfEnumValidator.class)
+public @interface ValueOfEnum {
+ /**
+ * @return class containing enum values to which this String should match
+ */
+ Class extends Enum>> enumClass();
+
+ /**
+ * @return the error message template
+ */
+ String message() default "must be any of enum {enumClass}";
+
+ /**
+ * @return the groups the constraint belongs to
+ */
+ Class>[] groups() default {};
+
+ /**
+ * @return the payload associated to the constraint
+ */
+ Class extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java
new file mode 100644
index 0000000000..db3486ab5f
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java
@@ -0,0 +1,77 @@
+package org.baeldung.javaxval.enums.demo;
+
+import javax.validation.constraints.NotNull;
+
+import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset;
+import org.baeldung.javaxval.enums.constraints.EnumNamePattern;
+import org.baeldung.javaxval.enums.constraints.ValueOfEnum;
+
+public class Customer {
+ @ValueOfEnum(enumClass = CustomerType.class)
+ private String customerTypeString;
+
+ @NotNull
+ @CustomerTypeSubset(anyOf = { CustomerType.NEW, CustomerType.OLD })
+ private CustomerType customerTypeOfSubset;
+
+ @EnumNamePattern(regexp = "NEW|DEFAULT")
+ private CustomerType customerTypeMatchesPattern;
+
+ public Customer() {
+ }
+
+ public Customer(String customerTypeString, CustomerType customerTypeOfSubset, CustomerType customerTypeMatchesPattern) {
+ this.customerTypeString = customerTypeString;
+ this.customerTypeOfSubset = customerTypeOfSubset;
+ this.customerTypeMatchesPattern = customerTypeMatchesPattern;
+ }
+
+ public String getCustomerTypeString() {
+ return customerTypeString;
+ }
+
+ public void setCustomerTypeString(String customerTypeString) {
+ this.customerTypeString = customerTypeString;
+ }
+
+ public CustomerType getCustomerTypeOfSubset() {
+ return customerTypeOfSubset;
+ }
+
+ public void setCustomerTypeOfSubset(CustomerType customerTypeOfSubset) {
+ this.customerTypeOfSubset = customerTypeOfSubset;
+ }
+
+ public CustomerType getCustomerTypeMatchesPattern() {
+ return customerTypeMatchesPattern;
+ }
+
+ public void setCustomerTypeMatchesPattern(CustomerType customerTypeMatchesPattern) {
+ this.customerTypeMatchesPattern = customerTypeMatchesPattern;
+ }
+
+ public static class Builder {
+ private String customerTypeString;
+ private CustomerType customerTypeOfSubset = CustomerType.NEW;
+ private CustomerType customerTypeMatchesPattern;
+
+ public Builder withCustomerTypeString(String customerTypeString) {
+ this.customerTypeString = customerTypeString;
+ return this;
+ }
+
+ public Builder withCustomerTypeOfSubset(CustomerType customerTypeOfSubset) {
+ this.customerTypeOfSubset = customerTypeOfSubset;
+ return this;
+ }
+
+ public Builder withCustomerTypeMatchesPattern(CustomerType customerTypeMatchesPattern) {
+ this.customerTypeMatchesPattern = customerTypeMatchesPattern;
+ return this;
+ }
+
+ public Customer build() {
+ return new Customer(customerTypeString, customerTypeOfSubset, customerTypeMatchesPattern);
+ }
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java
new file mode 100644
index 0000000000..937f3a3817
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java
@@ -0,0 +1,5 @@
+package org.baeldung.javaxval.enums.demo;
+
+public enum CustomerType {
+ NEW, OLD, DEFAULT
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java
new file mode 100644
index 0000000000..22095084c5
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java
@@ -0,0 +1,18 @@
+package org.baeldung.javaxval.javabeanconstraints.application;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank;
+
+public class Application {
+
+ public static void main(String[] args) {
+ Validator validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ UserNotBlank user = new UserNotBlank(" ");
+ validator.validate(user)
+ .stream()
+ .forEach(violation -> System.out.println(violation.getMessage()));
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java
similarity index 81%
rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java
rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java
index 2ea6a3af56..d86b6a65d2 100644
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java
@@ -1,22 +1,22 @@
-package org.baeldung.javabeanconstraints.entities;
-
-import javax.validation.constraints.NotBlank;
-
-public class UserNotBlank {
-
- @NotBlank(message = "Name is mandatory")
- private final String name;
-
- public UserNotBlank(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "User{" + "name=" + name + "}";
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.entities;
+
+import javax.validation.constraints.NotBlank;
+
+public class UserNotBlank {
+
+ @NotBlank(message = "Name is mandatory")
+ private final String name;
+
+ public UserNotBlank(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + "}";
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java
similarity index 80%
rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java
rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java
index 39e34b63d3..2082265145 100644
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java
@@ -1,22 +1,22 @@
-package org.baeldung.javabeanconstraints.entities;
-
-import javax.validation.constraints.NotEmpty;
-
-public class UserNotEmpty {
-
- @NotEmpty(message = "Name is mandatory")
- private final String name;
-
- public UserNotEmpty(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "User{" + "name=" + name + "}";
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.entities;
+
+import javax.validation.constraints.NotEmpty;
+
+public class UserNotEmpty {
+
+ @NotEmpty(message = "Name is mandatory")
+ private final String name;
+
+ public UserNotEmpty(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + "}";
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java
similarity index 80%
rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java
rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java
index 598c9ba9f9..e2f9e7ec57 100644
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java
@@ -1,22 +1,22 @@
-package org.baeldung.javabeanconstraints.entities;
-
-import javax.validation.constraints.NotNull;
-
-public class UserNotNull {
-
- @NotNull(message = "Name is mandatory")
- private final String name;
-
- public UserNotNull(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "User{" + "name=" + name + "}";
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.entities;
+
+import javax.validation.constraints.NotNull;
+
+public class UserNotNull {
+
+ @NotNull(message = "Name is mandatory")
+ private final String name;
+
+ public UserNotNull(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + "}";
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java
index 206a145337..817f2370ef 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java
@@ -1,5 +1,7 @@
package org.baeldung.javaxval.methodvalidation;
+import java.time.LocalDate;
+
import org.baeldung.javaxval.methodvalidation.model.Customer;
import org.baeldung.javaxval.methodvalidation.model.Reservation;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -9,8 +11,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
-import java.time.LocalDate;
-
@Configuration
@ComponentScan({ "org.baeldung.javaxval.methodvalidation.model" })
public class MethodValidationConfig {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java
index f1c97760d7..df09cfa906 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java
@@ -1,10 +1,11 @@
package org.baeldung.javaxval.methodvalidation.constraints;
+import java.time.LocalDate;
+
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;
-import java.time.LocalDate;
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class ConsistentDateParameterValidator implements ConstraintValidator {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java
index 6b321f545c..bdfabe05ba 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java
@@ -1,13 +1,15 @@
package org.baeldung.javaxval.methodvalidation.constraints;
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import javax.validation.Constraint;
+import javax.validation.Payload;
@Constraint(validatedBy = ConsistentDateParameterValidator.class)
@Target({ METHOD, CONSTRUCTOR })
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java
index f9cdea1483..842f9e0621 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java
@@ -1,15 +1,16 @@
package org.baeldung.javaxval.methodvalidation.constraints;
-import javax.validation.Constraint;
-import javax.validation.Payload;
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
@Constraint(validatedBy = ValidReservationValidator.class)
@Target({ METHOD, CONSTRUCTOR })
@Retention(RUNTIME)
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java
index 7b730480ed..c139d1affc 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java
@@ -1,10 +1,11 @@
package org.baeldung.javaxval.methodvalidation.constraints;
-import org.baeldung.javaxval.methodvalidation.model.Reservation;
+import java.time.LocalDate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
-import java.time.LocalDate;
+
+import org.baeldung.javaxval.methodvalidation.model.Reservation;
public class ValidReservationValidator implements ConstraintValidator {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java
index fe9ad7080e..99a32d6277 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java
@@ -1,10 +1,10 @@
package org.baeldung.javaxval.methodvalidation.model;
-import org.springframework.validation.annotation.Validated;
-
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
+import org.springframework.validation.annotation.Validated;
+
@Validated
public class Customer {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java
index a8c01d2be1..5775bdd66b 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java
@@ -1,13 +1,14 @@
package org.baeldung.javaxval.methodvalidation.model;
+import java.time.LocalDate;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Positive;
+
import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters;
import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation;
import org.springframework.validation.annotation.Validated;
-import javax.validation.Valid;
-import javax.validation.constraints.Positive;
-import java.time.LocalDate;
-
@Validated
public class Reservation {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java
index f6fec1a15d..e480e7912d 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java
@@ -1,17 +1,20 @@
package org.baeldung.javaxval.methodvalidation.model;
+import java.time.LocalDate;
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Future;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters;
-import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
-import javax.validation.Valid;
-import javax.validation.constraints.*;
-import java.time.LocalDate;
-import java.util.List;
-
@Controller
@Validated
public class ReservationManagement {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java
new file mode 100644
index 0000000000..9a398e9e7e
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java
@@ -0,0 +1,5 @@
+package org.baeldung.javaxval.validationgroup;
+
+public interface AdvanceInfo {
+
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java
new file mode 100644
index 0000000000..6959f52bfa
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java
@@ -0,0 +1,5 @@
+package org.baeldung.javaxval.validationgroup;
+
+public interface BasicInfo {
+
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java
new file mode 100644
index 0000000000..e34f318b5f
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java
@@ -0,0 +1,8 @@
+package org.baeldung.javaxval.validationgroup;
+
+import javax.validation.GroupSequence;
+
+@GroupSequence({ BasicInfo.class, AdvanceInfo.class })
+public interface CompleteInfo {
+
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java
new file mode 100644
index 0000000000..190a0c1280
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java
@@ -0,0 +1,110 @@
+package org.baeldung.javaxval.validationgroup;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+
+public class RegistrationForm {
+ @NotBlank(groups = BasicInfo.class)
+ private String firstName;
+ @NotBlank(groups = BasicInfo.class)
+ private String lastName;
+ @Email(groups = BasicInfo.class)
+ private String email;
+ @NotBlank(groups = BasicInfo.class)
+ private String phone;
+
+ @NotBlank(groups = { BasicInfo.class, AdvanceInfo.class })
+ private String captcha;
+
+ @NotBlank(groups = AdvanceInfo.class)
+ private String street;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String houseNumber;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String zipCode;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String city;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String country;
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getHouseNumber() {
+ return houseNumber;
+ }
+
+ public void setHouseNumber(String houseNumber) {
+ this.houseNumber = houseNumber;
+ }
+
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getCaptcha() {
+ return captcha;
+ }
+
+ public void setCaptcha(String captcha) {
+ this.captcha = captcha;
+ }
+
+}
diff --git a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor
index e77a30cfe4..16bacf1097 100644
--- a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor
+++ b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor
@@ -1 +1 @@
-org.baeldung.valueextractors.ProfileValueExtractor
\ No newline at end of file
+org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java
deleted file mode 100644
index 91792a0c7e..0000000000
--- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.baeldung.javabeanconstraints.validationgroup;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.Set;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class RegistrationFormUnitTest {
- private static Validator validator;
-
- @BeforeClass
- public static void setupValidatorInstance() {
- validator = Validation.buildDefaultValidatorFactory().getValidator();
- }
-
- @Test
- public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForBasicInfo() {
- RegistrationForm form = buildRegistrationFormWithBasicInfo();
- form.setFirstName("");
- Set> violations = validator.validate(form, BasicInfo.class);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> {
- assertThat(action.getMessage()).isEqualTo("must not be blank");
- assertThat(action.getPropertyPath().toString()).isEqualTo("firstName");
- });
- }
-
- @Test
- public void whenAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForAdvanceInfo() {
- RegistrationForm form = buildRegistrationFormWithAdvanceInfo();
- form.setZipCode("");
- Set> violations = validator.validate(form, AdvanceInfo.class);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> {
- assertThat(action.getMessage()).isEqualTo("must not be blank");
- assertThat(action.getPropertyPath().toString()).isEqualTo("zipCode");
- });
- }
-
- @Test
- public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolations() {
- RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo();
- Set> violations = validator.validate(form);
- assertThat(violations.size()).isEqualTo(0);
- }
-
- private RegistrationForm buildRegistrationFormWithBasicInfo() {
- RegistrationForm form = new RegistrationForm();
- form.setFirstName("devender");
- form.setLastName("kumar");
- form.setEmail("anyemail@yopmail.com");
- form.setPhone("12345");
- return form;
- }
-
- private RegistrationForm buildRegistrationFormWithAdvanceInfo() {
- RegistrationForm form = new RegistrationForm();
- return popultaeAdvanceInfo(form);
- }
-
- private RegistrationForm popultaeAdvanceInfo(RegistrationForm form) {
- form.setCity("Berlin");
- form.setContry("DE");
- form.setStreet("alexa str.");
- form.setZipCode("19923");
- form.setHouseNumber("2a");
- return form;
- }
-
- private RegistrationForm buildRegistrationFormWithBasicAndAdvanceInfo() {
- RegistrationForm form = buildRegistrationFormWithBasicInfo();
- return popultaeAdvanceInfo(form);
- }
-}
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java
new file mode 100644
index 0000000000..5623b50a72
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java
@@ -0,0 +1,23 @@
+package org.baeldung.javaxval;
+
+import java.util.Locale;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public abstract class LocaleAwareUnitTest {
+ private static Locale previousDefault;
+
+ @BeforeClass
+ public static void setupLocale() {
+ previousDefault = Locale.getDefault();
+
+ Locale.setDefault(Locale.US);
+ }
+
+ @AfterClass
+ public static void resetLocale() {
+ Locale.setDefault(previousDefault);
+ }
+
+}
diff --git a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java
similarity index 94%
rename from javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java
index 78745a1af2..3d54955177 100644
--- a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java
@@ -1,20 +1,18 @@
-package org.baeldung;
+package org.baeldung.javaxval.beanvalidation;
+
+import static org.junit.Assert.assertEquals;
import java.time.LocalDate;
import java.util.Collections;
-import java.util.Iterator;
import java.util.Set;
-import java.util.Optional;
-
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
-import static org.junit.Assert.*;
-import org.junit.Test;
import org.junit.Before;
+import org.junit.Test;
public class ValidationIntegrationTest {
@@ -96,7 +94,7 @@ public class ValidationIntegrationTest {
Set> violations = validator.validate(user);
assertEquals(1, violations.size());
}
-
+
@Test
public void givenBlankPreference_thenValidationFails() {
User user = createUser();
@@ -109,18 +107,18 @@ public class ValidationIntegrationTest {
@Test
public void givenEmptyOptional_thenValidationSucceeds() {
User user = createUser();
-
- Set> violations = validator.validate(user);
- assertEquals(0, violations.size());
- }
-
- @Test
- public void givenPastDateOfBirth_thenValidationSuccess() {
- User user = createUser();
- user.setDateOfBirth(LocalDate.of(1980, 5, 20));
Set> violations = validator.validate(user);
assertEquals(0, violations.size());
-
+ }
+
+ @Test
+ public void givenPastDateOfBirth_thenValidationSuccess() {
+ User user = createUser();
+ user.setDateOfBirth(LocalDate.of(1980, 5, 20));
+
+ Set> violations = validator.validate(user);
+ assertEquals(0, violations.size());
+
}
}
diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
similarity index 59%
rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
index 860177f4c9..6a53d67f30 100644
--- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.javabeanconstraints.bigdecimal;
+package org.baeldung.javaxval.bigdecimal;
import static org.assertj.core.api.Assertions.assertThat;
@@ -9,55 +9,54 @@ import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
+import org.baeldung.javaxval.LocaleAwareUnitTest;
import org.junit.BeforeClass;
import org.junit.Test;
-public class InvoiceUnitTest {
-
- private static Validator validator;
+public class InvoiceUnitTest extends LocaleAwareUnitTest {
+
+ private static Validator validator;
@BeforeClass
public static void setupValidatorInstance() {
- validator = Validation.buildDefaultValidatorFactory().getValidator();
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
}
-
+
@Test
public void whenPriceIntegerDigitLessThanThreeWithDecimalValue_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased");
Set> violations = validator.validate(invoice);
assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action-> assertThat(action.getMessage())
- .isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
}
-
+
@Test
public void whenPriceIntegerDigitLessThanThreeWithIntegerValue_thenShouldNotGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased");
Set> violations = validator.validate(invoice);
assertThat(violations.size()).isEqualTo(0);
}
-
+
@Test
public void whenPriceIntegerDigitGreaterThanThree_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased");
Set> violations = validator.validate(invoice);
assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action-> assertThat(action.getMessage())
- .isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
}
-
+
@Test
public void whenPriceIsZero_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased");
Set> violations = validator.validate(invoice);
assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action-> assertThat(action.getMessage())
- .isEqualTo("must be greater than 0.0"));
+ violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("must be greater than 0.0"));
}
-
+
@Test
public void whenPriceIsGreaterThanZero_thenShouldNotGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased");
Set> violations = validator.validate(invoice);
assertThat(violations.size()).isEqualTo(0);
}
diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java
similarity index 91%
rename from javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java
index dff02ff13d..25c8111732 100644
--- a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
import static org.junit.Assert.assertEquals;
@@ -10,8 +10,8 @@ import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
-import org.baeldung.valueextractors.ProfileValueExtractor;
+import org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor;
import org.junit.Before;
import org.junit.Test;
@@ -20,8 +20,10 @@ public class ContainerValidationIntegrationTest {
@Before
public void setup() {
- ValidatorFactory factory = Validation.byDefaultProvider().configure()
- .addValueExtractor(new ProfileValueExtractor()).buildValidatorFactory();
+ ValidatorFactory factory = Validation.byDefaultProvider()
+ .configure()
+ .addValueExtractor(new ProfileValueExtractor())
+ .buildValidatorFactory();
validator = factory.getValidator();
}
@@ -74,7 +76,7 @@ public class ContainerValidationIntegrationTest {
assertEquals(0, violations.size());
}
- //@Test
+ @Test
public void whenProfileCompanyNameBlank_thenValidationFails() {
Customer customer = new Customer();
customer.setName("John");
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java
new file mode 100644
index 0000000000..5aae504b23
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java
@@ -0,0 +1,45 @@
+package org.baeldung.javaxval.enums;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.enums.demo.Customer;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+import org.baeldung.javaxval.enums.demo.CustomerUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CustomerTypeSubSetValidatorUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenEnumAnyOfSubset_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeOfSubset(CustomerType.NEW)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenEnumNotAnyOfSubset_thenShouldGiveOccurrenceOfConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeOfSubset(CustomerType.DEFAULT)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeOfSubset")
+ .and(CustomerUnitTest.havingMessage("must be any of [NEW, OLD]")));
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java
new file mode 100644
index 0000000000..48f7de2c34
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java
@@ -0,0 +1,54 @@
+package org.baeldung.javaxval.enums;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.baeldung.javaxval.enums.demo.CustomerType.DEFAULT;
+import static org.baeldung.javaxval.enums.demo.CustomerType.OLD;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.enums.demo.Customer;
+import org.baeldung.javaxval.enums.demo.CustomerUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class EnumNamePatternValidatorUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenEnumMatchesRegex_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(DEFAULT)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenEnumNull_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(null)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenEnumDoesNotMatchRegex_thenShouldGiveOccurrenceOfConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(OLD)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeMatchesPattern")
+ .and(CustomerUnitTest.havingMessage("must match \"NEW|DEFAULT\"")));
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java
new file mode 100644
index 0000000000..0784b58b77
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java
@@ -0,0 +1,52 @@
+package org.baeldung.javaxval.enums;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.enums.demo.Customer;
+import org.baeldung.javaxval.enums.demo.CustomerUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ValueOfEnumValidatorUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenStringAnyOfEnum_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeString("DEFAULT")
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenStringNull_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeString(null)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenStringNotAnyOfEnum_thenShouldGiveOccurrenceOfConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeString("test")
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeString")
+ .and(CustomerUnitTest.havingMessage("must be any of enum class org.baeldung.javaxval.enums.demo.CustomerType")));
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java
new file mode 100644
index 0000000000..6a064b640f
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java
@@ -0,0 +1,66 @@
+package org.baeldung.javaxval.enums.demo;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+import java.util.function.Predicate;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.LocaleAwareUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CustomerUnitTest extends LocaleAwareUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenAllAcceptable_thenShouldNotGiveConstraintViolations() {
+ Customer customer = new Customer();
+ customer.setCustomerTypeOfSubset(CustomerType.NEW);
+ Set> violations = validator.validate(customer);
+ assertThat(violations).isEmpty();
+ }
+
+ @Test
+ public void whenAllNull_thenOnlyNotNullShouldGiveConstraintViolations() {
+ Customer customer = new Customer();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeOfSubset").and(havingMessage("must not be null")));
+ }
+
+ @Test
+ public void whenAllInvalid_thenViolationsShouldBeReported() {
+ Customer customer = new Customer();
+ customer.setCustomerTypeString("invalid");
+ customer.setCustomerTypeOfSubset(CustomerType.DEFAULT);
+ customer.setCustomerTypeMatchesPattern(CustomerType.OLD);
+
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(3);
+
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeString").and(havingMessage("must be any of enum class org.baeldung.javaxval.enums.demo.CustomerType")));
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeOfSubset").and(havingMessage("must be any of [NEW, OLD]")));
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeMatchesPattern").and(havingMessage("must match \"NEW|DEFAULT\"")));
+ }
+
+ public static Predicate> havingMessage(String message) {
+ return l -> message.equals(l.getMessage());
+ }
+
+ public static Predicate> havingPropertyPath(String propertyPath) {
+ return l -> propertyPath.equals(l.getPropertyPath()
+ .toString());
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java
similarity index 82%
rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java
index 954833fef1..e3a51d4e27 100644
--- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java
@@ -1,63 +1,67 @@
-package org.baeldung.javabeanconstraints.test;
-
-import java.util.Set;
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.baeldung.javabeanconstraints.entities.UserNotBlank;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class UserNotBlankUnitTest {
-
- private static Validator validator;
-
- @BeforeClass
- public static void setupValidatorInstance() {
- validator = Validation.buildDefaultValidatorFactory().getValidator();
- }
-
- @Test
- public void whenNotBlankName_thenNoConstraintViolations() {
- UserNotBlank user = new UserNotBlank("John");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(0);
- }
-
- @Test
- public void whenBlankName_thenOneConstraintViolation() {
- UserNotBlank user = new UserNotBlank(" ");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenEmptyName_thenOneConstraintViolation() {
- UserNotBlank user = new UserNotBlank("");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenNullName_thenOneConstraintViolation() {
- UserNotBlank user = new UserNotBlank(null);
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenToString_thenCorrect() {
- UserNotBlank user = new UserNotBlank("John");
-
- assertThat(user.toString()).isEqualTo("User{name=John}");
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class UserNotBlankUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenNotBlankName_thenNoConstraintViolations() {
+ UserNotBlank user = new UserNotBlank("John");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ @Test
+ public void whenBlankName_thenOneConstraintViolation() {
+ UserNotBlank user = new UserNotBlank(" ");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenEmptyName_thenOneConstraintViolation() {
+ UserNotBlank user = new UserNotBlank("");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenNullName_thenOneConstraintViolation() {
+ UserNotBlank user = new UserNotBlank(null);
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenToString_thenCorrect() {
+ UserNotBlank user = new UserNotBlank("John");
+
+ assertThat(user.toString()).isEqualTo("User{name=John}");
+ }
+}
diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotEmptyUnitTest.java
similarity index 80%
rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotEmptyUnitTest.java
index c2675ed8b6..22fbab6997 100644
--- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotEmptyUnitTest.java
@@ -1,54 +1,58 @@
-package org.baeldung.javabeanconstraints.test;
-
-import java.util.Set;
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.baeldung.javabeanconstraints.entities.UserNotEmpty;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class UserNotEmptyUnitTest {
-
- private static Validator validator;
-
- @BeforeClass
- public static void setupValidatorInstance() {
- validator = Validation.buildDefaultValidatorFactory().getValidator();
- }
-
- @Test
- public void whenNotEmptyName_thenNoConstraintViolations() {
- UserNotEmpty user = new UserNotEmpty("John");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(0);
- }
-
- @Test
- public void whenEmptyName_thenOneConstraintViolation() {
- UserNotEmpty user = new UserNotEmpty("");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenNullName_thenOneConstraintViolation() {
- UserNotEmpty user = new UserNotEmpty(null);
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenToString_thenCorrect() {
- UserNotEmpty user = new UserNotEmpty("John");
-
- assertThat(user.toString()).isEqualTo("User{name=John}");
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.javabeanconstraints.entities.UserNotEmpty;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class UserNotEmptyUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenNotEmptyName_thenNoConstraintViolations() {
+ UserNotEmpty user = new UserNotEmpty("John");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ @Test
+ public void whenEmptyName_thenOneConstraintViolation() {
+ UserNotEmpty user = new UserNotEmpty("");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenNullName_thenOneConstraintViolation() {
+ UserNotEmpty user = new UserNotEmpty(null);
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenToString_thenCorrect() {
+ UserNotEmpty user = new UserNotEmpty("John");
+
+ assertThat(user.toString()).isEqualTo("User{name=John}");
+ }
+}
diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotNullUnitTest.java
similarity index 81%
rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotNullUnitTest.java
index 3dd1811947..a684668ae3 100644
--- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotNullUnitTest.java
@@ -1,54 +1,58 @@
-package org.baeldung.javabeanconstraints.test;
-
-import java.util.Set;
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.baeldung.javabeanconstraints.entities.UserNotNull;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class UserNotNullUnitTest {
-
- private static Validator validator;
-
- @BeforeClass
- public static void setupValidatorInstance() {
- validator = Validation.buildDefaultValidatorFactory().getValidator();
- }
-
- @Test
- public void whenNotNullName_thenNoConstraintViolations() {
- UserNotNull user = new UserNotNull("John");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(0);
- }
-
- @Test
- public void whenNullName_thenOneConstraintViolation() {
- UserNotNull user = new UserNotNull(null);
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenEmptyName_thenNoConstraintViolations() {
- UserNotNull user = new UserNotNull("");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(0);
- }
-
- @Test
- public void whenToString_thenCorrect() {
- UserNotNull user = new UserNotNull("John");
-
- assertThat(user.toString()).isEqualTo("User{name=John}");
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.javabeanconstraints.entities.UserNotNull;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class UserNotNullUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenNotNullName_thenNoConstraintViolations() {
+ UserNotNull user = new UserNotNull("John");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ @Test
+ public void whenNullName_thenOneConstraintViolation() {
+ UserNotNull user = new UserNotNull(null);
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenEmptyName_thenNoConstraintViolations() {
+ UserNotNull user = new UserNotNull("");
+
+ Set> violations = validator.validate(user);
+
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ @Test
+ public void whenToString_thenCorrect() {
+ UserNotNull user = new UserNotNull("John");
+
+ assertThat(user.toString()).isEqualTo("User{name=John}");
+ }
+}
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java
index 2363bf8f5d..8febdca0ee 100644
--- a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java
@@ -1,5 +1,10 @@
package org.baeldung.javaxval.methodvalidation;
+import java.time.LocalDate;
+import java.util.List;
+
+import javax.validation.ConstraintViolationException;
+
import org.baeldung.javaxval.methodvalidation.model.Customer;
import org.baeldung.javaxval.methodvalidation.model.Reservation;
import org.baeldung.javaxval.methodvalidation.model.ReservationManagement;
@@ -12,10 +17,6 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import javax.validation.ConstraintViolationException;
-import java.time.LocalDate;
-import java.util.List;
-
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MethodValidationConfig.class }, loader = AnnotationConfigContextLoader.class)
public class ContainerValidationIntegrationTest {
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java
index 6b53d3a107..9baeba7189 100644
--- a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java
@@ -1,21 +1,23 @@
package org.baeldung.javaxval.methodvalidation;
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.ValidatorFactory;
+import javax.validation.executable.ExecutableValidator;
+
import org.baeldung.javaxval.methodvalidation.model.Customer;
import org.baeldung.javaxval.methodvalidation.model.Reservation;
import org.baeldung.javaxval.methodvalidation.model.ReservationManagement;
import org.junit.Before;
import org.junit.Test;
-import static org.junit.Assert.*;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.ValidatorFactory;
-import javax.validation.executable.ExecutableValidator;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.time.LocalDate;
-import java.util.Collections;
-import java.util.Set;
public class ValidationIntegrationTest {
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java
new file mode 100644
index 0000000000..df70ca0bce
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java
@@ -0,0 +1,145 @@
+package org.baeldung.javaxval.validationgroup;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.LocaleAwareUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RegistrationFormUnitTest extends LocaleAwareUnitTest {
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForBasicInfo() {
+ RegistrationForm form = buildRegistrationFormWithBasicInfo();
+ form.setFirstName("");
+ Set> violations = validator.validate(form, BasicInfo.class);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> {
+ assertThat(action.getMessage()).isEqualTo("must not be blank");
+ assertThat(action.getPropertyPath()
+ .toString()).isEqualTo("firstName");
+ });
+ }
+
+ @Test
+ public void whenAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForAdvanceInfo() {
+ RegistrationForm form = buildRegistrationFormWithAdvanceInfo();
+ form.setZipCode("");
+ Set> violations = validator.validate(form, AdvanceInfo.class);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> {
+ assertThat(action.getMessage()).isEqualTo("must not be blank");
+ assertThat(action.getPropertyPath()
+ .toString()).isEqualTo("zipCode");
+ });
+ }
+
+ @Test
+ public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForBasicInfo() {
+ RegistrationForm form = buildRegistrationFormWithBasicInfo();
+ form.setCaptcha("");
+ Set> violations = validator.validate(form, BasicInfo.class);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> {
+ assertThat(action.getMessage()).isEqualTo("must not be blank");
+ assertThat(action.getPropertyPath()
+ .toString()).isEqualTo("captcha");
+ });
+ }
+
+ @Test
+ public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForAdvanceInfo() {
+ RegistrationForm form = buildRegistrationFormWithAdvanceInfo();
+ form.setCaptcha("");
+ Set> violations = validator.validate(form, AdvanceInfo.class);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> {
+ assertThat(action.getMessage()).isEqualTo("must not be blank");
+ assertThat(action.getPropertyPath()
+ .toString()).isEqualTo("captcha");
+ });
+ }
+
+ @Test
+ public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsForBasicInfoOnly() {
+ RegistrationForm form = buildRegistrationFormWithBasicInfo();
+ form.setFirstName("");
+ Set> violations = validator.validate(form, CompleteInfo.class);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> {
+ assertThat(action.getMessage()).isEqualTo("must not be blank");
+ assertThat(action.getPropertyPath()
+ .toString()).isEqualTo("firstName");
+ });
+ }
+
+ @Test
+ public void whenBasicInfoIsCompleteAndAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsForAdvanceInfo() {
+ RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo();
+ form.setZipCode("");
+ Set> violations = validator.validate(form, CompleteInfo.class);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> {
+ assertThat(action.getMessage()).isEqualTo("must not be blank");
+ assertThat(action.getPropertyPath()
+ .toString()).isEqualTo("zipCode");
+ });
+ }
+
+ @Test
+ public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolationsWithCompleteInfoValidationGroup() {
+ RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo();
+ Set> violations = validator.validate(form, CompleteInfo.class);
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ @Test
+ public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolations() {
+ RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo();
+ Set> violations = validator.validate(form);
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ private RegistrationForm buildRegistrationFormWithBasicInfo() {
+ RegistrationForm form = new RegistrationForm();
+ form.setFirstName("devender");
+ form.setLastName("kumar");
+ form.setEmail("anyemail@yopmail.com");
+ form.setPhone("12345");
+ form.setCaptcha("Y2HAhU5T");
+ return form;
+ }
+
+ private RegistrationForm buildRegistrationFormWithAdvanceInfo() {
+ RegistrationForm form = new RegistrationForm();
+ return populateAdvanceInfo(form);
+ }
+
+ private RegistrationForm populateAdvanceInfo(RegistrationForm form) {
+ form.setCity("Berlin");
+ form.setCountry("DE");
+ form.setStreet("alexa str.");
+ form.setZipCode("19923");
+ form.setHouseNumber("2a");
+ form.setCaptcha("Y2HAhU5T");
+ return form;
+ }
+
+ private RegistrationForm buildRegistrationFormWithBasicAndAdvanceInfo() {
+ RegistrationForm form = buildRegistrationFormWithBasicInfo();
+ return populateAdvanceInfo(form);
+ }
+}
diff --git a/jaxb/README.md b/jaxb/README.md
index 4b603fca00..aca078af15 100644
--- a/jaxb/README.md
+++ b/jaxb/README.md
@@ -1,2 +1,6 @@
+## JAXB
+
+This module contains articles about JAXB.
+
### Relevant Articles:
-- [Guide to JAXB](http://www.baeldung.com/jaxb)
+- [Guide to JAXB](https://www.baeldung.com/jaxb)
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java
new file mode 100644
index 0000000000..0625c58344
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java
@@ -0,0 +1,25 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+@XmlRootElement(name = "book")
+public class Book {
+
+ @XmlElement(name = "title", required = true)
+ private String title;
+
+ @XmlElement(name = "published", required = true)
+ private XMLGregorianCalendar published;
+
+ public XMLGregorianCalendar getPublished() {
+ return published;
+ }
+
+ @Override
+ public String toString() {
+ return "[title: " + title + "; published: " + published.toString() + "]";
+ }
+
+}
\ No newline at end of file
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java
new file mode 100644
index 0000000000..c882f37a04
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java
@@ -0,0 +1,27 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.util.Date;
+
+@XmlRootElement(name = "book")
+public class BookDateAdapter {
+
+ @XmlElement(name = "title", required = true)
+ private String title;
+
+ @XmlElement(name = "published", required = true)
+ @XmlJavaTypeAdapter(DateAdapter.class)
+ private Date published;
+
+ public Date getPublished() {
+ return published;
+ }
+
+ @Override
+ public String toString() {
+ return "[title: " + title + "; published: " + published.toString() + "]";
+ }
+
+}
\ No newline at end of file
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java
new file mode 100644
index 0000000000..53a780a87a
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java
@@ -0,0 +1,27 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.time.LocalDateTime;
+
+@XmlRootElement(name = "book")
+public class BookLocalDateTimeAdapter {
+
+ @XmlElement(name = "title", required = true)
+ private String title;
+
+ @XmlElement(name = "published", required = true)
+ @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
+ private LocalDateTime published;
+
+ public LocalDateTime getPublished() {
+ return published;
+ }
+
+ @Override
+ public String toString() {
+ return "[title: " + title + "; published: " + published.toString() + "]";
+ }
+
+}
\ No newline at end of file
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java
new file mode 100644
index 0000000000..3b0fd0bd26
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java
@@ -0,0 +1,21 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateAdapter extends XmlAdapter {
+
+ private static final String CUSTOM_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
+
+ @Override
+ public String marshal(Date v) {
+ return new SimpleDateFormat(CUSTOM_FORMAT_STRING).format(v);
+ }
+
+ @Override
+ public Date unmarshal(String v) throws Exception {
+ return new SimpleDateFormat(CUSTOM_FORMAT_STRING).parse(v);
+ }
+
+}
\ No newline at end of file
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java
new file mode 100644
index 0000000000..205859b2bf
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java
@@ -0,0 +1,45 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import java.io.InputStream;
+
+public class JaxbDateUnmarshalling {
+
+ public static final String DEFAULT_DATE_UNMARSHALLING_FILE = "default-date-unmarshalling.xml";
+ public static final String CUSTOM_DATE_UNMARSHALLING_FILE = "custom-date-unmarshalling.xml";
+
+ public static Book unmarshalDates(InputStream inputFile) throws JAXBException {
+ JAXBContext jaxbContext = JAXBContext.newInstance(Book.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ return (Book) jaxbUnmarshaller.unmarshal(inputFile);
+ }
+
+ public static BookDateAdapter unmarshalDatesUsingCustomXmlAdapter(InputStream inputFile) throws JAXBException {
+ JAXBContext jaxbContext = JAXBContext.newInstance(BookDateAdapter.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ return (BookDateAdapter) jaxbUnmarshaller.unmarshal(inputFile);
+ }
+
+ public static BookLocalDateTimeAdapter unmarshalDatesUsingJava8(InputStream inputFile) throws JAXBException {
+ JAXBContext jaxbContext = JAXBContext.newInstance(BookLocalDateTimeAdapter.class);
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+ return (BookLocalDateTimeAdapter) jaxbUnmarshaller.unmarshal(inputFile);
+ }
+
+ public static InputStream getInputStream(String file) {
+ ClassLoader classLoader = JaxbDateUnmarshalling.class.getClassLoader();
+ return classLoader.getResourceAsStream(file);
+ }
+
+ public static void main(String[] args) throws JAXBException {
+ Book book = unmarshalDates(getInputStream(DEFAULT_DATE_UNMARSHALLING_FILE));
+ BookDateAdapter bookDateAdapter = unmarshalDatesUsingCustomXmlAdapter(getInputStream(CUSTOM_DATE_UNMARSHALLING_FILE));
+ BookLocalDateTimeAdapter bookLocalDateTimeAdapter = unmarshalDatesUsingJava8(getInputStream(CUSTOM_DATE_UNMARSHALLING_FILE));
+ System.out.println(book);
+ System.out.println(bookDateAdapter);
+ System.out.println(bookLocalDateTimeAdapter);
+ }
+
+}
diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java
new file mode 100644
index 0000000000..7fa224334c
--- /dev/null
+++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java
@@ -0,0 +1,21 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class LocalDateTimeAdapter extends XmlAdapter {
+
+ private DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+ @Override
+ public String marshal(LocalDateTime dateTime) {
+ return dateTime.format(dateFormat);
+ }
+
+ @Override
+ public LocalDateTime unmarshal(String dateTime) {
+ return LocalDateTime.parse(dateTime, dateFormat);
+ }
+
+}
\ No newline at end of file
diff --git a/jaxb/src/main/resources/custom-date-unmarshalling.xml b/jaxb/src/main/resources/custom-date-unmarshalling.xml
new file mode 100644
index 0000000000..f4cc7a4f79
--- /dev/null
+++ b/jaxb/src/main/resources/custom-date-unmarshalling.xml
@@ -0,0 +1,5 @@
+
+
+ Book1
+ 1979-11-28 02:31:32
+
\ No newline at end of file
diff --git a/jaxb/src/main/resources/default-date-unmarshalling.xml b/jaxb/src/main/resources/default-date-unmarshalling.xml
new file mode 100644
index 0000000000..44cfa7e6c5
--- /dev/null
+++ b/jaxb/src/main/resources/default-date-unmarshalling.xml
@@ -0,0 +1,5 @@
+
+
+ Book1
+ 1979-11-28T02:31:32
+
\ No newline at end of file
diff --git a/jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java b/jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java
new file mode 100644
index 0000000000..298034be3d
--- /dev/null
+++ b/jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.jaxb.dateunmarshalling;
+
+import org.junit.Test;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+import static org.junit.Assert.assertEquals;
+
+public class JaxbDateUnmarshallingUnitTest {
+
+ @Test
+ public void whenUnmarshalDatesIsCalled_ThenCorrectDateIsReturned() throws JAXBException, DatatypeConfigurationException {
+ InputStream inputStream = JaxbDateUnmarshalling.getInputStream(JaxbDateUnmarshalling.DEFAULT_DATE_UNMARSHALLING_FILE);
+ XMLGregorianCalendar expected = DatatypeFactory.newInstance().newXMLGregorianCalendar("1979-11-28T02:31:32");
+
+ Book book = JaxbDateUnmarshalling.unmarshalDates(inputStream);
+
+ assertEquals(expected, book.getPublished());
+ }
+
+ @Test
+ public void whenUnmarshalDatesUsingCustomXmlAdapterIsCalled_ThenCorrectDateIsReturned() throws JAXBException, ParseException {
+ InputStream inputStream = JaxbDateUnmarshalling.getInputStream(JaxbDateUnmarshalling.CUSTOM_DATE_UNMARSHALLING_FILE);
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ Date expected = format.parse("1979-11-28 02:31:32");
+
+ BookDateAdapter book = JaxbDateUnmarshalling.unmarshalDatesUsingCustomXmlAdapter(inputStream);
+
+ assertEquals(expected, book.getPublished());
+ }
+
+ @Test
+ public void whenUnmarshalDatesUsingJava8IsCalled_ThenCorrectDateIsReturned() throws JAXBException {
+ InputStream inputStream = JaxbDateUnmarshalling.getInputStream(JaxbDateUnmarshalling.CUSTOM_DATE_UNMARSHALLING_FILE);
+ DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ LocalDateTime expected = LocalDateTime.parse("1979-11-28 02:31:32", dateFormat);
+
+ BookLocalDateTimeAdapter book = JaxbDateUnmarshalling.unmarshalDatesUsingJava8(inputStream);
+
+ assertEquals(expected, book.getPublished());
+ }
+
+}
\ No newline at end of file
diff --git a/jee-7-security/README.md b/jee-7-security/README.md
index 314de6d957..ced2beec46 100644
--- a/jee-7-security/README.md
+++ b/jee-7-security/README.md
@@ -1,2 +1,6 @@
+## JEE 7 Security
+
+This module contains articles about security in JEE 7.
+
### Relevant Articles:
-- [Securing Java EE with Spring Security](http://www.baeldung.com/java-ee-spring-security)
+- [Securing Java EE with Spring Security](https://www.baeldung.com/java-ee-spring-security)
diff --git a/jee-7/README.md b/jee-7/README.md
index c57863651d..2c45fe2c67 100644
--- a/jee-7/README.md
+++ b/jee-7/README.md
@@ -1,9 +1,13 @@
+## JEE 7
+
+This module contains articles about JEE 7.
+
### Relevant Articles:
-- [Scheduling in Java EE](http://www.baeldung.com/scheduling-in-java-enterprise-edition)
-- [JSON Processing in Java EE 7](http://www.baeldung.com/jee7-json)
-- [Converters, Listeners and Validators in Java EE 7](http://www.baeldung.com/java-ee7-converter-listener-validator)
-- [Introduction to JAX-WS](http://www.baeldung.com/jax-ws)
-- [A Guide to Java EE Web-Related Annotations](http://www.baeldung.com/javaee-web-annotations)
-- [Introduction to Testing with Arquillian](http://www.baeldung.com/arquillian)
+- [Scheduling in Java EE](https://www.baeldung.com/scheduling-in-java-enterprise-edition)
+- [JSON Processing in Java EE 7](https://www.baeldung.com/jee7-json)
+- [Converters, Listeners and Validators in Java EE 7](https://www.baeldung.com/java-ee7-converter-listener-validator)
+- [Introduction to JAX-WS](https://www.baeldung.com/jax-ws)
+- [A Guide to Java EE Web-Related Annotations](https://www.baeldung.com/javaee-web-annotations)
+- [Introduction to Testing with Arquillian](https://www.baeldung.com/arquillian)
- [Java EE 7 Batch Processing](https://www.baeldung.com/java-ee-7-batch-processing)
- [The Difference Between CDI and EJB Singleton](https://www.baeldung.com/jee-cdi-vs-ejb-singleton)
diff --git a/jee-kotlin/README.md b/jee-kotlin/README.md
index 43dcd992ca..aa3aa58b4e 100644
--- a/jee-kotlin/README.md
+++ b/jee-kotlin/README.md
@@ -1,2 +1,6 @@
+## JEE in Kotlin
+
+This module contains articles about Java EE with Kotlin.
+
### Relevant Articles:
- [Java EE Application with Kotlin](https://www.baeldung.com/java-ee-kotlin-app)
diff --git a/jenkins/README.md b/jenkins/README.md
index 6b28b61277..ba3e13cc95 100644
--- a/jenkins/README.md
+++ b/jenkins/README.md
@@ -1,2 +1,3 @@
+## Jenkins
This is an aggregator modules for Jenkins-related modules.
diff --git a/jenkins/hello-world/README.md b/jenkins/hello-world/README.md
deleted file mode 100644
index da60e556df..0000000000
--- a/jenkins/hello-world/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Relevant articles:
-
-- [Writing a Jenkins Plugin](http://www.baeldung.com/jenkins-custom-plugin)
diff --git a/jenkins/plugins/README.md b/jenkins/plugins/README.md
new file mode 100644
index 0000000000..cf7aa3dba8
--- /dev/null
+++ b/jenkins/plugins/README.md
@@ -0,0 +1,7 @@
+## Jenkins plugins
+
+This module contains articles about various Jenkins plugins.
+
+### Relevant articles:
+
+- [Writing a Jenkins Plugin](https://www.baeldung.com/jenkins-custom-plugin)
diff --git a/jenkins/hello-world/pom.xml b/jenkins/plugins/pom.xml
similarity index 98%
rename from jenkins/hello-world/pom.xml
rename to jenkins/plugins/pom.xml
index f00a551173..1db7cec394 100644
--- a/jenkins/hello-world/pom.xml
+++ b/jenkins/plugins/pom.xml
@@ -2,9 +2,9 @@
4.0.0
- hello-world
+ plugins1.0-SNAPSHOT
- hello-world
+ pluginshpiA sample Jenkins Hello World plugin
diff --git a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java
similarity index 90%
rename from jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java
rename to jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java
index 67af636bb4..46899c49d1 100644
--- a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java
+++ b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java
@@ -1,4 +1,4 @@
-package com.baeldung.jenkins.helloworld;
+package com.baeldung.jenkins.plugins;
public class ProjectStats {
diff --git a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java
similarity index 99%
rename from jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java
rename to jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java
index 9a7213c76f..39500a42cb 100644
--- a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java
+++ b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java
@@ -1,4 +1,4 @@
-package com.baeldung.jenkins.helloworld;
+package com.baeldung.jenkins.plugins;
import hudson.Extension;
import hudson.FilePath;
diff --git a/jenkins/plugins/src/main/resources/logback.xml b/jenkins/plugins/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/jenkins/plugins/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jenkins/hello-world/src/main/resources/stats.html b/jenkins/plugins/src/main/resources/stats.html
similarity index 100%
rename from jenkins/hello-world/src/main/resources/stats.html
rename to jenkins/plugins/src/main/resources/stats.html
diff --git a/jersey/README.md b/jersey/README.md
index 126dc542ba..09de7051ca 100644
--- a/jersey/README.md
+++ b/jersey/README.md
@@ -1,4 +1,9 @@
-- [Jersey Filters and Interceptors](http://www.baeldung.com/jersey-filters-interceptors)
+## Jersey
+
+This module contains articles about Jersey.
+
+### Relevant Articles
+- [Jersey Filters and Interceptors](https://www.baeldung.com/jersey-filters-interceptors)
- [Jersey MVC Support](https://www.baeldung.com/jersey-mvc)
- [Bean Validation in Jersey](https://www.baeldung.com/jersey-bean-validation)
- [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response)
diff --git a/jgit/README.md b/jgit/README.md
index 5c65f1101b..b48f3c7a87 100644
--- a/jgit/README.md
+++ b/jgit/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## JGit
-- [A Guide to JGit](http://www.baeldung.com/jgit)
+This module contains articles about JGit.
+
+### Relevant articles:
+
+- [A Guide to JGit](https://www.baeldung.com/jgit)
diff --git a/jgroups/README.md b/jgroups/README.md
index 0921fa98a1..046ac89c1f 100644
--- a/jgroups/README.md
+++ b/jgroups/README.md
@@ -1,15 +1,12 @@
## Reliable Messaging with JGroups Tutorial Project
+This module contains articles about JGroups.
+
### Relevant Article:
-- [Reliable Messaging with JGroups](http://www.baeldung.com/jgroups)
+- [Reliable Messaging with JGroups](https://www.baeldung.com/jgroups)
### Overview
This Maven project contains the Java code for the article linked above.
### Package Organization
Java classes for the intro tutorial are in the org.baeldung.jgroups package.
-
-
-### Running the tests
-
-```
diff --git a/jhipster-5/README.md b/jhipster-5/README.md
index 2731281b3e..ba05641af0 100644
--- a/jhipster-5/README.md
+++ b/jhipster-5/README.md
@@ -1,2 +1,3 @@
+## JHipster 5
-This is an aggregator module for JHipster 5 modules.
+This module contains articles about JHipster 5. This is an aggregator module, articles are in the relevant submodules.
diff --git a/jhipster/README.md b/jhipster/README.md
new file mode 100644
index 0000000000..1bb31951f0
--- /dev/null
+++ b/jhipster/README.md
@@ -0,0 +1,9 @@
+## JHipster
+
+This module contains articles about JHipster.
+
+### Relevant articles:
+
+- [JHipster with a Microservice Architecture](https://www.baeldung.com/jhipster-microservices)
+- [Intro to JHipster](https://www.baeldung.com/jhipster)
+- [Building a Basic UAA-Secured JHipster Microservice](https://www.baeldung.com/jhipster-uaa-secured-micro-service)
diff --git a/jhipster/jhipster-monolithic/README.md b/jhipster/jhipster-monolithic/README.md
index 65cc51ad88..de7c6ded74 100644
--- a/jhipster/jhipster-monolithic/README.md
+++ b/jhipster/jhipster-monolithic/README.md
@@ -1,6 +1,7 @@
## Relevant Articles
- [Intro to JHipster](https://www.baeldung.com/jhipster)
+- [Creating New Roles and Authorities in JHipster](https://www.baeldung.com/jhipster-new-roles)
# baeldung
diff --git a/jib/README.md b/jib/README.md
index 82bd2fed42..e0ff7c4058 100644
--- a/jib/README.md
+++ b/jib/README.md
@@ -1,3 +1,7 @@
+## Jib
+
+This module contains articles about Jib.
+
### Relevant Articles:
- [Dockerizing Java Apps using Jib](https://www.baeldung.com/jib-dockerizing)
diff --git a/jjwt/README.md b/jjwt/README.md
index ed18363dfc..25f5a8f6f0 100644
--- a/jjwt/README.md
+++ b/jjwt/README.md
@@ -1,5 +1,6 @@
## JWT Fun
+This module contains articles about JJWT.
This tutorial walks you through the various features supported by the [JJWT](https://github.com/jwtk/jjwt) library - a fluent interface Java JWT building and parsing library.
### Build and Run
@@ -45,4 +46,4 @@ Available commands (assumes httpie - https://github.com/jkbrzt/httpie):
## Relevant articles:
-- [Supercharge Java Authentication with JSON Web Tokens (JWTs)](http://www.baeldung.com/java-json-web-tokens-jjwt)
+- [Supercharge Java Authentication with JSON Web Tokens (JWTs)](https://www.baeldung.com/java-json-web-tokens-jjwt)
diff --git a/jmeter/README.md b/jmeter/README.md
index e3f9d1a4db..81300afe7c 100644
--- a/jmeter/README.md
+++ b/jmeter/README.md
@@ -1,7 +1,7 @@
-BASIC CRUD API with Spring Boot
-================================
+## JMeter
-This is the code of a simple API for some CRUD operations build using Spring Boot.
+This module contains articles about JMeter.
+It contains the code of a simple API for some CRUD operations built using Spring Boot.
### Requirements
@@ -42,5 +42,5 @@ Enjoy it :)
### Relevant Articles:
-- [Intro to Performance Testing using JMeter](http://www.baeldung.com/jmeter)
-- [Configure Jenkins to Run and Show JMeter Tests](http://www.baeldung.com/jenkins-and-jmeter)
+- [Intro to Performance Testing using JMeter](https://www.baeldung.com/jmeter)
+- [Configure Jenkins to Run and Show JMeter Tests](https://www.baeldung.com/jenkins-and-jmeter)
diff --git a/jmh/README.md b/jmh/README.md
index 9c5a70e3c2..6876615328 100644
--- a/jmh/README.md
+++ b/jmh/README.md
@@ -1,4 +1,4 @@
## Relevant articles:
-- [Microbenchmarking with Java](http://www.baeldung.com/java-microbenchmark-harness)
+- [Microbenchmarking with Java](https://www.baeldung.com/java-microbenchmark-harness)
diff --git a/jni/README.md b/jni/README.md
index 663cafb0c0..daaeb7819f 100644
--- a/jni/README.md
+++ b/jni/README.md
@@ -1,4 +1,4 @@
### Relevant Articles:
-- [Guide to JNI (Java Native Interface)](http://www.baeldung.com/jni)
+- [Guide to JNI (Java Native Interface)](https://www.baeldung.com/jni)
diff --git a/jooby/README.md b/jooby/README.md
index aa867b2c56..bf8c580633 100644
--- a/jooby/README.md
+++ b/jooby/README.md
@@ -1,3 +1,3 @@
## Relevant articles:
-- [Introduction to Jooby](http://www.baeldung.com/jooby)
+- [Introduction to Jooby](https://www.baeldung.com/jooby)
diff --git a/jsf/README.md b/jsf/README.md
index d96c1eb8e3..65735cc406 100644
--- a/jsf/README.md
+++ b/jsf/README.md
@@ -1,5 +1,5 @@
### Relevant Articles:
-- [Guide to JSF Expression Language 3.0](http://www.baeldung.com/jsf-expression-language-el-3)
-- [Introduction to JSF EL 2](http://www.baeldung.com/intro-to-jsf-expression-language)
-- [JavaServer Faces (JSF) with Spring](http://www.baeldung.com/spring-jsf)
-- [Introduction to Primefaces](http://www.baeldung.com/jsf-primefaces)
+- [Guide to JSF Expression Language 3.0](https://www.baeldung.com/jsf-expression-language-el-3)
+- [Introduction to JSF EL 2](https://www.baeldung.com/intro-to-jsf-expression-language)
+- [JavaServer Faces (JSF) with Spring](https://www.baeldung.com/spring-jsf)
+- [Introduction to Primefaces](https://www.baeldung.com/jsf-primefaces)
diff --git a/json-path/README.md b/json-path/README.md
index 7a84ea7bde..41cc72a842 100644
--- a/json-path/README.md
+++ b/json-path/README.md
@@ -1,4 +1,4 @@
## Relevant articles:
-- [Introduction to JsonPath](http://www.baeldung.com/guide-to-jayway-jsonpath)
-- [Count with JsonPath](http://www.baeldung.com/jsonpath-count)
+- [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath)
+- [Count with JsonPath](https://www.baeldung.com/jsonpath-count)
diff --git a/json/README.md b/json/README.md
index 7ef4cc9b01..96acedd0b1 100644
--- a/json/README.md
+++ b/json/README.md
@@ -3,13 +3,13 @@
## Fast-Json
### Relevant Articles:
-- [Introduction to JSON Schema in Java](http://www.baeldung.com/introduction-to-json-schema-in-java)
-- [A Guide to FastJson](http://www.baeldung.com/fastjson)
-- [Introduction to JSONForms](http://www.baeldung.com/introduction-to-jsonforms)
-- [Introduction to JsonPath](http://www.baeldung.com/guide-to-jayway-jsonpath)
-- [Introduction to JSON-Java (org.json)](http://www.baeldung.com/java-org-json)
+- [Introduction to JSON Schema in Java](https://www.baeldung.com/introduction-to-json-schema-in-java)
+- [A Guide to FastJson](https://www.baeldung.com/fastjson)
+- [Introduction to JSONForms](https://www.baeldung.com/introduction-to-jsonforms)
+- [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath)
+- [Introduction to JSON-Java (org.json)](https://www.baeldung.com/java-org-json)
- [Overview of JSON Pointer](https://www.baeldung.com/json-pointer)
-- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api)
+- [Introduction to the JSON Binding API (JSR 367) in Java](https://www.baeldung.com/java-json-binding-api)
- [Get a Value by Key in a JSONArray](https://www.baeldung.com/java-jsonarray-get-value-by-key)
- [Iterating Over an Instance of org.json.JSONObject](https://www.baeldung.com/jsonobject-iteration)
- [Escape JSON String in Java](https://www.baeldung.com/java-json-escaping)
diff --git a/jsoup/README.md b/jsoup/README.md
index 8728cc7c4e..7624ce77bf 100644
--- a/jsoup/README.md
+++ b/jsoup/README.md
@@ -3,7 +3,7 @@
## jsoup Example Project
### Relevant Articles:
-- [Parsing HTML in Java with Jsoup](http://www.baeldung.com/java-with-jsoup)
+- [Parsing HTML in Java with Jsoup](https://www.baeldung.com/java-with-jsoup)
### Build the Project
diff --git a/jws/README.md b/jws/README.md
index 428d8b650d..c7cddb11ac 100644
--- a/jws/README.md
+++ b/jws/README.md
@@ -1,3 +1,7 @@
+## Java Web Start
+
+This module contains articles about Java Web Start.
+
### Relevant articles
-- [A Guide to the Java Web Start](http://www.baeldung.com/java-web-start)
+- [A Guide to the Java Web Start](https://www.baeldung.com/java-web-start)
diff --git a/kotlin-js/README.md b/kotlin-js/README.md
index 445ad6da9a..84d0c70427 100644
--- a/kotlin-js/README.md
+++ b/kotlin-js/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [Kotlin and Javascript](http://www.baeldung.com/kotlin-javascript)
+- [Kotlin and Javascript](https://www.baeldung.com/kotlin-javascript)
diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md
index 94359193b6..6ad90c1cd2 100644
--- a/kotlin-libraries/README.md
+++ b/kotlin-libraries/README.md
@@ -1,14 +1,14 @@
## Relevant articles:
-- [Kotlin with Mockito](http://www.baeldung.com/kotlin-mockito)
-- [HTTP Requests with Kotlin and khttp](http://www.baeldung.com/kotlin-khttp)
-- [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection)
-- [Writing Specifications with Kotlin and Spek](http://www.baeldung.com/kotlin-spek)
-- [Processing JSON with Kotlin and Klaxson](http://www.baeldung.com/kotlin-json-klaxson)
+- [Kotlin with Mockito](https://www.baeldung.com/kotlin-mockito)
+- [HTTP Requests with Kotlin and khttp](https://www.baeldung.com/kotlin-khttp)
+- [Kotlin Dependency Injection with Kodein](https://www.baeldung.com/kotlin-kodein-dependency-injection)
+- [Writing Specifications with Kotlin and Spek](https://www.baeldung.com/kotlin-spek)
+- [Processing JSON with Kotlin and Klaxson](https://www.baeldung.com/kotlin-json-klaxson)
- [Guide to the Kotlin Exposed Framework](https://www.baeldung.com/kotlin-exposed-persistence)
- [Working with Dates in Kotlin](https://www.baeldung.com/kotlin-dates)
- [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow)
- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor)
- [REST API With Kotlin and Kovert](https://www.baeldung.com/kotlin-kovert)
- [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk)
-- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections)
\ No newline at end of file
+- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections)
diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml
index e252329426..5299b5029e 100644
--- a/kotlin-libraries/pom.xml
+++ b/kotlin-libraries/pom.xml
@@ -100,7 +100,7 @@
io.arrow-ktarrow-core
- 0.7.3
+ ${arrow-core.version}
@@ -117,7 +117,7 @@
nl.komponents.kovenantkovenant
- 3.3.0
+ ${kovenant.version}pom
@@ -132,13 +132,13 @@
com.google.guavaguava
- 27.1-jre
+ ${guava.version}org.jetbrains.kotlinxkotlinx-collections-immutable
- 0.1
+ ${kotlinx-collections-immutable.version}
@@ -151,26 +151,26 @@
net.bytebuddybyte-buddy
- 1.8.13
+ ${byte-buddy.version}compilenet.bytebuddybyte-buddy-agent
- 1.8.13
+ ${byte-buddy.version}compileorg.objenesisobjenesis
- 2.6
+ ${objenesis.version}compileio.reactivex.rxjava2rxkotlin
- 2.3.0
+ ${rxkotlin.version}
@@ -186,6 +186,13 @@
3.10.00.10.41.9.3
+ 27.1-jre
+ 3.3.0
+ 1.8.13
+ 2.6
+ 2.3.0
+ 0.1
+ 0.7.3
diff --git a/lagom/README.md b/lagom/README.md
index 909fe0dff4..1453b511e8 100644
--- a/lagom/README.md
+++ b/lagom/README.md
@@ -1,11 +1,12 @@
+## Lagom
+
+This module contains articles about the Lagom framework.
+
### Relevant articles
-- [Guide to Reactive Microservices Using Lagom Framework](http://www.baeldung.com/lagom-reactive-microservices)
+- [Guide to Reactive Microservices Using Lagom Framework](https://www.baeldung.com/lagom-reactive-microservices)
-
-
-
-Steps to setup from scratch
+### Steps to setup from scratch
1) Create sbt build file "build.sbt"
2) Create plugins file project/plugins.sbt
@@ -35,13 +36,13 @@ Steps to setup from scratch
10) Run project: sbt lagom:runAll
-Sample Run:
-curl http://localhost:9000/api/greeting/Nikhil;
+### Sample Run:
+```
+$ curl http://localhost:9000/api/greeting/Nikhil;
Hello Nikhil! Today's weather stats: Going to be very humid, Take Water
-curl http://localhost:9000/api/greeting/Nikhil;
+$ curl http://localhost:9000/api/greeting/Nikhil;
Hello Again Nikhil! Today's weather stats: Going to Rain, Take Umbrella
-
-
+```
diff --git a/libraries-2/README.md b/libraries-2/README.md
index a9f0e86a5f..fd1f73c386 100644
--- a/libraries-2/README.md
+++ b/libraries-2/README.md
@@ -1,5 +1,13 @@
-## Relevant Articles:
+## Libraries
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
- [A Guide to jBPM with Java](https://www.baeldung.com/jbpm-java)
- [Guide to Classgraph Library](https://www.baeldung.com/classgraph)
- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program)
@@ -8,7 +16,8 @@
- [A Guide to Crawler4j](https://www.baeldung.com/crawler4j)
- [Decode an OkHttp JSON Response](https://www.baeldung.com/okhttp-json-response)
- [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map)
-- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication)
- [Guide to MapDB](https://www.baeldung.com/mapdb)
- [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos)
-- [JasperReports with Spring](http://www.baeldung.com/spring-jasper)
\ No newline at end of file
+- [JasperReports with Spring](https://www.baeldung.com/spring-jasper)
+- More articles [[<-- prev]](/libraries)
+
diff --git a/libraries-apache-commons-collections/README.md b/libraries-apache-commons-collections/README.md
new file mode 100644
index 0000000000..998ad1da09
--- /dev/null
+++ b/libraries-apache-commons-collections/README.md
@@ -0,0 +1,13 @@
+## Apache Commons Collections
+
+This module contains articles about Apache Commons Collections
+
+### Relevant articles
+
+- [Apache Commons Collections SetUtils](https://www.baeldung.com/apache-commons-setutils)
+- [Apache Commons Collections OrderedMap](https://www.baeldung.com/apache-commons-ordered-map)
+- [Guide to Apache Commons CircularFifoQueue](https://www.baeldung.com/commons-circular-fifo-queue)
+- [Apache Commons Collections Bag](https://www.baeldung.com/apache-commons-bag)
+- [A Guide to Apache Commons Collections CollectionUtils](https://www.baeldung.com/apache-commons-collection-utils)
+- [Apache Commons Collections BidiMap](https://www.baeldung.com/commons-collections-bidi-map)
+- [Apache Commons Collections MapUtils](https://www.baeldung.com/apache-commons-map-utils)
\ No newline at end of file
diff --git a/libraries-apache-commons-collections/pom.xml b/libraries-apache-commons-collections/pom.xml
new file mode 100644
index 0000000000..eba0ad331e
--- /dev/null
+++ b/libraries-apache-commons-collections/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+ libraries-apache-commons-collections
+ libraries-apache-commons-collections
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons.collections.version}
+
+
+ org.hamcrest
+ java-hamcrest
+ ${org.hamcrest.java-hamcrest.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ 4.1
+ 3.6.2
+ 2.0.0.0
+
+
+
diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Address.java
similarity index 94%
rename from libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java
rename to libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Address.java
index a1e231ec85..02c36a46f9 100644
--- a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java
+++ b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Address.java
@@ -1,4 +1,4 @@
-package com.baeldung.commons.collectionutil;
+package com.baeldung.commons.collections.collectionutils;
public class Address {
diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Customer.java
similarity index 97%
rename from libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java
rename to libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Customer.java
index 1c6a8dc4f1..7d6db68474 100644
--- a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java
+++ b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Customer.java
@@ -1,4 +1,4 @@
-package com.baeldung.commons.collectionutil;
+package com.baeldung.commons.collections.collectionutils;
public class Customer implements Comparable {
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BagUnitTest.java
similarity index 98%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BagUnitTest.java
index ebad4093f0..0877e6d4ac 100644
--- a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java
+++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BagUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.commons.collections4;
+package com.baeldung.commons.collections;
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.SortedBag;
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java
similarity index 100%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java
similarity index 100%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java
similarity index 100%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/circularfifoqueue/CircularFifoQueueUnitTest.java
similarity index 98%
rename from libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/circularfifoqueue/CircularFifoQueueUnitTest.java
index 39384a7442..5664c7b44e 100644
--- a/libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java
+++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/circularfifoqueue/CircularFifoQueueUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.circularfifoqueue;
+package com.baeldung.commons.collections.circularfifoqueue;
import java.util.ArrayList;
import java.util.List;
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils/CollectionUtilsGuideUnitTest.java
similarity index 96%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils/CollectionUtilsGuideUnitTest.java
index 448c5b0729..e9a4612280 100644
--- a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java
+++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils/CollectionUtilsGuideUnitTest.java
@@ -1,7 +1,7 @@
-package com.baeldung.commons.collections;
+package com.baeldung.commons.collections.collectionutils;
-import com.baeldung.commons.collectionutil.Address;
-import com.baeldung.commons.collectionutil.Customer;
+import com.baeldung.commons.collections.collectionutils.Address;
+import com.baeldung.commons.collections.collectionutils.Customer;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.Transformer;
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java
similarity index 97%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java
rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java
index c64143cba7..1ffc4a825f 100644
--- a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java
+++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java
@@ -1,211 +1,211 @@
-package com.baeldung.commons.collections.orderedmap;
-
-import org.apache.commons.collections4.OrderedMap;
-import org.apache.commons.collections4.OrderedMapIterator;
-import org.apache.commons.collections4.map.LinkedMap;
-import org.apache.commons.collections4.map.ListOrderedMap;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-public class OrderedMapUnitTest {
-
- private String[] names = { "Emily", "Mathew", "Rose", "John", "Anna" };
- private Integer[] ages = { 37, 28, 40, 36, 21 };
-
- private int RUNNERS_COUNT = names.length;
-
- private OrderedMap runnersLinkedMap;
- private OrderedMap runnersListOrderedMap;
-
- @Before
- public void createRunners() {
- // First implementation: ListOrderedMap
- this.runnersListOrderedMap = new ListOrderedMap<>();
- this.loadOrderedMapOfRunners(this.runnersListOrderedMap);
-
- // Second implementation: LinkedMap
- this.runnersLinkedMap = new LinkedMap<>();
- this.loadOrderedMapOfRunners(this.runnersLinkedMap);
- }
-
- private void loadOrderedMapOfRunners(OrderedMap runners) {
- for (int i = 0; i < RUNNERS_COUNT; i++) {
- runners.put(this.names[i], this.ages[i]);
- }
- }
-
- @Test
- public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() {
- // Tests that the order in map iterator is the same
- // as defined in the constant arrays of names and ages:
-
- OrderedMapIterator runnersIterator = this.runnersLinkedMap.mapIterator();
- int i = 0;
- while (runnersIterator.hasNext()) {
- runnersIterator.next();
- assertEquals(runnersIterator.getKey(), this.names[i]);
- assertEquals(runnersIterator.getValue(), this.ages[i]);
- i++;
- }
- }
-
- @Test
- public void givenAListOrderedMap_whenIteratedWithMapIterator_thenPreservesOrder() {
- // Tests that the order in map iterator is the same
- // as defined in the constant arrays of names and ages:
-
- OrderedMapIterator runnersIterator = this.runnersListOrderedMap.mapIterator();
- int i = 0;
- while (runnersIterator.hasNext()) {
- runnersIterator.next();
- assertEquals(runnersIterator.getKey(), this.names[i]);
- assertEquals(runnersIterator.getValue(), this.ages[i]);
- i++;
- }
- }
-
- @Test
- public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() {
- // Tests that the order in the forward iteration is the same
- // as defined in the constant arrays of names and ages
-
- String name = this.runnersLinkedMap.firstKey();
- int i = 0;
- while (name != null) {
- assertEquals(name, this.names[i]);
- name = this.runnersLinkedMap.nextKey(name);
- i++;
- }
- }
-
- @Test
- public void givenAListOrderedMap_whenIteratedForwards_thenPreservesOrder() {
- // Tests that the order in the forward iteration is the same
- // as defined in the constant arrays of names and ages
-
- String name = this.runnersListOrderedMap.firstKey();
- int i = 0;
- while (name != null) {
- assertEquals(name, this.names[i]);
- name = this.runnersListOrderedMap.nextKey(name);
- i++;
- }
- }
-
- @Test
- public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() {
- // Tests that the order in the backwards iteration is the same
- // as defined in the constant arrays of names and ages
-
- String name = this.runnersLinkedMap.lastKey();
- int i = RUNNERS_COUNT - 1;
- while (name != null) {
- assertEquals(name, this.names[i]);
- name = this.runnersLinkedMap.previousKey(name);
- i--;
- }
- }
-
- @Test
- public void givenAListOrderedMap_whenIteratedBackwards_thenPreservesOrder() {
- // Tests that the order in the backwards iteration is the same
- // as defined in the constant arrays of names and ages
-
- String name = this.runnersListOrderedMap.lastKey();
- int i = RUNNERS_COUNT - 1;
- while (name != null) {
- assertEquals(name, this.names[i]);
- name = this.runnersListOrderedMap.previousKey(name);
- i--;
- }
- }
-
- @Test
- public void givenALinkedMap_whenObjectIsSearched_thenMatchesConstantArray() {
- assertEquals(ages[4], this.runnersLinkedMap.get("Anna"));
- }
-
- @Test
- public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() {
- // Casting the OrderedMap to a LinkedMap we can use asList() method
-
- LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;
- List listKeys = new ArrayList<>();
- listKeys.addAll(this.runnersLinkedMap.keySet());
- List linkedMap = lmap.asList();
- assertEquals(listKeys, linkedMap);
- }
-
- @Test
- public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() {
- LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;
-
- for (int i = 0; i < RUNNERS_COUNT; i++) {
- // accessed by index:
- String name = lmap.get(i);
- assertEquals(name, this.names[i]);
-
- // index of key concides with position in array
- assertEquals(lmap.indexOf(this.names[i]), i);
- }
- }
-
- @Test
- public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() {
- LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;
- Integer johnAge = lmap.remove("John");// by object
- assertEquals(johnAge, new Integer(36));
- assertEquals(lmap.size(), RUNNERS_COUNT - 1);
-
- Integer emilyAge = lmap.remove(0);// by index
- assertEquals(emilyAge, new Integer(37));
- assertEquals(lmap.size(), RUNNERS_COUNT - 2);
- }
-
- @Test
- public void givenAListOrderedMap_whenObjectIsSearched_thenMatchesConstantArray() {
- assertEquals(ages[4], this.runnersListOrderedMap.get("Anna"));
- }
-
- @Test
- public void givenAListOrderedMap_whenConvertedToList_thenMatchesKeySet() {
- ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap;
- List listKeys = new ArrayList<>();
- listKeys.addAll(this.runnersListOrderedMap.keySet());
- List lomapList = lomap.asList();
- assertEquals(listKeys, lomapList);
- }
-
- @Test
- public void givenAListOrderedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() {
- ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap;
-
- for (int i = 0; i < RUNNERS_COUNT; i++) {
- // accessed by index:
- String name = lomap.get(i);
- assertEquals(name, this.names[i]);
-
- // index of key concides with position in array
- assertEquals(lomap.indexOf(this.names[i]), i);
- }
- }
-
- @Test
- public void givenAListOrderedMap_whenElementRemoved_thenSizeDecrease() {
- ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap;
-
- Integer johnAge = lomap.remove("John");// by object
-
- assertEquals(johnAge, new Integer(36));
- assertEquals(lomap.size(), RUNNERS_COUNT - 1);
-
- Integer emilyAge = lomap.remove(0);// by index
- assertEquals(emilyAge, new Integer(37));
- assertEquals(lomap.size(), RUNNERS_COUNT - 2);
- }
-}
+package com.baeldung.commons.collections.orderedmap;
+
+import org.apache.commons.collections4.OrderedMap;
+import org.apache.commons.collections4.OrderedMapIterator;
+import org.apache.commons.collections4.map.LinkedMap;
+import org.apache.commons.collections4.map.ListOrderedMap;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class OrderedMapUnitTest {
+
+ private String[] names = { "Emily", "Mathew", "Rose", "John", "Anna" };
+ private Integer[] ages = { 37, 28, 40, 36, 21 };
+
+ private int RUNNERS_COUNT = names.length;
+
+ private OrderedMap runnersLinkedMap;
+ private OrderedMap runnersListOrderedMap;
+
+ @Before
+ public void createRunners() {
+ // First implementation: ListOrderedMap
+ this.runnersListOrderedMap = new ListOrderedMap<>();
+ this.loadOrderedMapOfRunners(this.runnersListOrderedMap);
+
+ // Second implementation: LinkedMap
+ this.runnersLinkedMap = new LinkedMap<>();
+ this.loadOrderedMapOfRunners(this.runnersLinkedMap);
+ }
+
+ private void loadOrderedMapOfRunners(OrderedMap runners) {
+ for (int i = 0; i < RUNNERS_COUNT; i++) {
+ runners.put(this.names[i], this.ages[i]);
+ }
+ }
+
+ @Test
+ public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() {
+ // Tests that the order in map iterator is the same
+ // as defined in the constant arrays of names and ages:
+
+ OrderedMapIterator runnersIterator = this.runnersLinkedMap.mapIterator();
+ int i = 0;
+ while (runnersIterator.hasNext()) {
+ runnersIterator.next();
+ assertEquals(runnersIterator.getKey(), this.names[i]);
+ assertEquals(runnersIterator.getValue(), this.ages[i]);
+ i++;
+ }
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenIteratedWithMapIterator_thenPreservesOrder() {
+ // Tests that the order in map iterator is the same
+ // as defined in the constant arrays of names and ages:
+
+ OrderedMapIterator runnersIterator = this.runnersListOrderedMap.mapIterator();
+ int i = 0;
+ while (runnersIterator.hasNext()) {
+ runnersIterator.next();
+ assertEquals(runnersIterator.getKey(), this.names[i]);
+ assertEquals(runnersIterator.getValue(), this.ages[i]);
+ i++;
+ }
+ }
+
+ @Test
+ public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() {
+ // Tests that the order in the forward iteration is the same
+ // as defined in the constant arrays of names and ages
+
+ String name = this.runnersLinkedMap.firstKey();
+ int i = 0;
+ while (name != null) {
+ assertEquals(name, this.names[i]);
+ name = this.runnersLinkedMap.nextKey(name);
+ i++;
+ }
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenIteratedForwards_thenPreservesOrder() {
+ // Tests that the order in the forward iteration is the same
+ // as defined in the constant arrays of names and ages
+
+ String name = this.runnersListOrderedMap.firstKey();
+ int i = 0;
+ while (name != null) {
+ assertEquals(name, this.names[i]);
+ name = this.runnersListOrderedMap.nextKey(name);
+ i++;
+ }
+ }
+
+ @Test
+ public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() {
+ // Tests that the order in the backwards iteration is the same
+ // as defined in the constant arrays of names and ages
+
+ String name = this.runnersLinkedMap.lastKey();
+ int i = RUNNERS_COUNT - 1;
+ while (name != null) {
+ assertEquals(name, this.names[i]);
+ name = this.runnersLinkedMap.previousKey(name);
+ i--;
+ }
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenIteratedBackwards_thenPreservesOrder() {
+ // Tests that the order in the backwards iteration is the same
+ // as defined in the constant arrays of names and ages
+
+ String name = this.runnersListOrderedMap.lastKey();
+ int i = RUNNERS_COUNT - 1;
+ while (name != null) {
+ assertEquals(name, this.names[i]);
+ name = this.runnersListOrderedMap.previousKey(name);
+ i--;
+ }
+ }
+
+ @Test
+ public void givenALinkedMap_whenObjectIsSearched_thenMatchesConstantArray() {
+ assertEquals(ages[4], this.runnersLinkedMap.get("Anna"));
+ }
+
+ @Test
+ public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() {
+ // Casting the OrderedMap to a LinkedMap we can use asList() method
+
+ LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;
+ List listKeys = new ArrayList<>();
+ listKeys.addAll(this.runnersLinkedMap.keySet());
+ List linkedMap = lmap.asList();
+ assertEquals(listKeys, linkedMap);
+ }
+
+ @Test
+ public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() {
+ LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;
+
+ for (int i = 0; i < RUNNERS_COUNT; i++) {
+ // accessed by index:
+ String name = lmap.get(i);
+ assertEquals(name, this.names[i]);
+
+ // index of key concides with position in array
+ assertEquals(lmap.indexOf(this.names[i]), i);
+ }
+ }
+
+ @Test
+ public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() {
+ LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;
+ Integer johnAge = lmap.remove("John");// by object
+ assertEquals(johnAge, new Integer(36));
+ assertEquals(lmap.size(), RUNNERS_COUNT - 1);
+
+ Integer emilyAge = lmap.remove(0);// by index
+ assertEquals(emilyAge, new Integer(37));
+ assertEquals(lmap.size(), RUNNERS_COUNT - 2);
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenObjectIsSearched_thenMatchesConstantArray() {
+ assertEquals(ages[4], this.runnersListOrderedMap.get("Anna"));
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenConvertedToList_thenMatchesKeySet() {
+ ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap;
+ List listKeys = new ArrayList<>();
+ listKeys.addAll(this.runnersListOrderedMap.keySet());
+ List lomapList = lomap.asList();
+ assertEquals(listKeys, lomapList);
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() {
+ ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap;
+
+ for (int i = 0; i < RUNNERS_COUNT; i++) {
+ // accessed by index:
+ String name = lomap.get(i);
+ assertEquals(name, this.names[i]);
+
+ // index of key concides with position in array
+ assertEquals(lomap.indexOf(this.names[i]), i);
+ }
+ }
+
+ @Test
+ public void givenAListOrderedMap_whenElementRemoved_thenSizeDecrease() {
+ ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap;
+
+ Integer johnAge = lomap.remove("John");// by object
+
+ assertEquals(johnAge, new Integer(36));
+ assertEquals(lomap.size(), RUNNERS_COUNT - 1);
+
+ Integer emilyAge = lomap.remove(0);// by index
+ assertEquals(emilyAge, new Integer(37));
+ assertEquals(lomap.size(), RUNNERS_COUNT - 2);
+ }
+}
diff --git a/libraries-apache-commons-io/README.md b/libraries-apache-commons-io/README.md
new file mode 100644
index 0000000000..d5f29499d2
--- /dev/null
+++ b/libraries-apache-commons-io/README.md
@@ -0,0 +1,7 @@
+## Apache Commons Collections
+
+This module contains articles about Apache Commons IO
+
+### Relevant articles
+- [Apache Commons IO](https://www.baeldung.com/apache-commons-io)
+- [Introduction to Apache Commons CSV](https://www.baeldung.com/apache-commons-csv)
diff --git a/libraries-apache-commons-io/pom.xml b/libraries-apache-commons-io/pom.xml
new file mode 100644
index 0000000000..7ec71d8264
--- /dev/null
+++ b/libraries-apache-commons-io/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+ libraries-apache-commons-io
+ libraries-apache-commons-io
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-csv
+ ${commons-csv.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+
+ 1.4
+
+
+
diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java b/libraries-apache-commons-io/src/main/java/com/baeldung/commons/io/FileMonitor.java
similarity index 100%
rename from libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java
rename to libraries-apache-commons-io/src/main/java/com/baeldung/commons/io/FileMonitor.java
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java
similarity index 100%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java
rename to libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java
similarity index 98%
rename from libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java
rename to libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java
index f93e59ed75..b99f4e8bc3 100644
--- a/libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java
+++ b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.commons.csv;
+package com.baeldung.commons.io.csv;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
diff --git a/libraries-apache-commons/src/test/resources/aaa.txt b/libraries-apache-commons-io/src/test/resources/aaa.txt
similarity index 100%
rename from libraries-apache-commons/src/test/resources/aaa.txt
rename to libraries-apache-commons-io/src/test/resources/aaa.txt
diff --git a/libraries-apache-commons/src/test/resources/book.csv b/libraries-apache-commons-io/src/test/resources/book.csv
similarity index 100%
rename from libraries-apache-commons/src/test/resources/book.csv
rename to libraries-apache-commons-io/src/test/resources/book.csv
diff --git a/libraries-apache-commons/src/test/resources/fileTest.txt b/libraries-apache-commons-io/src/test/resources/fileTest.txt
similarity index 100%
rename from libraries-apache-commons/src/test/resources/fileTest.txt
rename to libraries-apache-commons-io/src/test/resources/fileTest.txt
diff --git a/libraries-apache-commons/src/test/resources/sample.txt b/libraries-apache-commons-io/src/test/resources/sample.txt
similarity index 100%
rename from libraries-apache-commons/src/test/resources/sample.txt
rename to libraries-apache-commons-io/src/test/resources/sample.txt
diff --git a/libraries-apache-commons/.gitignore b/libraries-apache-commons/.gitignore
deleted file mode 100644
index e594daf27a..0000000000
--- a/libraries-apache-commons/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.class
-
-# Folders #
-/gensrc
-/target
-
-# Packaged files #
-*.jar
-/bin/
diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md
index 01f2379588..439587266b 100644
--- a/libraries-apache-commons/README.md
+++ b/libraries-apache-commons/README.md
@@ -1,20 +1,15 @@
+## Apache Commons
+
+This module contains articles about Apache Commons libraries.
+
### Relevant articles
-- [Array Processing with Apache Commons Lang 3](http://www.baeldung.com/array-processing-commons-lang)
-- [String Processing with Apache Commons Lang 3](http://www.baeldung.com/string-processing-commons-lang)
-- [Introduction to Apache Commons Math](http://www.baeldung.com/apache-commons-math)
-- [Apache Commons Collections SetUtils](http://www.baeldung.com/apache-commons-setutils)
-- [Apache Commons Collections OrderedMap](http://www.baeldung.com/apache-commons-ordered-map)
-- [Introduction to Apache Commons Text](http://www.baeldung.com/java-apache-commons-text)
-- [A Guide to Apache Commons DbUtils](http://www.baeldung.com/apache-commons-dbutils)
-- [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue)
-- [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain)
-- [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv)
-- [Apache Commons IO](http://www.baeldung.com/apache-commons-io)
-- [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag)
-- [A Guide to Apache Commons Collections CollectionUtils](http://www.baeldung.com/apache-commons-collection-utils)
-- [Apache Commons BeanUtils](http://www.baeldung.com/apache-commons-beanutils)
-- [Apache Commons Collections BidiMap](http://www.baeldung.com/commons-collections-bidi-map)
-- [Apache Commons Collections MapUtils](http://www.baeldung.com/apache-commons-map-utils)
-- [Histograms with Apache Commons Frequency](http://www.baeldung.com/apache-commons-frequency)
-- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3)
\ No newline at end of file
+- [Array Processing with Apache Commons Lang 3](https://www.baeldung.com/array-processing-commons-lang)
+- [String Processing with Apache Commons Lang 3](https://www.baeldung.com/string-processing-commons-lang)
+- [Introduction to Apache Commons Math](https://www.baeldung.com/apache-commons-math)
+- [Introduction to Apache Commons Text](https://www.baeldung.com/java-apache-commons-text)
+- [A Guide to Apache Commons DbUtils](https://www.baeldung.com/apache-commons-dbutils)
+- [Apache Commons Chain](https://www.baeldung.com/apache-commons-chain)
+- [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils)
+- [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency)
+- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3)
diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml
index 05d11d83fe..f83a8c7304 100644
--- a/libraries-apache-commons/pom.xml
+++ b/libraries-apache-commons/pom.xml
@@ -32,21 +32,11 @@
commons-text${commons-text.version}
-
- commons-io
- commons-io
- ${commons-io.version}
- commons-chaincommons-chain${commons-chain.version}
-
- org.apache.commons
- commons-csv
- ${commons-csv.version}
- commons-dbutilscommons-dbutils
@@ -72,18 +62,6 @@
xchart${xchart-version}
-
- org.apache.commons
- commons-collections4
- ${commons.collections.version}
-
-
- org.hamcrest
- java-hamcrest
- ${org.hamcrest.java-hamcrest.version}
- test
-
-
@@ -91,11 +69,8 @@
1.11.9.31.2
- 1.43.6.21.6
- 4.1
- 2.0.0.01.10.L0013.5.23.6
diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md
index 8101138c0e..25d9fe177e 100644
--- a/libraries-data-2/README.md
+++ b/libraries-data-2/README.md
@@ -1,11 +1,16 @@
-### Relevant articles
-- [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink)
-- [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog)
-- [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types)
-- [Introduction to javax.measure](http://www.baeldung.com/javax-measure)
-- [Introduction To Docx4J](http://www.baeldung.com/docx4j)
-- [Interact with Google Sheets from Java](http://www.baeldung.com/google-sheets-java-client)
-- [Introduction To OpenCSV](http://www.baeldung.com/opencsv)
-- [Introduction to Smooks](http://www.baeldung.com/smooks)
-- [A Guide to Infinispan in Java](http://www.baeldung.com/infinispan)
+## Data Libraries
+
+This module contains articles about libraries for data processing in Java.
+
+### Relevant articles
+- [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink)
+- [Guide to the HyperLogLog Algorithm](https://www.baeldung.com/java-hyperloglog)
+- [Introduction to Conflict-Free Replicated Data Types](https://www.baeldung.com/java-conflict-free-replicated-data-types)
+- [Introduction to javax.measure](https://www.baeldung.com/javax-measure)
+- [Introduction To Docx4J](https://www.baeldung.com/docx4j)
+- [Interact with Google Sheets from Java](https://www.baeldung.com/google-sheets-java-client)
+- [Introduction To OpenCSV](https://www.baeldung.com/opencsv)
+- [Introduction to Smooks](https://www.baeldung.com/smooks)
+- [A Guide to Infinispan in Java](https://www.baeldung.com/infinispan)
+- More articles: [[<-- prev>]](/libraries-data)
diff --git a/libraries-data-3/README.md b/libraries-data-3/README.md
index 7f939e7909..6be6eae4a8 100644
--- a/libraries-data-3/README.md
+++ b/libraries-data-3/README.md
@@ -1,5 +1,5 @@
### Relevant articles
-- [Parsing YAML with SnakeYAML](http://www.baeldung.com/java-snake-yaml)
+- [Parsing YAML with SnakeYAML](https://www.baeldung.com/java-snake-yaml)
- [Guide to JMapper](https://www.baeldung.com/jmapper)
- [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
- [Intro to Derive4J](https://www.baeldung.com/derive4j)
diff --git a/libraries-data/README.md b/libraries-data/README.md
index 92c546c258..be8f2b2525 100644
--- a/libraries-data/README.md
+++ b/libraries-data/README.md
@@ -1,16 +1,22 @@
+## Data Libraries
+
+This module contains articles about libraries for data processing in Java.
+
### Relevant articles
-- [Introduction to Reladomo](http://www.baeldung.com/reladomo)
-- [Introduction to ORMLite](http://www.baeldung.com/ormlite)
-- [Introduction To Kryo](http://www.baeldung.com/kryo)
-- [Introduction to KafkaStreams in Java](http://www.baeldung.com/java-kafka-streams)
-- [Guide to Java Data Objects](http://www.baeldung.com/jdo)
-- [Intro to JDO Queries 2/2](http://www.baeldung.com/jdo-queries)
-- [Introduction to HikariCP](http://www.baeldung.com/hikaricp)
-- [Introduction to JCache](http://www.baeldung.com/jcache)
-- [A Guide to Apache Ignite](http://www.baeldung.com/apache-ignite)
-- [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data)
+- [Introduction to Reladomo](https://www.baeldung.com/reladomo)
+- [Introduction to ORMLite](https://www.baeldung.com/ormlite)
+- [Introduction To Kryo](https://www.baeldung.com/kryo)
+- [Introduction to KafkaStreams in Java](https://www.baeldung.com/java-kafka-streams)
+- [Guide to Java Data Objects](https://www.baeldung.com/jdo)
+- [Intro to JDO Queries 2/2](https://www.baeldung.com/jdo-queries)
+- [Introduction to HikariCP](https://www.baeldung.com/hikaricp)
+- [Introduction to JCache](https://www.baeldung.com/jcache)
+- [A Guide to Apache Ignite](https://www.baeldung.com/apache-ignite)
+- [Apache Ignite with Spring Data](https://www.baeldung.com/apache-ignite-spring-data)
- [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch)
- [Intro to Apache Storm](https://www.baeldung.com/apache-storm)
- [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm)
- [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide)
- [Kafka Connect Example with MQTT and MongoDB](https://www.baeldung.com/kafka-connect-mqtt-mongodb)
+- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline)
+- More articles: [[next -->]](/libraries-data-2)
diff --git a/libraries-http/README.md b/libraries-http/README.md
index d5eaed0736..f5afb2d277 100644
--- a/libraries-http/README.md
+++ b/libraries-http/README.md
@@ -1,11 +1,14 @@
+## HTTP
+
+This module contains articles about HTTP libraries.
### Relevant Articles:
-- [A Guide to OkHttp](http://www.baeldung.com/guide-to-okhttp)
-- [A Guide to Google-Http-Client](http://www.baeldung.com/google-http-client)
-- [Asynchronous HTTP with async-http-client in Java](http://www.baeldung.com/async-http-client)
-- [WebSockets with AsyncHttpClient](http://www.baeldung.com/async-http-client-websockets)
-- [Integrating Retrofit with RxJava](http://www.baeldung.com/retrofit-rxjava)
-- [Introduction to Retrofit](http://www.baeldung.com/retrofit)
-- [A Guide to Unirest](http://www.baeldung.com/unirest)
-- [Creating REST Microservices with Javalin](http://www.baeldung.com/javalin-rest-microservices)
\ No newline at end of file
+- [A Guide to OkHttp](https://www.baeldung.com/guide-to-okhttp)
+- [A Guide to Google-Http-Client](https://www.baeldung.com/google-http-client)
+- [Asynchronous HTTP with async-http-client in Java](https://www.baeldung.com/async-http-client)
+- [WebSockets with AsyncHttpClient](https://www.baeldung.com/async-http-client-websockets)
+- [Integrating Retrofit with RxJava](https://www.baeldung.com/retrofit-rxjava)
+- [Introduction to Retrofit](https://www.baeldung.com/retrofit)
+- [A Guide to Unirest](https://www.baeldung.com/unirest)
+- [Creating REST Microservices with Javalin](https://www.baeldung.com/javalin-rest-microservices)
diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml
index 12fc35c1b5..cddb3ab1fe 100644
--- a/libraries-primitive/pom.xml
+++ b/libraries-primitive/pom.xml
@@ -9,9 +9,14 @@
1.0-SNAPSHOTlibraries-primitive
+
+ 1.8
+ 1.8
+
+
-
-
+
+ it.unimi.dsifastutil8.2.2
@@ -36,5 +41,18 @@
1.19test
+
+
+ org.eclipse.collections
+ eclipse-collections-api
+ 10.0.0
+
+
+
+ org.eclipse.collections
+ eclipse-collections
+ 10.0.0
+
+
-
+
\ No newline at end of file
diff --git a/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java b/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java
new file mode 100644
index 0000000000..2adecd37fc
--- /dev/null
+++ b/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java
@@ -0,0 +1,70 @@
+package com.baeldung;
+
+import org.eclipse.collections.api.list.primitive.ImmutableIntList;
+import org.eclipse.collections.api.list.primitive.MutableLongList;
+import org.eclipse.collections.api.map.primitive.MutableIntIntMap;
+import org.eclipse.collections.api.set.primitive.MutableIntSet;
+import org.eclipse.collections.impl.factory.primitive.*;
+import org.eclipse.collections.impl.list.Interval;
+import org.eclipse.collections.impl.list.primitive.IntInterval;
+import org.eclipse.collections.impl.map.mutable.primitive.IntIntHashMap;
+import org.junit.Test;
+
+import java.util.stream.DoubleStream;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class PrimitiveCollectionsUnitTest {
+
+ @Test
+ public void whenListOfLongHasOneTwoThree_thenSumIsSix() {
+ MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
+ assertEquals(6, longList.sum());
+ }
+
+ @Test
+ public void whenListOfIntHasOneTwoThree_thenMaxIsThree() {
+ ImmutableIntList intList = IntLists.immutable.of(1, 2, 3);
+ assertEquals(3, intList.max());
+ }
+
+ @Test
+ public void whenConvertFromIterableToPrimitive_thenValuesAreEquals() {
+ Iterable iterable = Interval.oneTo(3);
+ MutableIntSet intSet = IntSets.mutable.withAll(iterable);
+ IntInterval intInterval = IntInterval.oneTo(3);
+ assertEquals(intInterval.toSet(), intSet);
+ }
+
+ @Test
+ public void testOperationsOnIntIntMap() {
+ MutableIntIntMap map = new IntIntHashMap();
+ assertEquals(5, map.addToValue(0, 5));
+ assertEquals(5, map.get(0));
+ assertEquals(3, map.getIfAbsentPut(1, 3));
+ }
+
+ @Test
+ public void whenCreateDoubleStream_thenAverageIsThree() {
+ DoubleStream doubleStream = DoubleLists
+ .mutable.with(1.0, 2.0, 3.0, 4.0, 5.0)
+ .primitiveStream();
+ assertEquals(3, doubleStream.average().getAsDouble(), 0.001);
+ }
+
+ @Test
+ public void whenCreateMapFromStream_thenValuesMustMatch() {
+ Iterable integers = Interval.oneTo(3);
+ MutableIntIntMap map =
+ IntIntMaps.mutable.from(
+ integers,
+ key -> key,
+ value -> value * value);
+ MutableIntIntMap expected = IntIntMaps.mutable.empty()
+ .withKeyValue(1, 1)
+ .withKeyValue(2, 4)
+ .withKeyValue(3, 9);
+ assertEquals(expected, map);
+ }
+}
\ No newline at end of file
diff --git a/libraries-security/README.md b/libraries-security/README.md
index 96f3fcdac6..68badcf12d 100644
--- a/libraries-security/README.md
+++ b/libraries-security/README.md
@@ -1,3 +1,7 @@
+## Security
+
+This module contains articles about security libraries.
+
### Relevant Articles:
- [Guide to ScribeJava](https://www.baeldung.com/scribejava)
diff --git a/libraries-server/README.md b/libraries-server/README.md
index b5392f5883..d9e6b8b206 100644
--- a/libraries-server/README.md
+++ b/libraries-server/README.md
@@ -1,11 +1,15 @@
-## Relevant Articles:
+## Server
-- [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded)
-- [Introduction to Netty](http://www.baeldung.com/netty)
-- [Exceptions in Netty](http://www.baeldung.com/netty-exception-handling)
-- [Programmatically Create, Configure and Run a Tomcat Server](http://www.baeldung.com/tomcat-programmatic-setup)
-- [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic)
-- [Testing Netty with EmbeddedChannel](http://www.baeldung.com/testing-netty-embedded-channel)
+This module contains articles about server libraries.
+
+### Relevant Articles:
+
+- [Embedded Jetty Server in Java](https://www.baeldung.com/jetty-embedded)
+- [Introduction to Netty](https://www.baeldung.com/netty)
+- [Exceptions in Netty](https://www.baeldung.com/netty-exception-handling)
+- [Programmatically Create, Configure and Run a Tomcat Server](https://www.baeldung.com/tomcat-programmatic-setup)
+- [Creating and Configuring Jetty 9 Server in Java](https://www.baeldung.com/jetty-java-programmatic)
+- [Testing Netty with EmbeddedChannel](https://www.baeldung.com/testing-netty-embedded-channel)
- [MQTT Client in Java](https://www.baeldung.com/java-mqtt-client)
- [Guide to XMPP Smack Client](https://www.baeldung.com/xmpp-smack-chat-client)
- [A Guide to NanoHTTPD](https://www.baeldung.com/nanohttpd)
diff --git a/libraries-testing/README.md b/libraries-testing/README.md
index 6b25a3b875..332debfe18 100644
--- a/libraries-testing/README.md
+++ b/libraries-testing/README.md
@@ -1,8 +1,13 @@
+## Testing
+
+This module contains articles about test libraries.
+
### Relevant articles
-- [Introduction to Serenity BDD](http://www.baeldung.com/serenity-bdd)
-- [Introduction to JSONassert](http://www.baeldung.com/jsonassert)
-- [Serenity BDD and Screenplay](http://www.baeldung.com/serenity-screenplay)
-- [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave)
-- [Introduction to Awaitlity](http://www.baeldung.com/awaitlity-testing)
-- [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly)
\ No newline at end of file
+- [Introduction to Serenity BDD](https://www.baeldung.com/serenity-bdd)
+- [Introduction to JSONassert](https://www.baeldung.com/jsonassert)
+- [Serenity BDD and Screenplay](https://www.baeldung.com/serenity-screenplay)
+- [Serenity BDD with Spring and JBehave](https://www.baeldung.com/serenity-spring-jbehave)
+- [Introduction to Awaitlity](https://www.baeldung.com/awaitlity-testing)
+- [Introduction to Hoverfly in Java](https://www.baeldung.com/hoverfly)
+- [Testing with Hamcrest](https://www.baeldung.com/java-junit-hamcrest-guide)
diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml
index 8f7a27bbfa..a2fbed31b2 100644
--- a/libraries-testing/pom.xml
+++ b/libraries-testing/pom.xml
@@ -43,6 +43,12 @@
serenity-rest-assured${serenity.version}test
+
+
+ io.rest-assured
+ rest-assured
+
+ net.serenity-bdd
@@ -112,6 +118,13 @@
assertj-core${assertj.version}
+
+
+ org.hamcrest
+ java-hamcrest
+ ${java-hamcrest.version}
+ test
+ net.serenity-bdd
@@ -155,16 +168,17 @@
- 1.9.26
- 1.41.0
+ 1.9.9
+ 1.9.01.9.01.9.271.5.03.0.00.8.14.3.8.RELEASE
- 3.0.3
+ 4.1.13.6.2
+ 2.0.0.0
diff --git a/guava/src/test/java/org/baeldung/hamcrest/Animal.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java
similarity index 94%
rename from guava/src/test/java/org/baeldung/hamcrest/Animal.java
rename to libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java
index 1a0266f5a3..1d37eef59b 100644
--- a/guava/src/test/java/org/baeldung/hamcrest/Animal.java
+++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java
@@ -1,4 +1,4 @@
-package org.baeldung.hamcrest;
+package com.baeldung.hamcrest;
public class Animal {
String name;
diff --git a/guava/src/test/java/org/baeldung/hamcrest/Cat.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java
similarity index 82%
rename from guava/src/test/java/org/baeldung/hamcrest/Cat.java
rename to libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java
index 892e5b6e30..b15a3628da 100644
--- a/guava/src/test/java/org/baeldung/hamcrest/Cat.java
+++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java
@@ -1,4 +1,4 @@
-package org.baeldung.hamcrest;
+package com.baeldung.hamcrest;
public class Cat extends Animal {
diff --git a/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherUnitTest.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java
similarity index 99%
rename from guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherUnitTest.java
rename to libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java
index cf9fde7114..f5887ba79b 100644
--- a/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherUnitTest.java
+++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java
@@ -1,10 +1,10 @@
-package org.baeldung.hamcrest;
+package com.baeldung.hamcrest;
import org.junit.Test;
import java.util.*;
-import static org.baeldung.hamcrest.IsPositiveInteger.isAPositiveInteger;
+import static com.baeldung.hamcrest.IsPositiveInteger.isAPositiveInteger;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.beans.HasProperty.hasProperty;
diff --git a/guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java
similarity index 94%
rename from guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java
rename to libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java
index 0d8d262538..4d2ef8a8e5 100644
--- a/guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java
+++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java
@@ -1,4 +1,4 @@
-package org.baeldung.hamcrest;
+package com.baeldung.hamcrest;
import org.hamcrest.Description;
import org.hamcrest.Factory;
diff --git a/guava/src/test/java/org/baeldung/hamcrest/Person.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java
similarity index 94%
rename from guava/src/test/java/org/baeldung/hamcrest/Person.java
rename to libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java
index 0053c98043..417daa866e 100644
--- a/guava/src/test/java/org/baeldung/hamcrest/Person.java
+++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java
@@ -1,4 +1,4 @@
-package org.baeldung.hamcrest;
+package com.baeldung.hamcrest;
public class Person {
String name;
diff --git a/libraries/README.md b/libraries/README.md
index ebf087ccd8..627c30e75a 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -1,45 +1,49 @@
+## Libraries
+
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
### Relevant articles
-- [Introduction to Javatuples](http://www.baeldung.com/java-tuples)
-- [Introduction to Javassist](http://www.baeldung.com/javassist)
-- [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink)
-- [Intro to JaVers](http://www.baeldung.com/javers)
-- [Merging Streams in Java](http://www.baeldung.com/java-merge-streams)
-- [Introduction to Quartz](http://www.baeldung.com/quartz)
-- [How to Warm Up the JVM](http://www.baeldung.com/java-jvm-warmup)
-- [Software Transactional Memory in Java Using Multiverse](http://www.baeldung.com/java-multiverse-stm)
-- [Locality-Sensitive Hashing in Java Using Java-LSH](http://www.baeldung.com/locality-sensitive-hashing)
-- [Introduction to Neuroph](http://www.baeldung.com/neuroph)
-- [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss)
-- [Introduction to PCollections](http://www.baeldung.com/java-pcollections)
-- [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections)
-- [DistinctBy in the Java Stream API](http://www.baeldung.com/java-streams-distinct-by)
-- [Introduction to NoException](http://www.baeldung.com/no-exception)
-- [Spring Yarg Integration](http://www.baeldung.com/spring-yarg)
-- [Delete a Directory Recursively in Java](http://www.baeldung.com/java-delete-directory)
-- [Guide to JDeferred](http://www.baeldung.com/jdeferred)
-- [Introduction to MBassador](http://www.baeldung.com/mbassador)
-- [Using Pairs in Java](http://www.baeldung.com/java-pairs)
-- [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine)
-- [Introduction to StreamEx](http://www.baeldung.com/streamex)
-- [A Docker Guide for Java](http://www.baeldung.com/docker-java-api)
-- [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java)
-- [A Guide to Byte Buddy](http://www.baeldung.com/byte-buddy)
-- [Introduction to jOOL](http://www.baeldung.com/jool)
-- [Consumer Driven Contracts with Pact](http://www.baeldung.com/pact-junit-consumer-driven-contracts)
-- [Introduction to Atlassian Fugue](http://www.baeldung.com/java-fugue)
-- [Publish and Receive Messages with Nats Java Client](http://www.baeldung.com/nats-java-client)
-- [Java Concurrency Utility with JCTools](http://www.baeldung.com/java-concurrency-jc-tools)
-- [Introduction to JavaPoet](http://www.baeldung.com/java-poet)
-- [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date)
-- [Guide to Resilience4j](http://www.baeldung.com/resilience4j)
+- [Introduction to Javatuples](https://www.baeldung.com/java-tuples)
+- [Introduction to Javassist](https://www.baeldung.com/javassist)
+- [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink)
+- [Intro to JaVers](https://www.baeldung.com/javers)
+- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams)
+- [Introduction to Quartz](https://www.baeldung.com/quartz)
+- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup)
+- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
+- [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
+- [Introduction to Neuroph](https://www.baeldung.com/neuroph)
+- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
+- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
+- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
+- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
+- [Introduction to NoException](https://www.baeldung.com/no-exception)
+- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
+- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
+- [Guide to JDeferred](https://www.baeldung.com/jdeferred)
+- [Introduction to MBassador](https://www.baeldung.com/mbassador)
+- [Using Pairs in Java](https://www.baeldung.com/java-pairs)
+- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
+- [Introduction to StreamEx](https://www.baeldung.com/streamex)
+- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
+- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
+- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
+- [Introduction to jOOL](https://www.baeldung.com/jool)
+- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
+- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
+- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
+- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
+- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
+- [Convert String to Date in Java](https://www.baeldung.com/java-string-to-date)
+- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
-- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client)
+- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
-
-The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
-
-The code examples related to different libraries should go in a new package.
-
-Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+- More articles [[next -->]](/libraries-2)
diff --git a/libraries/pom.xml b/libraries/pom.xml
index a8ded19a1e..9511563817 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -579,7 +579,7 @@
org.asciidoctorasciidoctor-maven-plugin
- 1.5.7.1
+ ${asciidoctor-maven-plugin.version}
@@ -789,6 +789,7 @@
2.7.13.60.9.11
+ 1.5.7.1
diff --git a/linkrest/README.md b/linkrest/README.md
index 33cf930b18..5402d9db96 100644
--- a/linkrest/README.md
+++ b/linkrest/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## LinkRest
-- [Guide to LinkRest](http://www.baeldung.com/linkrest)
+This module contains articles about LinkRest.
+
+### Relevant articles:
+
+- [Guide to LinkRest](https://www.baeldung.com/linkrest)
diff --git a/linux-bash/loops/src/main/bash/find_directories.sh b/linux-bash/loops/src/main/bash/find_directories.sh
new file mode 100755
index 0000000000..8a9b20294d
--- /dev/null
+++ b/linux-bash/loops/src/main/bash/find_directories.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
+
+find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
+ echo "$dir"
+done
+
+find . -maxdepth 1 -type d -exec echo {} \;
\ No newline at end of file
diff --git a/linux-bash/loops/src/main/bash/loop_directories.sh b/linux-bash/loops/src/main/bash/loop_directories.sh
new file mode 100755
index 0000000000..77e661d710
--- /dev/null
+++ b/linux-bash/loops/src/main/bash/loop_directories.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+for dir in */; do
+ echo "$dir"
+done
+
+for file in *; do
+ if [ -d "$file" ]; then
+ echo "$file"
+ fi
+done
\ No newline at end of file
diff --git a/linux-bash/text/src/main/bash/remove_characters.sh b/linux-bash/text/src/main/bash/remove_characters.sh
new file mode 100755
index 0000000000..a8f51468f4
--- /dev/null
+++ b/linux-bash/text/src/main/bash/remove_characters.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+my_var="Hola Mundo"
+echo ${my_var}
+
+my_filename="interesting-text-file.txt"
+echo ${my_filename:0:21}
+
+echo ${my_filename%.*}
+
+complicated_filename="hello-world.tar.gz"
+echo ${complicated_filename%%.*}
+
+echo ${my_filename/.*/}
+
+echo 'interesting-text-file.txt' | sed 's/.txt*//'
+
+echo 'interesting-text-file.txt' | cut -f1 -d"."
+echo ${complicated_filename} | cut -f1 -d"."
diff --git a/logging-modules/README.md b/logging-modules/README.md
index 17405847b1..b763f6baaf 100644
--- a/logging-modules/README.md
+++ b/logging-modules/README.md
@@ -1,7 +1,8 @@
-
## Logging Modules
+This module contains articles about logging libraries.
+
### Relevant Articles:
-- [Creating a Custom Logback Appender](http://www.baeldung.com/custom-logback-appender)
-- [A Guide To Logback](http://www.baeldung.com/logback)
+- [Creating a Custom Logback Appender](https://www.baeldung.com/custom-logback-appender)
+- [A Guide To Logback](https://www.baeldung.com/logback)
diff --git a/logging-modules/flogger/pom.xml b/logging-modules/flogger/pom.xml
new file mode 100644
index 0000000000..0bba719616
--- /dev/null
+++ b/logging-modules/flogger/pom.xml
@@ -0,0 +1,66 @@
+
+
+
+ logging-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ flogger
+
+
+
+ com.google.flogger
+ flogger
+ 0.4
+
+
+
+ com.google.flogger
+ flogger-system-backend
+ 0.4
+ runtime
+
+
+
+ com.google.flogger
+ flogger-slf4j-backend
+ 0.4
+
+
+
+ com.google.flogger
+ flogger-log4j-backend
+ 0.4
+
+
+ com.sun.jmx
+ jmxri
+
+
+ com.sun.jdmk
+ jmxtools
+
+
+ javax.jms
+ jms
+
+
+
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+ log4j
+ apache-log4j-extras
+ 1.2.17
+
+
+
+
\ No newline at end of file
diff --git a/logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java b/logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java
new file mode 100644
index 0000000000..252d2d38e4
--- /dev/null
+++ b/logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java
@@ -0,0 +1,17 @@
+package com.baeldung.flogger;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.flogger.LoggerConfig;
+
+import java.util.logging.Level;
+
+public class FloggerExamples {
+
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+ public static void main(String[] args) {
+ LoggerConfig.of(logger).setLevel(Level.FINE);
+ Exception exception = new Exception("This is a test exception.");
+ logger.atInfo().withCause(exception).log("Log message with: %s", "Alfred");
+ }
+}
diff --git a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java
new file mode 100644
index 0000000000..80fa0edd96
--- /dev/null
+++ b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.flogger;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.flogger.LoggerConfig;
+import com.google.common.flogger.StackSize;
+import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.stream.IntStream;
+
+import static com.google.common.flogger.LazyArgs.lazy;
+
+public class FloggerIntegrationTest {
+ static {
+// System.setProperty("flogger.backend_factory", "com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance");
+ System.setProperty("flogger.backend_factory", "com.google.common.flogger.backend.slf4j.Slf4jBackendFactory#getInstance");
+ }
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+ @Test
+ public void givenAnInterval_shouldLogAfterEveryInterval() {
+ IntStream.range(0, 100).forEach(value -> {
+ logger.atInfo().every(40).log("This log shows [every 40 iterations] => %d", value);
+ });
+ }
+
+ @Test
+ public void givenATimeInterval_shouldLogAfterEveryTimeInterval() {
+ IntStream.range(0, 1_000_0000).forEach(value -> {
+ logger.atInfo().atMostEvery(10, TimeUnit.SECONDS).log("This log shows [every 10 seconds] => %d", value);
+ });
+ }
+
+ @Test
+ public void givenAnObject_shouldLogTheObject() {
+ User user = new User();
+ logger.atInfo().log("The user is: %s", user); //correct
+
+ //The following ways of logging are not recommended
+ logger.atInfo().log("The user is: %s", user.toString());
+ logger.atInfo().log("The user is: %s" + user);
+ }
+
+ @Test
+ public void givenASimpleOperation_shouldLogTheResult() {
+ int result = 45 / 3;
+ logger.atInfo().log("The result is %d", result);
+ }
+
+ @Test
+ public void givenCodeThatThrowsAndException_shouldLogTheException() {
+ try {
+ int result = 45 / 0;
+ } catch (RuntimeException re) {
+ logger.atInfo().withStackTrace(StackSize.FULL).withCause(re).log("Message");
+ }
+ }
+
+ @Test
+ public void givenALoggingConfiguration_shouldLogAtTheConfiguredLevel() {
+ LoggerConfig.of(logger).setLevel(Level.FINE);
+ logger.atInfo().log("Info Message");
+ logger.atWarning().log("Warning Message");
+ logger.atSevere().log("Severe Message");
+ logger.atFinest().log("Finest Message");
+ logger.atFine().log("Fine Message");
+ logger.atFiner().log("Finer Message");
+ logger.atConfig().log("Config Message");
+ }
+
+ @Test
+ public void givenALongRunningMethodForStats_shouldCallTheMethodLazily() {
+ //Wrong way of doing it
+ logger.atFine().log("stats=%s", collectSummaries());
+
+ // Almost no work done at the log site and structure is preserved.
+ logger.atFine().log("stats=%s", lazy(() -> collectSummaries()));
+ }
+
+ public static String collectSummaries() {
+ //compute summaries in a long-running process
+ int items = 110;
+ int s = 30;
+ return String.format("%d seconds elapsed so far. %d items pending processing", s, items);
+ }
+
+ private class User {
+ String name = "Test";
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+}
diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java
new file mode 100644
index 0000000000..53592082b6
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java
@@ -0,0 +1,18 @@
+package com.baeldung.logging.log4j2;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+
+public class Log4j2ComparisonSysout {
+
+ public static void main(String[] args) throws FileNotFoundException {
+ PrintStream outStream = new PrintStream(new File("outFile.txt"));
+ System.setOut(outStream);
+ System.out.println("This is a baeldung article");
+
+ PrintStream errStream = new PrintStream(new File("errFile.txt"));
+ System.setErr(errStream);
+ System.err.println("This is a baeldung article error");
+ }
+}
diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java
new file mode 100644
index 0000000000..b870924cf3
--- /dev/null
+++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java
@@ -0,0 +1,19 @@
+package com.baeldung.logging.log4j2;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+
+public class Log4j2Example {
+
+ private static final Logger logger = LogManager.getLogger(Log4j2Example.class);
+
+ public static void main(String[] args) {
+ logger.debug("Debug log message");
+ logger.info("Info log message");
+ logger.error("Error log message");
+ logger.warn("Warn log message");
+ logger.fatal("Fatal log message");
+ logger.trace("Trace log message");
+ }
+
+}
diff --git a/logging-modules/log4j2/src/test/resources/log4j2.xml b/logging-modules/log4j2/src/test/resources/log4j2.xml
index 246ffb0707..ee26bcecf2 100644
--- a/logging-modules/log4j2/src/test/resources/log4j2.xml
+++ b/logging-modules/log4j2/src/test/resources/log4j2.xml
@@ -5,8 +5,7 @@
-
+
diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml
index a303e50ff1..927afb6ca9 100644
--- a/logging-modules/pom.xml
+++ b/logging-modules/pom.xml
@@ -18,6 +18,7 @@
log4j2logbacklog-mdc
+ flogger
diff --git a/lombok/README.md b/lombok/README.md
index 4ff7ca7921..54a0984159 100644
--- a/lombok/README.md
+++ b/lombok/README.md
@@ -1,6 +1,6 @@
## Relevant Articles:
-- [Introduction to Project Lombok](http://www.baeldung.com/intro-to-project-lombok)
-- [Using Lombok’s @Builder Annotation](http://www.baeldung.com/lombok-builder)
+- [Introduction to Project Lombok](https://www.baeldung.com/intro-to-project-lombok)
+- [Using Lombok’s @Builder Annotation](https://www.baeldung.com/lombok-builder)
- [Using Lombok’s @Getter for Boolean Fields](https://www.baeldung.com/lombok-getter-boolean)
- [Lombok @Builder with Inheritance](https://www.baeldung.com/lombok-builder-inheritance)
- [Lombok Builder with Default Value](https://www.baeldung.com/lombok-builder-default-value)
diff --git a/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java b/lombok/src/main/java/com/baeldung/lombok/intro/GetterLazy.java
similarity index 96%
rename from lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java
rename to lombok/src/main/java/com/baeldung/lombok/intro/GetterLazy.java
index 604c45be3b..8397aeb759 100644
--- a/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java
+++ b/lombok/src/main/java/com/baeldung/lombok/intro/GetterLazy.java
@@ -1,4 +1,4 @@
-package com.baeldung.lombok.getter;
+package com.baeldung.lombok.intro;
import java.util.HashMap;
import java.util.List;
diff --git a/lucene/README.md b/lucene/README.md
index ea7f715480..2bfd8bf4e1 100644
--- a/lucene/README.md
+++ b/lucene/README.md
@@ -1,5 +1,5 @@
### Relevant Articles:
-- [Introduction to Apache Lucene](http://www.baeldung.com/lucene)
-- [A Simple File Search with Lucene](http://www.baeldung.com/lucene-file-search)
+- [Introduction to Apache Lucene](https://www.baeldung.com/lucene)
+- [A Simple File Search with Lucene](https://www.baeldung.com/lucene-file-search)
- [Guide to Lucene Analyzers](https://www.baeldung.com/lucene-analyzers)
diff --git a/mapstruct/README.md b/mapstruct/README.md
index e279a48f7a..92c55a131d 100644
--- a/mapstruct/README.md
+++ b/mapstruct/README.md
@@ -1,2 +1,2 @@
###Relevant Articles:
-- [Quick Guide to MapStruct](http://www.baeldung.com/mapstruct)
+- [Quick Guide to MapStruct](https://www.baeldung.com/mapstruct)
diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml
index 0493775f85..e98c4a318b 100644
--- a/mapstruct/pom.xml
+++ b/mapstruct/pom.xml
@@ -35,6 +35,12 @@
lombok${org.projectlombok.version}
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
@@ -65,11 +71,12 @@
- 1.3.0.Beta2
+ 1.3.0.Final4.3.4.RELEASE1.81.81.18.4
+ 3.11.1
diff --git a/mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java b/mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java
new file mode 100644
index 0000000000..617f2c6e0c
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java
@@ -0,0 +1,25 @@
+package com.baeldung.dto;
+
+public class CustomerDto {
+
+ private String forename;
+ private String surname;
+
+ public String getForename() {
+ return forename;
+ }
+
+ public CustomerDto setForename(String forename) {
+ this.forename = forename;
+ return this;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public CustomerDto setSurname(String surname) {
+ this.surname = surname;
+ return this;
+ }
+}
diff --git a/mapstruct/src/main/java/com/baeldung/dto/UserBodyImperialValuesDTO.java b/mapstruct/src/main/java/com/baeldung/dto/UserBodyImperialValuesDTO.java
new file mode 100644
index 0000000000..9817b76bc8
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/dto/UserBodyImperialValuesDTO.java
@@ -0,0 +1,11 @@
+package com.baeldung.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class UserBodyImperialValuesDTO {
+ private int inch;
+ private int pound;
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/entity/Address.java b/mapstruct/src/main/java/com/baeldung/entity/Address.java
new file mode 100644
index 0000000000..4a6edbd75d
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/entity/Address.java
@@ -0,0 +1,35 @@
+package com.baeldung.entity;
+
+public class Address {
+
+ private String street;
+ private String postalcode;
+ private String county;
+
+ public String getStreet() {
+ return street;
+ }
+
+ public Address setStreet(String street) {
+ this.street = street;
+ return this;
+ }
+
+ public String getPostalcode() {
+ return postalcode;
+ }
+
+ public Address setPostalcode(String postalcode) {
+ this.postalcode = postalcode;
+ return this;
+ }
+
+ public String getCounty() {
+ return county;
+ }
+
+ public Address setCounty(String county) {
+ this.county = county;
+ return this;
+ }
+}
diff --git a/mapstruct/src/main/java/com/baeldung/entity/Customer.java b/mapstruct/src/main/java/com/baeldung/entity/Customer.java
new file mode 100644
index 0000000000..cdde6b542a
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/entity/Customer.java
@@ -0,0 +1,25 @@
+package com.baeldung.entity;
+
+public class Customer {
+
+ private String firstName;
+ private String lastName;
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public Customer setFirstName(String firstName) {
+ this.firstName = firstName;
+ return this;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public Customer setLastName(String lastName) {
+ this.lastName = lastName;
+ return this;
+ }
+}
diff --git a/mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java b/mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java
new file mode 100644
index 0000000000..084c5f86ef
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java
@@ -0,0 +1,55 @@
+package com.baeldung.entity;
+
+public class DeliveryAddress {
+
+ private String forename;
+ private String surname;
+ private String street;
+ private String postalcode;
+ private String county;
+
+ public String getForename() {
+ return forename;
+ }
+
+ public DeliveryAddress setForename(String forename) {
+ this.forename = forename;
+ return this;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public DeliveryAddress setSurname(String surname) {
+ this.surname = surname;
+ return this;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public DeliveryAddress setStreet(String street) {
+ this.street = street;
+ return this;
+ }
+
+ public String getPostalcode() {
+ return postalcode;
+ }
+
+ public DeliveryAddress setPostalcode(String postalcode) {
+ this.postalcode = postalcode;
+ return this;
+ }
+
+ public String getCounty() {
+ return county;
+ }
+
+ public DeliveryAddress setCounty(String county) {
+ this.county = county;
+ return this;
+ }
+}
diff --git a/mapstruct/src/main/java/com/baeldung/entity/UserBodyValues.java b/mapstruct/src/main/java/com/baeldung/entity/UserBodyValues.java
new file mode 100644
index 0000000000..b23463cb93
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/entity/UserBodyValues.java
@@ -0,0 +1,11 @@
+package com.baeldung.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class UserBodyValues {
+ private double kilogram;
+ private double centimeter;
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java
new file mode 100644
index 0000000000..2c84f80167
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java
@@ -0,0 +1,15 @@
+package com.baeldung.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import com.baeldung.dto.CustomerDto;
+import com.baeldung.entity.Customer;
+
+@Mapper
+public interface CustomerDtoMapper {
+
+ @Mapping(source = "firstName", target = "forename")
+ @Mapping(source = "lastName", target = "surname")
+ CustomerDto from(Customer customer);
+}
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java
new file mode 100644
index 0000000000..6a337fbb9e
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java
@@ -0,0 +1,24 @@
+package com.baeldung.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.MappingTarget;
+
+import com.baeldung.entity.Address;
+import com.baeldung.entity.Customer;
+import com.baeldung.entity.DeliveryAddress;
+
+@Mapper
+public interface DeliveryAddressMapper {
+
+ @Mapping(source = "customer.firstName", target = "forename")
+ @Mapping(source = "customer.lastName", target = "surname")
+ @Mapping(source = "address.street", target = "street")
+ @Mapping(source = "address.postalcode", target = "postalcode")
+ @Mapping(source = "address.county", target = "county")
+ DeliveryAddress from(Customer customer, Address address);
+
+ @Mapping(source = "address.postalcode", target = "postalcode")
+ @Mapping(source = "address.county", target = "county")
+ DeliveryAddress updateAddress(@MappingTarget DeliveryAddress deliveryAddress, Address address);
+}
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/PoundToKilogramMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/PoundToKilogramMapper.java
new file mode 100644
index 0000000000..e75022a5e8
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/PoundToKilogramMapper.java
@@ -0,0 +1,13 @@
+package com.baeldung.mapper;
+
+import org.mapstruct.Qualifier;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Qualifier
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.CLASS)
+public @interface PoundToKilogramMapper {}
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java
new file mode 100644
index 0000000000..4c992f91e1
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java
@@ -0,0 +1,28 @@
+package com.baeldung.mapper;
+
+import com.baeldung.dto.UserBodyImperialValuesDTO;
+import com.baeldung.entity.UserBodyValues;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface UserBodyValuesMapper {
+
+ UserBodyValuesMapper INSTANCE = Mappers.getMapper(UserBodyValuesMapper.class);
+
+ @Mapping(source = "pound", target = "kilogram", qualifiedBy = PoundToKilogramMapper.class)
+ @Mapping(source = "inch", target = "centimeter", qualifiedByName = "inchToCentimeter")
+ public UserBodyValues userBodyValuesMapper(UserBodyImperialValuesDTO dto);
+
+ @Named("inchToCentimeter")
+ public static double inchToCentimeter(int inch) {
+ return inch * 2.54;
+ }
+
+ @PoundToKilogramMapper
+ public static double poundToKilogram(int pound) {
+ return pound * 0.4535;
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java
new file mode 100644
index 0000000000..8f324f5a15
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java
@@ -0,0 +1,23 @@
+package com.baeldung.unmappedproperties.dto;
+
+public class CarDTO {
+ private int id;
+ private String name;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java
new file mode 100644
index 0000000000..8df306eb13
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java
@@ -0,0 +1,52 @@
+package com.baeldung.unmappedproperties.dto;
+
+import java.util.List;
+
+public class DocumentDTO {
+ private int id;
+ private String title;
+ private String text;
+ private List comments;
+ private String author;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public List getComments() {
+ return comments;
+ }
+
+ public void setComments(List comments) {
+ this.comments = comments;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java
new file mode 100644
index 0000000000..c23ced3a6a
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java
@@ -0,0 +1,23 @@
+package com.baeldung.unmappedproperties.entity;
+
+public class Car {
+ private int id;
+ private String name;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java
new file mode 100644
index 0000000000..89457133a3
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java
@@ -0,0 +1,42 @@
+package com.baeldung.unmappedproperties.entity;
+
+import java.util.Date;
+
+public class Document {
+ private int id;
+ private String title;
+ private String text;
+ private Date modificationTime;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public Date getModificationTime() {
+ return modificationTime;
+ }
+
+ public void setModificationTime(Date modificationTime) {
+ this.modificationTime = modificationTime;
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java
new file mode 100644
index 0000000000..714301b811
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java
@@ -0,0 +1,13 @@
+package com.baeldung.unmappedproperties.mapper;
+
+import com.baeldung.unmappedproperties.dto.CarDTO;
+import com.baeldung.unmappedproperties.entity.Car;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface CarMapper {
+ CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
+
+ CarDTO carToCarDTO(Car car);
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java
new file mode 100644
index 0000000000..fe233ed172
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java
@@ -0,0 +1,16 @@
+package com.baeldung.unmappedproperties.mapper;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface DocumentMapper {
+
+ DocumentMapper INSTANCE = Mappers.getMapper(DocumentMapper.class);
+
+ DocumentDTO documentToDocumentDTO(Document entity);
+
+ Document documentDTOToDocument(DocumentDTO dto);
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java
new file mode 100644
index 0000000000..bf3b0b49c4
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java
@@ -0,0 +1,20 @@
+package com.baeldung.unmappedproperties.mapper;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface DocumentMapperMappingIgnore {
+
+ DocumentMapperMappingIgnore INSTANCE = Mappers.getMapper(DocumentMapperMappingIgnore.class);
+
+ @Mapping(target = "comments", ignore = true)
+ DocumentDTO documentToDocumentDTO(Document entity);
+
+ @Mapping(target = "modificationTime", ignore = true)
+ Document documentDTOToDocument(DocumentDTO dto);
+
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java
new file mode 100644
index 0000000000..b44f714774
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java
@@ -0,0 +1,17 @@
+package com.baeldung.unmappedproperties.mapper;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface DocumentMapperUnmappedPolicy {
+
+ DocumentMapperUnmappedPolicy INSTANCE = Mappers.getMapper(DocumentMapperUnmappedPolicy.class);
+
+ DocumentDTO documentToDocumentDTO(Document entity);
+
+ Document documentDTOToDocument(DocumentDTO dto);
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java
new file mode 100644
index 0000000000..dfaab7e1a1
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.unmappedproperties.mapper;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(config = IgnoreUnmappedMapperConfig.class)
+public interface DocumentMapperWithConfig {
+
+ DocumentMapperWithConfig INSTANCE = Mappers.getMapper(DocumentMapperWithConfig.class);
+
+ DocumentDTO documentToDocumentDTO(Document entity);
+
+ Document documentDTOToDocument(DocumentDTO dto);
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java
new file mode 100644
index 0000000000..804ce9c03a
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java
@@ -0,0 +1,8 @@
+package com.baeldung.unmappedproperties.mapper;
+
+import org.mapstruct.MapperConfig;
+import org.mapstruct.ReportingPolicy;
+
+@MapperConfig(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface IgnoreUnmappedMapperConfig {
+}
\ No newline at end of file
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java
new file mode 100644
index 0000000000..cded90138b
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.mapper;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+import com.baeldung.dto.CustomerDto;
+import com.baeldung.entity.Customer;
+
+public class CustomerDtoMapperUnitTest {
+
+ private CustomerDtoMapper customerDtoMapper = Mappers.getMapper(CustomerDtoMapper.class);
+
+ @Test
+ void testGivenCustomer_mapsToCustomerDto() {
+
+ // given
+ Customer customer = new Customer().setFirstName("Max")
+ .setLastName("Powers");
+
+ // when
+ CustomerDto customerDto = customerDtoMapper.from(customer);
+
+ // then
+ assertEquals(customerDto.getForename(), customer.getFirstName());
+ assertEquals(customerDto.getSurname(), customer.getLastName());
+ }
+}
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java
new file mode 100644
index 0000000000..7d1e432546
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.mapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import org.junit.Test;
+import org.mapstruct.factory.Mappers;
+
+import com.baeldung.entity.Address;
+import com.baeldung.entity.Customer;
+import com.baeldung.entity.DeliveryAddress;
+
+public class DeliveryAddressMapperUnitTest {
+
+ private DeliveryAddressMapper deliveryAddressMapper = Mappers.getMapper(DeliveryAddressMapper.class);
+
+ @Test
+ public void testGivenCustomerAndAddress_mapsToDeliveryAddress() {
+
+ // given a customer
+ Customer customer = new Customer().setFirstName("Max")
+ .setLastName("Powers");
+
+ // and some address
+ Address homeAddress = new Address().setStreet("123 Some Street")
+ .setCounty("Nevada")
+ .setPostalcode("89123");
+
+ // when calling DeliveryAddressMapper::from
+ DeliveryAddress deliveryAddress = deliveryAddressMapper.from(customer, homeAddress);
+
+ // then a new DeliveryAddress is created, based on the given customer and his home address
+ assertEquals(deliveryAddress.getForename(), customer.getFirstName());
+ assertEquals(deliveryAddress.getSurname(), customer.getLastName());
+ assertEquals(deliveryAddress.getStreet(), homeAddress.getStreet());
+ assertEquals(deliveryAddress.getCounty(), homeAddress.getCounty());
+ assertEquals(deliveryAddress.getPostalcode(), homeAddress.getPostalcode());
+
+ }
+
+ @Test
+ public void testGivenDeliveryAddressAndSomeOtherAddress_updatesDeliveryAddress() {
+
+ // given a delivery address
+ DeliveryAddress deliveryAddress = new DeliveryAddress().setForename("Max")
+ .setSurname("Powers")
+ .setStreet("123 Some Street")
+ .setCounty("Nevada")
+ .setPostalcode("89123");
+
+ // and some new address
+ Address newAddress = new Address().setStreet("456 Some other street")
+ .setCounty("Arizona")
+ .setPostalcode("12345");
+
+ // when calling DeliveryAddressMapper::updateAddress
+ DeliveryAddress updatedDeliveryAddress = deliveryAddressMapper.updateAddress(deliveryAddress, newAddress);
+
+ // then the *existing* delivery address is updated
+ assertSame(deliveryAddress, updatedDeliveryAddress);
+
+ assertEquals(deliveryAddress.getStreet(), newAddress.getStreet());
+ assertEquals(deliveryAddress.getCounty(), newAddress.getCounty());
+ assertEquals(deliveryAddress.getPostalcode(), newAddress.getPostalcode());
+
+ }
+}
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java
new file mode 100644
index 0000000000..a875d6faf7
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.mapper;
+
+import com.baeldung.dto.UserBodyImperialValuesDTO;
+import com.baeldung.entity.UserBodyValues;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+
+public class UserBodyValuesMapperUnitTest {
+
+ @Test
+ public void givenUserBodyImperialValuesDTOToUserBodyValuesObject_whenMaps_thenCorrect() {
+ UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO();
+ dto.setInch(10);
+ dto.setPound(100);
+
+ UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto);
+
+ assertNotNull(obj);
+ assertEquals(25.4, obj.getCentimeter(), 0);
+ assertEquals(45.35, obj.getKilogram(), 0);
+ }
+
+ @Test
+ public void givenUserBodyImperialValuesDTOWithInchToUserBodyValuesObject_whenMaps_thenCorrect() {
+ UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO();
+ dto.setInch(10);
+
+ UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto);
+
+ assertNotNull(obj);
+ assertEquals(25.4, obj.getCentimeter(), 0);
+ }
+
+ @Test
+ public void givenUserBodyImperialValuesDTOWithPoundToUserBodyValuesObject_whenMaps_thenCorrect() {
+ UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO();
+ dto.setPound(100);
+
+ UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto);
+
+ assertNotNull(obj);
+ assertEquals(45.35, obj.getKilogram(), 0);
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java
new file mode 100644
index 0000000000..4ce04015f1
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.mapper.unmappedproperties;
+
+import com.baeldung.unmappedproperties.dto.CarDTO;
+import com.baeldung.unmappedproperties.entity.Car;
+import com.baeldung.unmappedproperties.mapper.CarMapper;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CarMapperUnitTest {
+
+ @Test
+ public void givenCarEntitytoCar_whenMaps_thenCorrect() {
+ Car entity = new Car();
+ entity.setId(1);
+ entity.setName("Toyota");
+
+ CarDTO carDto = CarMapper.INSTANCE.carToCarDTO(entity);
+
+ assertThat(carDto.getId()).isEqualTo(entity.getId());
+ assertThat(carDto.getName()).isEqualTo(entity.getName());
+ }
+}
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java
new file mode 100644
index 0000000000..493c7f8686
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.mapper.unmappedproperties;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import com.baeldung.unmappedproperties.mapper.DocumentMapperMappingIgnore;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Date;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DocumentMapperMappingIgnoreUnitTest {
+
+ @Test
+ public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() {
+ Document entity = new Document();
+ entity.setId(1);
+ entity.setTitle("Price 13-42");
+ entity.setText("List of positions.......");
+ entity.setModificationTime(new Date());
+
+ DocumentDTO dto = DocumentMapperMappingIgnore.INSTANCE.documentToDocumentDTO(entity);
+
+ assertThat(dto.getId()).isEqualTo(entity.getId());
+ assertThat(dto.getTitle()).isEqualTo(entity.getTitle());
+ assertThat(dto.getText()).isEqualTo(entity.getText());
+ }
+
+ @Test
+ public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() {
+ DocumentDTO dto = new DocumentDTO();
+ dto.setId(1);
+ dto.setTitle("Price 13-42");
+ dto.setText("List of positions.......");
+ dto.setComments(Arrays.asList("Not all positions", "Wrong price values"));
+ dto.setAuthor("Author1");
+
+ Document entity = DocumentMapperMappingIgnore.INSTANCE.documentDTOToDocument(dto);
+
+ assertThat(entity.getId()).isEqualTo(dto.getId());
+ assertThat(entity.getTitle()).isEqualTo(dto.getTitle());
+ assertThat(entity.getText()).isEqualTo(dto.getText());
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java
new file mode 100644
index 0000000000..1d3645ca96
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.mapper.unmappedproperties;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import com.baeldung.unmappedproperties.mapper.DocumentMapper;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Date;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DocumentMapperUnitTest {
+
+ @Test
+ public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() {
+ Document entity = new Document();
+ entity.setId(1);
+ entity.setTitle("Price 13-42");
+ entity.setText("List of positions.......");
+ entity.setModificationTime(new Date());
+
+ DocumentDTO dto = DocumentMapper.INSTANCE.documentToDocumentDTO(entity);
+
+ assertThat(dto.getId()).isEqualTo(entity.getId());
+ assertThat(dto.getTitle()).isEqualTo(entity.getTitle());
+ assertThat(dto.getText()).isEqualTo(entity.getText());
+ }
+
+ @Test
+ public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() {
+ DocumentDTO dto = new DocumentDTO();
+ dto.setId(1);
+ dto.setTitle("Price 13-42");
+ dto.setText("List of positions.......");
+ dto.setComments(Arrays.asList("Not all positions", "Wrong price values"));
+ dto.setAuthor("Author1");
+
+ Document entity = DocumentMapper.INSTANCE.documentDTOToDocument(dto);
+
+ assertThat(entity.getId()).isEqualTo(dto.getId());
+ assertThat(entity.getTitle()).isEqualTo(dto.getTitle());
+ assertThat(entity.getText()).isEqualTo(dto.getText());
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java
new file mode 100644
index 0000000000..f6666a52ec
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.mapper.unmappedproperties;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import com.baeldung.unmappedproperties.mapper.DocumentMapperUnmappedPolicy;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Date;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DocumentMapperUnmappedPolicyUnitTest {
+
+ @Test
+ public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() {
+ Document entity = new Document();
+ entity.setId(1);
+ entity.setTitle("Price 13-42");
+ entity.setText("List of positions.......");
+ entity.setModificationTime(new Date());
+
+ DocumentDTO dto = DocumentMapperUnmappedPolicy.INSTANCE.documentToDocumentDTO(entity);
+
+ assertThat(dto.getId()).isEqualTo(entity.getId());
+ assertThat(dto.getTitle()).isEqualTo(entity.getTitle());
+ assertThat(dto.getText()).isEqualTo(entity.getText());
+ }
+
+ @Test
+ public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() {
+ DocumentDTO dto = new DocumentDTO();
+ dto.setId(1);
+ dto.setTitle("Price 13-42");
+ dto.setText("List of positions.......");
+ dto.setComments(Arrays.asList("Not all positions", "Wrong price values"));
+ dto.setAuthor("Author1");
+
+ Document entity = DocumentMapperUnmappedPolicy.INSTANCE.documentDTOToDocument(dto);
+
+ assertThat(entity.getId()).isEqualTo(dto.getId());
+ assertThat(entity.getTitle()).isEqualTo(dto.getTitle());
+ assertThat(entity.getText()).isEqualTo(dto.getText());
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java
new file mode 100644
index 0000000000..c9409225f5
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.mapper.unmappedproperties;
+
+import com.baeldung.unmappedproperties.dto.DocumentDTO;
+import com.baeldung.unmappedproperties.entity.Document;
+import com.baeldung.unmappedproperties.mapper.DocumentMapperWithConfig;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Date;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DocumentMapperWithConfigUnitTest {
+
+ @Test
+ public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() {
+ Document entity = new Document();
+ entity.setId(1);
+ entity.setTitle("Price 13-42");
+ entity.setText("List of positions.......");
+ entity.setModificationTime(new Date());
+
+ DocumentDTO dto = DocumentMapperWithConfig.INSTANCE.documentToDocumentDTO(entity);
+
+ assertThat(dto.getId()).isEqualTo(entity.getId());
+ assertThat(dto.getTitle()).isEqualTo(entity.getTitle());
+ assertThat(dto.getText()).isEqualTo(entity.getText());
+ }
+
+ @Test
+ public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() {
+ DocumentDTO dto = new DocumentDTO();
+ dto.setId(1);
+ dto.setTitle("Price 13-42");
+ dto.setText("List of positions.......");
+ dto.setComments(Arrays.asList("Not all positions", "Wrong price values"));
+ dto.setAuthor("Author1");
+
+ Document entity = DocumentMapperWithConfig.INSTANCE.documentDTOToDocument(dto);
+
+ assertThat(entity.getId()).isEqualTo(dto.getId());
+ assertThat(entity.getTitle()).isEqualTo(dto.getTitle());
+ assertThat(entity.getText()).isEqualTo(dto.getText());
+ }
+}
\ No newline at end of file
diff --git a/maven-all/README.md b/maven-all/README.md
new file mode 100644
index 0000000000..d014f323d2
--- /dev/null
+++ b/maven-all/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Apache Maven Tutorial](https://www.baeldung.com/maven)
\ No newline at end of file
diff --git a/maven-all/compiler-plugin-java-9/README.md b/maven-all/compiler-plugin-java-9/README.md
new file mode 100644
index 0000000000..d0b7b72acc
--- /dev/null
+++ b/maven-all/compiler-plugin-java-9/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Maven Compiler Plugin](http://www.baeldung.com/maven-compiler-plugin)
\ No newline at end of file
diff --git a/maven/compiler-plugin-java-9/pom.xml b/maven-all/compiler-plugin-java-9/pom.xml
similarity index 100%
rename from maven/compiler-plugin-java-9/pom.xml
rename to maven-all/compiler-plugin-java-9/pom.xml
diff --git a/maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java b/maven-all/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java
similarity index 100%
rename from maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java
rename to maven-all/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java
diff --git a/maven/compiler-plugin-java-9/src/main/java/module-info.java b/maven-all/compiler-plugin-java-9/src/main/java/module-info.java
similarity index 100%
rename from maven/compiler-plugin-java-9/src/main/java/module-info.java
rename to maven-all/compiler-plugin-java-9/src/main/java/module-info.java
diff --git a/maven-all/maven-war-plugin/README.md b/maven-all/maven-war-plugin/README.md
new file mode 100644
index 0000000000..d559fea80b
--- /dev/null
+++ b/maven-all/maven-war-plugin/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Eclipse Error: web.xml is missing and failOnMissingWebXml is set to true](https://www.baeldung.com/eclipse-error-web-xml-missing)
\ No newline at end of file
diff --git a/maven/maven-war-plugin/pom.xml b/maven-all/maven-war-plugin/pom.xml
similarity index 88%
rename from maven/maven-war-plugin/pom.xml
rename to maven-all/maven-war-plugin/pom.xml
index 517c08978f..25c2e1ba1b 100644
--- a/maven/maven-war-plugin/pom.xml
+++ b/maven-all/maven-war-plugin/pom.xml
@@ -1,29 +1,29 @@
-
- 4.0.0
- com.baeldung
- maven-war-plugin-property
- 0.0.1-SNAPSHOT
- war
- maven-war-plugin-property
-
-
-
-
- maven-war-plugin
-
- 3.1.0
-
-
- false
-
-
-
-
-
-
-
- false
-
+
+ 4.0.0
+ com.baeldung
+ maven-war-plugin
+ 0.0.1-SNAPSHOT
+ war
+ maven-war-plugin
+
+
+
+
+ maven-war-plugin
+
+ 3.1.0
+
+
+ false
+
+
+
+
+
+
+
+ false
+
\ No newline at end of file
diff --git a/maven/.gitignore b/maven-all/maven/.gitignore
similarity index 100%
rename from maven/.gitignore
rename to maven-all/maven/.gitignore
diff --git a/maven-all/maven/README.md b/maven-all/maven/README.md
new file mode 100644
index 0000000000..acf7dfc47b
--- /dev/null
+++ b/maven-all/maven/README.md
@@ -0,0 +1,14 @@
+### Relevant Articles
+
+- [Guide to the Core Maven Plugins](https://www.baeldung.com/core-maven-plugins)
+- [Maven Resources Plugin](https://www.baeldung.com/maven-resources-plugin)
+- [Maven Compiler Plugin](https://www.baeldung.com/maven-compiler-plugin)
+- [Quick Guide to the Maven Surefire Plugin](https://www.baeldung.com/maven-surefire-plugin)
+- [The Maven Failsafe Plugin](https://www.baeldung.com/maven-failsafe-plugin)
+- [The Maven Verifier Plugin](https://www.baeldung.com/maven-verifier-plugin)
+- [The Maven Clean Plugin](https://www.baeldung.com/maven-clean-plugin)
+- [Build a Jar with Maven and Ignore the Test Results](https://www.baeldung.com/maven-ignore-test-results)
+- [Maven Project with Multiple Source Directories](https://www.baeldung.com/maven-project-multiple-src-directories)
+- [Integration Testing with Maven](https://www.baeldung.com/maven-integration-test)
+- [Apache Maven Standard Directory Layout](https://www.baeldung.com/maven-directory-structure)
+- [Multi-Module Project with Maven](https://www.baeldung.com/maven-multi-module)
diff --git a/maven/custom-rule/pom.xml b/maven-all/maven/custom-rule/pom.xml
similarity index 100%
rename from maven/custom-rule/pom.xml
rename to maven-all/maven/custom-rule/pom.xml
diff --git a/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java b/maven-all/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java
similarity index 100%
rename from maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java
rename to maven-all/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java
diff --git a/maven/input-resources/baeldung.png b/maven-all/maven/input-resources/baeldung.png
similarity index 100%
rename from maven/input-resources/baeldung.png
rename to maven-all/maven/input-resources/baeldung.png
diff --git a/maven/input-resources/baeldung.txt b/maven-all/maven/input-resources/baeldung.txt
similarity index 100%
rename from maven/input-resources/baeldung.txt
rename to maven-all/maven/input-resources/baeldung.txt
diff --git a/maven/input-resources/verifications.xml b/maven-all/maven/input-resources/verifications.xml
similarity index 100%
rename from maven/input-resources/verifications.xml
rename to maven-all/maven/input-resources/verifications.xml
diff --git a/maven-all/maven/maven-enforcer/README.md b/maven-all/maven/maven-enforcer/README.md
new file mode 100644
index 0000000000..7515647a3d
--- /dev/null
+++ b/maven-all/maven/maven-enforcer/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin)
\ No newline at end of file
diff --git a/maven/maven-enforcer/pom.xml b/maven-all/maven/maven-enforcer/pom.xml
similarity index 100%
rename from maven/maven-enforcer/pom.xml
rename to maven-all/maven/maven-enforcer/pom.xml
diff --git a/maven/pom.xml b/maven-all/maven/pom.xml
similarity index 99%
rename from maven/pom.xml
rename to maven-all/maven/pom.xml
index ef6e7b7d93..d34be04fcf 100644
--- a/maven/pom.xml
+++ b/maven-all/maven/pom.xml
@@ -11,6 +11,7 @@
parent-modulescom.baeldung1.0.0-SNAPSHOT
+ ../..
diff --git a/maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java b/maven-all/maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java
similarity index 100%
rename from maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java
rename to maven-all/maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java
diff --git a/maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java b/maven-all/maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java
similarity index 100%
rename from maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java
rename to maven-all/maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java
diff --git a/maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java b/maven-all/maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java
similarity index 100%
rename from maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java
rename to maven-all/maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java
diff --git a/maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java b/maven-all/maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java
similarity index 100%
rename from maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java
rename to maven-all/maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java
diff --git a/maven/src/main/java/com/baeldung/maven/plugins/Data.java b/maven-all/maven/src/main/java/com/baeldung/maven/plugins/Data.java
similarity index 100%
rename from maven/src/main/java/com/baeldung/maven/plugins/Data.java
rename to maven-all/maven/src/main/java/com/baeldung/maven/plugins/Data.java
diff --git a/maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java b/maven-all/maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java
similarity index 100%
rename from maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java
rename to maven-all/maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java
diff --git a/maven-all/maven/src/main/resources/logback.xml b/maven-all/maven/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/maven-all/maven/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven/src/main/webapp/WEB-INF/web.xml b/maven-all/maven/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from maven/src/main/webapp/WEB-INF/web.xml
rename to maven-all/maven/src/main/webapp/WEB-INF/web.xml
diff --git a/maven/src/test/java/com/baeldung/maven/it/Integration.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/Integration.java
similarity index 100%
rename from maven/src/test/java/com/baeldung/maven/it/Integration.java
rename to maven-all/maven/src/test/java/com/baeldung/maven/it/Integration.java
diff --git a/maven/src/test/java/com/baeldung/maven/it/RestIT.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/RestIT.java
similarity index 100%
rename from maven/src/test/java/com/baeldung/maven/it/RestIT.java
rename to maven-all/maven/src/test/java/com/baeldung/maven/it/RestIT.java
diff --git a/maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java
similarity index 100%
rename from maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java
rename to maven-all/maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java
diff --git a/maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java
similarity index 100%
rename from maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java
rename to maven-all/maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java
diff --git a/maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java b/maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java
similarity index 100%
rename from maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java
rename to maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java
diff --git a/maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java b/maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java
similarity index 100%
rename from maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java
rename to maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java
diff --git a/maven/src/test/java/testfail/TestFail.java b/maven-all/maven/src/test/java/testfail/TestFail.java
similarity index 100%
rename from maven/src/test/java/testfail/TestFail.java
rename to maven-all/maven/src/test/java/testfail/TestFail.java
diff --git a/maven-all/profiles/README.md b/maven-all/profiles/README.md
new file mode 100644
index 0000000000..22d5d7f70c
--- /dev/null
+++ b/maven-all/profiles/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Guide to Maven Profiles](https://www.baeldung.com/maven-profiles)
\ No newline at end of file
diff --git a/maven/profiles/pom.xml b/maven-all/profiles/pom.xml
similarity index 100%
rename from maven/profiles/pom.xml
rename to maven-all/profiles/pom.xml
diff --git a/maven-all/versions-maven-plugin/README.md b/maven-all/versions-maven-plugin/README.md
new file mode 100644
index 0000000000..8f5670f802
--- /dev/null
+++ b/maven-all/versions-maven-plugin/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version)
\ No newline at end of file
diff --git a/maven/versions-maven-plugin/original/pom.xml b/maven-all/versions-maven-plugin/original/pom.xml
similarity index 100%
rename from maven/versions-maven-plugin/original/pom.xml
rename to maven-all/versions-maven-plugin/original/pom.xml
diff --git a/maven/versions-maven-plugin/pom.xml b/maven-all/versions-maven-plugin/pom.xml
similarity index 97%
rename from maven/versions-maven-plugin/pom.xml
rename to maven-all/versions-maven-plugin/pom.xml
index e0714bf0e0..c9f63a46f1 100644
--- a/maven/versions-maven-plugin/pom.xml
+++ b/maven-all/versions-maven-plugin/pom.xml
@@ -36,7 +36,7 @@
commons-beanutilscommons-beanutils
- 1.9.1-SNAPSHOT
+ 1.9.1
diff --git a/maven/versions-maven-plugin/run-the-demo.sh b/maven-all/versions-maven-plugin/run-the-demo.sh
old mode 100755
new mode 100644
similarity index 100%
rename from maven/versions-maven-plugin/run-the-demo.sh
rename to maven-all/versions-maven-plugin/run-the-demo.sh
diff --git a/maven-archetype/README.md b/maven-archetype/README.md
index 71821e3348..b707150854 100644
--- a/maven-archetype/README.md
+++ b/maven-archetype/README.md
@@ -1,4 +1,4 @@
### Relevant Articles:
================================
-- [Guide to Maven Archetype](http://www.baeldung.com/maven-archetype)
+- [Guide to Maven Archetype](https://www.baeldung.com/maven-archetype)
diff --git a/maven/README.md b/maven/README.md
deleted file mode 100644
index 6d1a7081b7..0000000000
--- a/maven/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-### Relevant Articles
-
-- [Guide to the Core Maven Plugins](http://www.baeldung.com/core-maven-plugins)
-- [Maven Resources Plugin](http://www.baeldung.com/maven-resources-plugin)
-- [Maven Compiler Plugin](http://www.baeldung.com/maven-compiler-plugin)
-- [Quick Guide to the Maven Surefire Plugin](http://www.baeldung.com/maven-surefire-plugin)
-- [The Maven Failsafe Plugin](http://www.baeldung.com/maven-failsafe-plugin)
-- [The Maven Verifier Plugin](http://www.baeldung.com/maven-verifier-plugin)
-- [The Maven Clean Plugin](http://www.baeldung.com/maven-clean-plugin)
-- [Build a Jar with Maven and Ignore the Test Results](http://www.baeldung.com/maven-ignore-test-results)
-- [Maven Project with Multiple Source Directories](https://www.baeldung.com/maven-project-multiple-src-directories)
-- [Integration Testing with Maven](https://www.baeldung.com/maven-integration-test)
-- [Apache Maven Standard Directory Layout](https://www.baeldung.com/maven-directory-structure)
-- [Apache Maven Tutorial](https://www.baeldung.com/maven)
-- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version)
-- [Multi-Module Project with Maven](https://www.baeldung.com/maven-multi-module)
-- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin)
-- [Eclipse Error: web.xml is missing and failOnMissingWebXml is set to true](https://www.baeldung.com/eclipse-error-web-xml-missing)
-- [Guide to Maven Profiles](https://www.baeldung.com/maven-profiles)
diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md
index 1d4d4995a8..09467ebfcb 100644
--- a/mesos-marathon/README.md
+++ b/mesos-marathon/README.md
@@ -1,5 +1,5 @@
### Relevant articles
-- [Simple Jenkins Pipeline with Marathon and Mesos](http://www.baeldung.com/jenkins-pipeline-with-marathon-mesos)
+- [Simple Jenkins Pipeline with Marathon and Mesos](https://www.baeldung.com/jenkins-pipeline-with-marathon-mesos)
To run the pipeline, please modify the dockerise.sh file with your own useranema and password for docker login.
diff --git a/metrics/README.md b/metrics/README.md
index c7772bffa0..d344a2707f 100644
--- a/metrics/README.md
+++ b/metrics/README.md
@@ -1,5 +1,5 @@
## Relevant articles:
-- [Intro to Dropwizard Metrics](http://www.baeldung.com/dropwizard-metrics)
-- [Introduction to Netflix Servo](http://www.baeldung.com/netflix-servo)
-- [Quick Guide to Micrometer](http://www.baeldung.com/micrometer)
+- [Intro to Dropwizard Metrics](https://www.baeldung.com/dropwizard-metrics)
+- [Introduction to Netflix Servo](https://www.baeldung.com/netflix-servo)
+- [Quick Guide to Micrometer](https://www.baeldung.com/micrometer)
diff --git a/micronaut/README.md b/micronaut/README.md
index 10a68ff2f8..0a39cf9e33 100644
--- a/micronaut/README.md
+++ b/micronaut/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [Introduction to Micronaut Framework](http://www.baeldung.com/micronaut)
+- [Introduction to Micronaut Framework](https://www.baeldung.com/micronaut)
diff --git a/microprofile/README.md b/microprofile/README.md
index 1a28487e89..7525ee5bff 100644
--- a/microprofile/README.md
+++ b/microprofile/README.md
@@ -1,3 +1,3 @@
### Relevant articles:
-- [Building Microservices with Eclipse MicroProfile](http://www.baeldung.com/eclipse-microprofile)
+- [Building Microservices with Eclipse MicroProfile](https://www.baeldung.com/eclipse-microprofile)
diff --git a/ml/README.md b/ml/README.md
new file mode 100644
index 0000000000..1362f2840c
--- /dev/null
+++ b/ml/README.md
@@ -0,0 +1,5 @@
+### Logistic Regression in Java
+This is a soft introduction to ML using [deeplearning4j](https://deeplearning4j.org) library
+
+### Relevant Articles:
+- [Logistic Regression in Java](https://www.baeldung.com/)
diff --git a/ml/pom.xml b/ml/pom.xml
new file mode 100644
index 0000000000..80afcc24f4
--- /dev/null
+++ b/ml/pom.xml
@@ -0,0 +1,52 @@
+
+ 4.0.0
+ com.baeldung.deeplearning4j
+ ml
+ 1.0-SNAPSHOT
+ Machine Learning
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.nd4j
+ nd4j-native-platform
+ ${dl4j.version}
+
+
+ org.deeplearning4j
+ deeplearning4j-core
+ ${dl4j.version}
+
+
+ org.deeplearning4j
+ deeplearning4j-nn
+ ${dl4j.version}
+
+
+
+ org.datavec
+ datavec-api
+ ${dl4j.version}
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.3.5
+
+
+
+
+
+
+ 1.0.0-beta4
+
+
+
\ No newline at end of file
diff --git a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java
new file mode 100644
index 0000000000..1246de973f
--- /dev/null
+++ b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java
@@ -0,0 +1,168 @@
+package com.baeldung.logreg;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import org.datavec.api.io.labels.ParentPathLabelGenerator;
+import org.datavec.api.split.FileSplit;
+import org.datavec.image.loader.NativeImageLoader;
+import org.datavec.image.recordreader.ImageRecordReader;
+import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator;
+import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
+import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
+import org.deeplearning4j.nn.conf.inputs.InputType;
+import org.deeplearning4j.nn.conf.layers.ConvolutionLayer;
+import org.deeplearning4j.nn.conf.layers.DenseLayer;
+import org.deeplearning4j.nn.conf.layers.OutputLayer;
+import org.deeplearning4j.nn.conf.layers.SubsamplingLayer;
+import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
+import org.deeplearning4j.nn.weights.WeightInit;
+import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
+import org.deeplearning4j.util.ModelSerializer;
+import org.nd4j.evaluation.classification.Evaluation;
+import org.nd4j.linalg.activations.Activation;
+import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
+import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
+import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
+import org.nd4j.linalg.learning.config.Nesterovs;
+import org.nd4j.linalg.lossfunctions.LossFunctions;
+import org.nd4j.linalg.schedule.MapSchedule;
+import org.nd4j.linalg.schedule.ScheduleType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Handwritten digit image classification based on LeNet-5 architecture by Yann LeCun.
+ *
+ * This code accompanies the article "Logistic regression in Java" and is heavily based on
+ * MnistClassifier.
+ * Some minor changes have been made in order to make article's flow smoother.
+ *
+ */
+
+public class MnistClassifier {
+ private static final Logger logger = LoggerFactory.getLogger(MnistClassifier.class);
+ private static final String basePath = System.getProperty("java.io.tmpdir") + "mnist" + File.separator;
+ private static final File modelPath = new File(basePath + "mnist-model.zip");
+ private static final String dataUrl = "http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz";
+
+ public static void main(String[] args) throws Exception {
+ // input image sizes in pixels
+ int height = 28;
+ int width = 28;
+ // input image colour depth (1 for gray scale images)
+ int channels = 1;
+ // the number of output classes
+ int outputClasses = 10;
+ // number of samples that will be propagated through the network in each iteration
+ int batchSize = 54;
+ // total number of training epochs
+ int epochs = 1;
+
+ // initialize a pseudorandom number generator
+ int seed = 1234;
+ Random randNumGen = new Random(seed);
+
+ final String path = basePath + "mnist_png" + File.separator;
+ if (!new File(path).exists()) {
+ logger.info("Downloading data {}", dataUrl);
+ String localFilePath = basePath + "mnist_png.tar.gz";
+ File file = new File(localFilePath);
+ if (!file.exists()) {
+ file.getParentFile()
+ .mkdirs();
+ Utils.downloadAndSave(dataUrl, file);
+ Utils.extractTarArchive(file, basePath);
+ }
+ } else {
+ logger.info("Using the local data from folder {}", path);
+ }
+
+ logger.info("Vectorizing the data from folder {}", path);
+ // vectorization of train data
+ File trainData = new File(path + "training");
+ FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
+ // use parent directory name as the image label
+ ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator();
+ ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker);
+ trainRR.initialize(trainSplit);
+ DataSetIterator train = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputClasses);
+
+ // pixel values from 0-255 to 0-1 (min-max scaling)
+ DataNormalization imageScaler = new ImagePreProcessingScaler();
+ imageScaler.fit(train);
+ train.setPreProcessor(imageScaler);
+
+ // vectorization of test data
+ File testData = new File(path + "testing");
+ FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
+ ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker);
+ testRR.initialize(testSplit);
+ DataSetIterator test = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputClasses);
+ // same normalization for better results
+ test.setPreProcessor(imageScaler);
+
+ logger.info("Network configuration and training...");
+ // reduce the learning rate as the number of training epochs increases
+ // iteration #, learning rate
+ Map learningRateSchedule = new HashMap<>();
+ learningRateSchedule.put(0, 0.06);
+ learningRateSchedule.put(200, 0.05);
+ learningRateSchedule.put(600, 0.028);
+ learningRateSchedule.put(800, 0.0060);
+ learningRateSchedule.put(1000, 0.001);
+
+ final ConvolutionLayer layer1 = new ConvolutionLayer.Builder(5, 5).nIn(channels)
+ .stride(1, 1)
+ .nOut(20)
+ .activation(Activation.IDENTITY)
+ .build();
+ final SubsamplingLayer layer2 = new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2)
+ .stride(2, 2)
+ .build();
+ // nIn need not specified in later layers
+ final ConvolutionLayer layer3 = new ConvolutionLayer.Builder(5, 5).stride(1, 1)
+ .nOut(50)
+ .activation(Activation.IDENTITY)
+ .build();
+ final DenseLayer layer4 = new DenseLayer.Builder().activation(Activation.RELU)
+ .nOut(500)
+ .build();
+ final OutputLayer layer5 = new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nOut(outputClasses)
+ .activation(Activation.SOFTMAX)
+ .build();
+ final MultiLayerConfiguration config = new NeuralNetConfiguration.Builder().seed(seed)
+ .l2(0.0005) // ridge regression value
+ .updater(new Nesterovs(new MapSchedule(ScheduleType.ITERATION, learningRateSchedule)))
+ .weightInit(WeightInit.XAVIER)
+ .list()
+ .layer(layer1)
+ .layer(layer2)
+ .layer(layer3)
+ .layer(layer2)
+ .layer(layer4)
+ .layer(layer5)
+ .setInputType(InputType.convolutionalFlat(height, width, channels))
+ .build();
+
+ final MultiLayerNetwork model = new MultiLayerNetwork(config);
+ model.init();
+ model.setListeners(new ScoreIterationListener(100));
+ logger.info("Total num of params: {}", model.numParams());
+
+ // evaluation while training (the score should go down)
+ for (int i = 0; i < epochs; i++) {
+ model.fit(train);
+ logger.info("Completed epoch {}", i);
+ train.reset();
+ test.reset();
+ }
+ Evaluation eval = model.evaluate(test);
+ logger.info(eval.stats());
+
+ ModelSerializer.writeModel(model, modelPath, true);
+ logger.info("The MINIST model has been saved in {}", modelPath.getPath());
+ }
+}
\ No newline at end of file
diff --git a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java
new file mode 100644
index 0000000000..56097d9a45
--- /dev/null
+++ b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java
@@ -0,0 +1,57 @@
+package com.baeldung.logreg;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JFileChooser;
+
+import org.datavec.image.loader.NativeImageLoader;
+import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
+import org.deeplearning4j.util.ModelSerializer;
+import org.nd4j.linalg.api.ndarray.INDArray;
+import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MnistPrediction {
+ private static final Logger logger = LoggerFactory.getLogger(MnistPrediction.class);
+ private static final File modelPath = new File(System.getProperty("java.io.tmpdir") + "mnist" + File.separator + "mnist-model.zip");
+ private static final int height = 28;
+ private static final int width = 28;
+ private static final int channels = 1;
+
+ /**
+ * Opens a popup that allows to select a file from the filesystem.
+ * @return
+ */
+ public static String fileChose() {
+ JFileChooser fc = new JFileChooser();
+ int ret = fc.showOpenDialog(null);
+ if (ret == JFileChooser.APPROVE_OPTION) {
+ File file = fc.getSelectedFile();
+ return file.getAbsolutePath();
+ } else {
+ return null;
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+ if (!modelPath.exists()) {
+ logger.info("The model not found. Have you trained it?");
+ return;
+ }
+ MultiLayerNetwork model = ModelSerializer.restoreMultiLayerNetwork(modelPath);
+ String path = fileChose();
+ File file = new File(path);
+
+ INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file);
+ new ImagePreProcessingScaler(0, 1).transform(image);
+
+ // Pass through to neural Net
+ INDArray output = model.output(image);
+
+ logger.info("File: {}", path);
+ logger.info("Probabilities: {}", output);
+ }
+
+}
diff --git a/ml/src/main/java/com/baeldung/logreg/Utils.java b/ml/src/main/java/com/baeldung/logreg/Utils.java
new file mode 100644
index 0000000000..fa4be127cd
--- /dev/null
+++ b/ml/src/main/java/com/baeldung/logreg/Utils.java
@@ -0,0 +1,103 @@
+package com.baeldung.logreg;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class for digit classifier.
+ *
+ */
+public class Utils {
+
+ private static final Logger logger = LoggerFactory.getLogger(Utils.class);
+
+ private Utils() {
+ }
+
+ /**
+ * Download the content of the given url and save it into a file.
+ * @param url
+ * @param file
+ */
+ public static void downloadAndSave(String url, File file) throws IOException {
+ CloseableHttpClient client = HttpClientBuilder.create()
+ .build();
+ logger.info("Connecting to {}", url);
+ try (CloseableHttpResponse response = client.execute(new HttpGet(url))) {
+ HttpEntity entity = response.getEntity();
+ if (entity != null) {
+ logger.info("Downloaded {} bytes", entity.getContentLength());
+ try (FileOutputStream outstream = new FileOutputStream(file)) {
+ logger.info("Saving to the local file");
+ entity.writeTo(outstream);
+ outstream.flush();
+ logger.info("Local file saved");
+ }
+ }
+ }
+ }
+
+ /**
+ * Extract a "tar.gz" file into a given folder.
+ * @param file
+ * @param folder
+ */
+ public static void extractTarArchive(File file, String folder) throws IOException {
+ logger.info("Extracting archive {} into folder {}", file.getName(), folder);
+ // @formatter:off
+ try (FileInputStream fis = new FileInputStream(file);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ GzipCompressorInputStream gzip = new GzipCompressorInputStream(bis);
+ TarArchiveInputStream tar = new TarArchiveInputStream(gzip)) {
+ // @formatter:on
+ TarArchiveEntry entry;
+ while ((entry = (TarArchiveEntry) tar.getNextEntry()) != null) {
+ extractEntry(entry, tar, folder);
+ }
+ }
+ logger.info("Archive extracted");
+ }
+
+ /**
+ * Extract an entry of the input stream into a given folder
+ * @param entry
+ * @param tar
+ * @param folder
+ * @throws IOException
+ */
+ public static void extractEntry(ArchiveEntry entry, InputStream tar, String folder) throws IOException {
+ final int bufferSize = 4096;
+ final String path = folder + entry.getName();
+ if (entry.isDirectory()) {
+ new File(path).mkdirs();
+ } else {
+ int count;
+ byte[] data = new byte[bufferSize];
+ // @formatter:off
+ try (FileOutputStream os = new FileOutputStream(path);
+ BufferedOutputStream dest = new BufferedOutputStream(os, bufferSize)) {
+ // @formatter:off
+ while ((count = tar.read(data, 0, bufferSize)) != -1) {
+ dest.write(data, 0, count);
+ }
+ }
+ }
+ }
+}
diff --git a/ml/src/main/resources/logback.xml b/ml/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/ml/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msf4j/README.md b/msf4j/README.md
index 7c66b8dc5f..b7f2c5a546 100644
--- a/msf4j/README.md
+++ b/msf4j/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [Introduction to Java Microservices with MSF4J](http://www.baeldung.com/msf4j)
+- [Introduction to Java Microservices with MSF4J](https://www.baeldung.com/msf4j)
diff --git a/muleesb/README.md b/muleesb/README.md
index 8da4e595e3..555a10b5cc 100644
--- a/muleesb/README.md
+++ b/muleesb/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [Getting Started With Mule ESB](http://www.baeldung.com/mule-esb)
+- [Getting Started With Mule ESB](https://www.baeldung.com/mule-esb)
diff --git a/mustache/README.md b/mustache/README.md
index fa41eb4f4d..c36080b56f 100644
--- a/mustache/README.md
+++ b/mustache/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [Introduction to Mustache](http://www.baeldung.com/mustache)
-- [Guide to Mustache with Spring Boot](http://www.baeldung.com/spring-boot-mustache)
+- [Introduction to Mustache](https://www.baeldung.com/mustache)
+- [Guide to Mustache with Spring Boot](https://www.baeldung.com/spring-boot-mustache)
diff --git a/mybatis/README.md b/mybatis/README.md
index 7c366aeab6..57687d3da1 100644
--- a/mybatis/README.md
+++ b/mybatis/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [Quick Guide to MyBatis](http://www.baeldung.com/mybatis)
+- [Quick Guide to MyBatis](https://www.baeldung.com/mybatis)
diff --git a/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/oauth2-framework-impl/oauth2-authorization-server/pom.xml
index 6ab7a60f72..25927c9f1a 100644
--- a/oauth2-framework-impl/oauth2-authorization-server/pom.xml
+++ b/oauth2-framework-impl/oauth2-authorization-server/pom.xml
@@ -18,23 +18,26 @@
1.4.19990809443
+ 7.3
+ 1.62
+ 1.62com.nimbusdsnimbus-jose-jwt
- 7.3
+ ${nimbus-jose-jwt.version}org.bouncycastlebcprov-jdk15on
- 1.62
+ ${bcprov-jdk15on.version}org.bouncycastlebcpkix-jdk15on
- 1.62
+ ${bcpkix-jdk15on.version}
diff --git a/oauth2-framework-impl/oauth2-resource-server/pom.xml b/oauth2-framework-impl/oauth2-resource-server/pom.xml
index e6bc860c67..5e5cd087ed 100644
--- a/oauth2-framework-impl/oauth2-resource-server/pom.xml
+++ b/oauth2-framework-impl/oauth2-resource-server/pom.xml
@@ -18,13 +18,14 @@
8643http://localhost:9080http://localhost:9280
+ 1.1org.eclipse.microprofile.jwtmicroprofile-jwt-auth-api
- 1.1
+ ${microprofile-jwt-auth-api.version}provided
diff --git a/oauth2-framework-impl/pom.xml b/oauth2-framework-impl/pom.xml
index 47d42eaaea..fd1a2c926f 100644
--- a/oauth2-framework-impl/pom.xml
+++ b/oauth2-framework-impl/pom.xml
@@ -15,19 +15,21 @@
falseRELEASE2.6.4
+ 8.0
+ 1.3javaxjavaee-web-api
- 8.0
+ ${javaee-web-api.version}providedorg.eclipse.microprofile.configmicroprofile-config-api
- 1.3
+ ${microprofile-config-api.version}provided
diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml
index 93b1e68264..bcf7080a1e 100644
--- a/optaplanner/pom.xml
+++ b/optaplanner/pom.xml
@@ -16,8 +16,12 @@
org.optaplanneroptaplanner-core
- 7.9.0.Final
+ ${optaplanner-core.version}
+
+ 7.9.0.Final
+
+
\ No newline at end of file
diff --git a/orika/README.md b/orika/README.md
index 4ed033c170..0096793507 100644
--- a/orika/README.md
+++ b/orika/README.md
@@ -1,2 +1,2 @@
### Relevant Articles:
-- [Mapping with Orika](http://www.baeldung.com/orika-mapping)
+- [Mapping with Orika](https://www.baeldung.com/orika-mapping)
diff --git a/osgi/readme.md b/osgi/readme.md
index e380ae06c3..ee5d7d66c4 100644
--- a/osgi/readme.md
+++ b/osgi/readme.md
@@ -87,7 +87,7 @@ org.eclipse.osgi_3.12.1.v20170821-1548.jar
= = NOT GOOD = =
## Relevant articles:
- - [Introduction to OSGi](http://www.baeldung.com/osgi)
+ - [Introduction to OSGi](https://www.baeldung.com/osgi)
diff --git a/parent-boot-1/README.md b/parent-boot-1/README.md
index 8b312c348a..5ad14c6519 100644
--- a/parent-boot-1/README.md
+++ b/parent-boot-1/README.md
@@ -1,2 +1,3 @@
+## Parent Boot 1
This is a parent module for all projects using Spring Boot 1.
diff --git a/parent-boot-2/README.md b/parent-boot-2/README.md
index 3f18bdf38e..7afe447a66 100644
--- a/parent-boot-2/README.md
+++ b/parent-boot-2/README.md
@@ -1,2 +1,3 @@
+## Parent Boot 2
This is a parent module for all projects using Spring Boot 2.
diff --git a/parent-java/README.md b/parent-java/README.md
index 729105e3fd..1b14b7cfc1 100644
--- a/parent-java/README.md
+++ b/parent-java/README.md
@@ -1 +1,3 @@
-## Relevant Articles:
+## Parent Java
+
+This is a parent module for all projects using Java
\ No newline at end of file
diff --git a/parent-kotlin/README.md b/parent-kotlin/README.md
index 6c17a6ac29..c78ecbac42 100644
--- a/parent-kotlin/README.md
+++ b/parent-kotlin/README.md
@@ -1,2 +1,3 @@
+## Parent Kotlin
-Parent module for Kotlin projects.
+This is a parent module for all projects using Kotlin
diff --git a/parent-spring-4/README.md b/parent-spring-4/README.md
index 729105e3fd..f14d003dd5 100644
--- a/parent-spring-4/README.md
+++ b/parent-spring-4/README.md
@@ -1 +1,3 @@
-## Relevant Articles:
+## Parent Spring 4
+
+This is a parent module for all projects using Spring 4
diff --git a/parent-spring-5/README.md b/parent-spring-5/README.md
index 729105e3fd..791a6ca197 100644
--- a/parent-spring-5/README.md
+++ b/parent-spring-5/README.md
@@ -1 +1,3 @@
-## Relevant Articles:
+## Parent Spring 5
+
+This is a parent module for all projects using Spring 5
diff --git a/patterns/design-patterns-2/README.md b/patterns/design-patterns-2/README.md
deleted file mode 100644
index 8e4ef657e1..0000000000
--- a/patterns/design-patterns-2/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### Relevant Articles
-
-- [The Mediator Pattern in Java](https://www.baeldung.com/java-mediator-pattern)
-- [Introduction to the Null Object Pattern](https://www.baeldung.com/java-null-object-pattern)
-- [Avoid Check for Null Statement in Java](https://www.baeldung.com/java-avoid-null-check)
diff --git a/patterns/design-patterns-architectural/README.md b/patterns/design-patterns-architectural/README.md
new file mode 100644
index 0000000000..fbe4221752
--- /dev/null
+++ b/patterns/design-patterns-architectural/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+- [Service Locator Pattern](https://www.baeldung.com/java-service-locator-pattern)
+- [The DAO Pattern in Java](https://www.baeldung.com/java-dao-pattern)
diff --git a/patterns/design-patterns/pom.xml b/patterns/design-patterns-architectural/pom.xml
similarity index 78%
rename from patterns/design-patterns/pom.xml
rename to patterns/design-patterns-architectural/pom.xml
index e6bff64f9e..cf99919e7c 100644
--- a/patterns/design-patterns/pom.xml
+++ b/patterns/design-patterns-architectural/pom.xml
@@ -2,9 +2,9 @@
4.0.0
- design-patterns
+ design-patterns-architectural1.0
- design-patterns
+ design-patterns-architecturaljar
@@ -21,7 +21,8 @@
${assertj-core.version}test
-
+
+ javaxjavaee-api${javaee.version}
@@ -37,24 +38,15 @@
${mysql-connector.version}jar
-
- log4j
- log4j
- ${log4j.version}
-
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
- UTF-81.81.8
- 1.8.7
+
3.9.1
+
8.05.2.16.Final6.0.6
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/Dao.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/Dao.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/Dao.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/Dao.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/UserDao.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/UserDao.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/UserDao.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/UserDao.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/entities/User.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/entities/User.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/Cache.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Cache.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/Cache.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Cache.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/EmailService.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/EmailService.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/EmailService.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/EmailService.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/InitialContext.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/InitialContext.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/InitialContext.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/InitialContext.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/Main.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Main.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/Main.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Main.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/MessagingService.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/MessagingService.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/MessagingService.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/MessagingService.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/SMSService.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/SMSService.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/SMSService.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/SMSService.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/ServiceLocator.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/ServiceLocator.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/ServiceLocator.java
rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/ServiceLocator.java
diff --git a/patterns/design-patterns/src/main/resources/META-INF/persistence.xml b/patterns/design-patterns-architectural/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from patterns/design-patterns/src/main/resources/META-INF/persistence.xml
rename to patterns/design-patterns-architectural/src/main/resources/META-INF/persistence.xml
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java b/patterns/design-patterns-architectural/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java
rename to patterns/design-patterns-architectural/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java
diff --git a/patterns/design-patterns-behavioral-2/README.md b/patterns/design-patterns-behavioral-2/README.md
new file mode 100644
index 0000000000..9618a9c458
--- /dev/null
+++ b/patterns/design-patterns-behavioral-2/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Memento Design Pattern in Java](https://www.baeldung.com/java-memento-design-pattern)
diff --git a/patterns/design-patterns-behavioral-2/pom.xml b/patterns/design-patterns-behavioral-2/pom.xml
new file mode 100644
index 0000000000..7e73c0ad19
--- /dev/null
+++ b/patterns/design-patterns-behavioral-2/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+ design-patterns-behavioral-2
+ 1.0
+ design-patterns-behavioral-2
+ jar
+
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+ 3.12.2
+
+
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextEditor.java b/patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextEditor.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextEditor.java
rename to patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextEditor.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindow.java b/patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindow.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindow.java
rename to patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindow.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindowState.java b/patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindowState.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindowState.java
rename to patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindowState.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java b/patterns/design-patterns-behavioral-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java
rename to patterns/design-patterns-behavioral-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java
diff --git a/patterns/design-patterns-behavioral/README.md b/patterns/design-patterns-behavioral/README.md
new file mode 100644
index 0000000000..42514e0ad8
--- /dev/null
+++ b/patterns/design-patterns-behavioral/README.md
@@ -0,0 +1,11 @@
+### Relevant Articles:
+- [The Observer Pattern in Java](https://www.baeldung.com/java-observer-pattern)
+- [Visitor Design Pattern in Java](https://www.baeldung.com/java-visitor-pattern)
+- [Interpreter Design Pattern in Java](https://www.baeldung.com/java-interpreter-pattern)
+- [State Design Pattern in Java](https://www.baeldung.com/java-state-design-pattern)
+- [Implementing the Template Method Pattern in Java](https://www.baeldung.com/java-template-method-pattern)
+- [Chain of Responsibility Design Pattern in Java](https://www.baeldung.com/chain-of-responsibility-pattern)
+- [The Command Pattern in Java](https://www.baeldung.com/java-command-pattern)
+- [The Mediator Pattern in Java](https://www.baeldung.com/java-mediator-pattern)
+- [Introduction to the Null Object Pattern](https://www.baeldung.com/java-null-object-pattern)
+- [Avoid Check for Null Statement in Java](https://www.baeldung.com/java-avoid-null-check)
diff --git a/patterns/design-patterns-2/pom.xml b/patterns/design-patterns-behavioral/pom.xml
similarity index 69%
rename from patterns/design-patterns-2/pom.xml
rename to patterns/design-patterns-behavioral/pom.xml
index f99bb4dc9c..d6603f94ec 100644
--- a/patterns/design-patterns-2/pom.xml
+++ b/patterns/design-patterns-behavioral/pom.xml
@@ -2,9 +2,9 @@
4.0.0
- design-patterns-2
+ design-patterns-behavioral1.0
- design-patterns-2
+ design-patterns-behavioraljar
@@ -31,32 +31,21 @@
commons-lang3${commons-lang3.version}
+
org.assertjassertj-core
- ${assertj.version}
+ ${assertj-core.version}test
-
-
- org.inferred
- freebuilder
- ${freebuilder.version}
- true
-
-
- com.google.code.findbugs
- jsr305
- ${javax.annotations.version}
-
+
UTF-81.81.8
+
16.0.2
- 3.12.2
- 2.4.1
- 3.0.2
+ 3.9.1
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/client/TextFileApplication.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/client/TextFileApplication.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/command/client/TextFileApplication.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/client/TextFileApplication.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/command/TextFileOperation.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/TextFileOperation.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/command/command/TextFileOperation.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/TextFileOperation.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/receiver/TextFile.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/receiver/TextFile.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/command/receiver/TextFile.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/receiver/TextFile.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Context.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Context.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Expression.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Expression.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/From.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/From.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/InterpreterDemo.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/InterpreterDemo.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Row.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Row.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Select.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Select.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Where.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Where.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Button.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Button.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Button.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Button.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Fan.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Fan.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Fan.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Fan.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Mediator.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Mediator.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Mediator.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Mediator.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/PowerSupplier.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/PowerSupplier.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/PowerSupplier.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/PowerSupplier.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/JmsRouter.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/JmsRouter.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Message.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Message.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/NullRouter.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/NullRouter.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Router.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Router.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RouterFactory.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RouterFactory.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RoutingHandler.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RoutingHandler.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/SmsRouter.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/SmsRouter.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/APIContracts.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/APIContracts.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/APIContracts.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/APIContracts.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Assertions.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Assertions.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Assertions.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Assertions.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/EmptyCollections.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/EmptyCollections.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/EmptyCollections.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/EmptyCollections.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Preconditions.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Preconditions.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Preconditions.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Preconditions.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingLombok.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingLombok.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingLombok.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingLombok.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingObjects.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingObjects.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingObjects.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingObjects.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingOptional.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingOptional.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingStringUtils.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingStringUtils.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingStringUtils.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingStringUtils.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/Channel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/Channel.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/Channel.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/Channel.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/NewsAgency.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsAgency.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/NewsAgency.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsAgency.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/NewsChannel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsChannel.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/NewsChannel.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsChannel.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsAgency.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsAgency.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsAgency.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsAgency.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsChannel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsChannel.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsChannel.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsChannel.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsAgency.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsAgency.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsAgency.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsAgency.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsChannel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsChannel.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsChannel.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsChannel.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/DeliveredState.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/DeliveredState.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/OrderedState.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/OrderedState.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/Package.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/state/Package.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/Package.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/PackageState.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/PackageState.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/ReceivedState.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/ReceivedState.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/StateDemo.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/StateDemo.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/application/Application.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/application/Application.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/application/Application.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/application/Application.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/Computer.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/Computer.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/Computer.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/Computer.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Document.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Document.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Element.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Element.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/ElementVisitor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/ElementVisitor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/JsonElement.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/JsonElement.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Visitor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Visitor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/VisitorDemo.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/VisitorDemo.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/XmlElement.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java
rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/XmlElement.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java
rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java
diff --git a/patterns/design-patterns-creational/README.md b/patterns/design-patterns-creational/README.md
new file mode 100644
index 0000000000..99b9b39787
--- /dev/null
+++ b/patterns/design-patterns-creational/README.md
@@ -0,0 +1,9 @@
+### Relevant Articles:
+- [Singletons in Java](https://www.baeldung.com/java-singleton)
+- [Introduction to Creational Design Patterns](https://www.baeldung.com/creational-design-patterns)
+- [Abstract Factory Pattern in Java](https://www.baeldung.com/java-abstract-factory-pattern)
+- [Flyweight Pattern in Java](https://www.baeldung.com/java-flyweight)
+- [Double-Checked Locking with Singleton](https://www.baeldung.com/java-singleton-double-checked-locking)
+- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods)
+- [Automatic Generation of the Builder Pattern with FreeBuilder](https://www.baeldung.com/java-builder-pattern-freebuilder)
+- [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements)
\ No newline at end of file
diff --git a/patterns/design-patterns-creational/pom.xml b/patterns/design-patterns-creational/pom.xml
new file mode 100644
index 0000000000..351f69f749
--- /dev/null
+++ b/patterns/design-patterns-creational/pom.xml
@@ -0,0 +1,47 @@
+
+
+ 4.0.0
+ design-patterns-creational
+ 1.0
+ design-patterns-creational
+ jar
+
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ org.inferred
+ freebuilder
+ ${freebuilder.version}
+ true
+
+
+ com.google.code.findbugs
+ jsr305
+ ${javax.annotations.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+ 2.4.1
+ 3.0.2
+ 3.9.1
+
+
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java
similarity index 97%
rename from patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java
index d19772072f..8730542dcb 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java
+++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java
@@ -1,12 +1,12 @@
-package com.baeldung.constructorsstaticfactorymethods.application;
-
-import com.baeldung.constructorsstaticfactorymethods.entities.User;
-
-public class Application {
-
- public static void main(String[] args) {
- User user1 = User.createWithDefaultCountry("John", "john@domain.com");
- User user2 = User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina");
- User user3 = User.getSingletonInstance("John", "john@domain.com", "Argentina");
- }
+package com.baeldung.constructorsstaticfactorymethods.application;
+
+import com.baeldung.constructorsstaticfactorymethods.entities.User;
+
+public class Application {
+
+ public static void main(String[] args) {
+ User user1 = User.createWithDefaultCountry("John", "john@domain.com");
+ User user2 = User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina");
+ User user3 = User.getSingletonInstance("John", "john@domain.com", "Argentina");
+ }
}
\ No newline at end of file
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java
similarity index 96%
rename from patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java
index 4036b622c6..f05a3baaa3 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java
+++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java
@@ -1,63 +1,63 @@
-package com.baeldung.constructorsstaticfactorymethods.entities;
-
-import java.time.LocalTime;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
-
-public class User {
-
- private static volatile User instance = null;
- private static final Logger LOGGER = Logger.getLogger(User.class.getName());
- private final String name;
- private final String email;
- private final String country;
-
- public static User createWithDefaultCountry(String name, String email) {
- return new User(name, email, "Argentina");
- }
-
- public static User createWithLoggedInstantiationTime(String name, String email, String country) {
- setLoggerProperties();
- LOGGER.log(Level.INFO, "Creating User instance at : {0}", LocalTime.now());
- return new User(name, email, country);
- }
-
- public static User getSingletonInstance(String name, String email, String country) {
- if (instance == null) {
- synchronized (User.class) {
- if (instance == null) {
- instance = new User(name, email, country);
- }
- }
- }
- return instance;
-
- }
-
- private User(String name, String email, String country) {
- this.name = name;
- this.email = email;
- this.country = country;
- }
-
- public String getName() {
- return name;
- }
-
- public String getEmail() {
- return email;
- }
-
- public String getCountry() {
- return country;
- }
-
- private static void setLoggerProperties() {
- ConsoleHandler handler = new ConsoleHandler();
- handler.setLevel(Level.INFO);
- handler.setFormatter(new SimpleFormatter());
- LOGGER.addHandler(handler);
- }
-}
+package com.baeldung.constructorsstaticfactorymethods.entities;
+
+import java.time.LocalTime;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
+
+public class User {
+
+ private static volatile User instance = null;
+ private static final Logger LOGGER = Logger.getLogger(User.class.getName());
+ private final String name;
+ private final String email;
+ private final String country;
+
+ public static User createWithDefaultCountry(String name, String email) {
+ return new User(name, email, "Argentina");
+ }
+
+ public static User createWithLoggedInstantiationTime(String name, String email, String country) {
+ setLoggerProperties();
+ LOGGER.log(Level.INFO, "Creating User instance at : {0}", LocalTime.now());
+ return new User(name, email, country);
+ }
+
+ public static User getSingletonInstance(String name, String email, String country) {
+ if (instance == null) {
+ synchronized (User.class) {
+ if (instance == null) {
+ instance = new User(name, email, country);
+ }
+ }
+ }
+ return instance;
+
+ }
+
+ private User(String name, String email, String country) {
+ this.name = name;
+ this.email = email;
+ this.country = country;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ private static void setLoggerProperties() {
+ ConsoleHandler handler = new ConsoleHandler();
+ handler.setLevel(Level.INFO);
+ handler.setFormatter(new SimpleFormatter());
+ LOGGER.addHandler(handler);
+ }
+}
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Animal.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Animal.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Animal.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Animal.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Brown.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Brown.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Brown.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Brown.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Color.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Color.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Color.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Color.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Dog.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Dog.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Dog.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Dog.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Duck.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Duck.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Duck.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Duck.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/White.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/White.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/White.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/White.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BankAccount.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BankAccount.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BankAccount.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BankAccount.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/FactoryDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/FactoryDriver.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/FactoryDriver.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/FactoryDriver.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Heptagon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Heptagon.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Heptagon.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Heptagon.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Octagon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Octagon.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Octagon.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Octagon.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Pentagon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Pentagon.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Pentagon.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Pentagon.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Polygon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Polygon.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Polygon.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Polygon.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/PolygonFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/PolygonFactory.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/PolygonFactory.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/PolygonFactory.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Square.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Square.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Square.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Square.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Triangle.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Triangle.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Triangle.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Triangle.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/Singleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/Singleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/Singleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/Singleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Car.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Car.java
similarity index 95%
rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/Car.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Car.java
index a0b1a7cdf5..80ef992abb 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Car.java
+++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Car.java
@@ -2,8 +2,6 @@ package com.baeldung.flyweight;
import java.awt.Color;
-import javax.annotation.concurrent.Immutable;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,7 +10,6 @@ import org.slf4j.LoggerFactory;
*
* @author Donato Rimenti
*/
-@Immutable
public class Car implements Vehicle {
/**
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Engine.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Engine.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/Engine.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Engine.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Vehicle.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Vehicle.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/Vehicle.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Vehicle.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/VehicleFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/VehicleFactory.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/VehicleFactory.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/VehicleFactory.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Address.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Address.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Employee.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Employee.java
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/builder/Employee.java
similarity index 100%
rename from patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/builder/Employee.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddRule.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddRule.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Addition.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Addition.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Calculator.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Calculator.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Command.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Command.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Division.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Division.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Expression.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Expression.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Modulo.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Modulo.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operator.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operator.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Result.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Result.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Rule.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Rule.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/ClassSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/ClassSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/ClassSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/ClassSingleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/EnumSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/EnumSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/EnumSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/EnumSingleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/Sandbox.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/Sandbox.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/Sandbox.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/Sandbox.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java
rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java
similarity index 97%
rename from patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java
index 0c0266a111..ee8698b18d 100644
--- a/patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java
+++ b/patterns/design-patterns-creational/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java
@@ -1,43 +1,43 @@
-package com.baeldung.constructorsstaticfactorymethods;
-
-import com.baeldung.constructorsstaticfactorymethods.entities.User;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-
-public class UserUnitTest {
-
- @Test
- public void givenUserClass_whenCalledcreateWithDefaultCountry_thenCorrect() {
- assertThat(User.createWithDefaultCountry("John", "john@domain.com")).isInstanceOf(User.class);
- }
-
- @Test
- public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetName_thenCorrect() {
- User user = User.createWithDefaultCountry("John", "john@domain.com");
- assertThat(user.getName()).isEqualTo("John");
- }
-
- @Test
- public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetEmail_thenCorrect() {
- User user = User.createWithDefaultCountry("John", "john@domain.com");
- assertThat(user.getEmail()).isEqualTo("john@domain.com");
- }
-
- @Test
- public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetCountry_thenCorrect() {
- User user = User.createWithDefaultCountry("John", "john@domain.com");
- assertThat(user.getCountry()).isEqualTo("Argentina");
- }
-
- @Test
- public void givenUserInstanceCreatedWithcreateWithInstantiationTime_whenCalledcreateWithInstantiationTime_thenCorrect() {
- assertThat(User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina")).isInstanceOf(User.class);
- }
-
- @Test
- public void givenUserInstanceCreatedWithgetSingletonIntance_whenCalledgetSingletonInstance_thenCorrect() {
- User user1 = User.getSingletonInstance("John", "john@domain.com", "Argentina");
- User user2 = User.getSingletonInstance("John", "john@domain.com", "Argentina");
- assertThat(user1).isEqualTo(user2);
- }
+package com.baeldung.constructorsstaticfactorymethods;
+
+import com.baeldung.constructorsstaticfactorymethods.entities.User;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
+
+public class UserUnitTest {
+
+ @Test
+ public void givenUserClass_whenCalledcreateWithDefaultCountry_thenCorrect() {
+ assertThat(User.createWithDefaultCountry("John", "john@domain.com")).isInstanceOf(User.class);
+ }
+
+ @Test
+ public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetName_thenCorrect() {
+ User user = User.createWithDefaultCountry("John", "john@domain.com");
+ assertThat(user.getName()).isEqualTo("John");
+ }
+
+ @Test
+ public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetEmail_thenCorrect() {
+ User user = User.createWithDefaultCountry("John", "john@domain.com");
+ assertThat(user.getEmail()).isEqualTo("john@domain.com");
+ }
+
+ @Test
+ public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetCountry_thenCorrect() {
+ User user = User.createWithDefaultCountry("John", "john@domain.com");
+ assertThat(user.getCountry()).isEqualTo("Argentina");
+ }
+
+ @Test
+ public void givenUserInstanceCreatedWithcreateWithInstantiationTime_whenCalledcreateWithInstantiationTime_thenCorrect() {
+ assertThat(User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina")).isInstanceOf(User.class);
+ }
+
+ @Test
+ public void givenUserInstanceCreatedWithgetSingletonIntance_whenCalledgetSingletonInstance_thenCorrect() {
+ User user1 = User.getSingletonInstance("John", "john@domain.com", "Argentina");
+ User user2 = User.getSingletonInstance("John", "john@domain.com", "Argentina");
+ assertThat(user1).isEqualTo(user2);
+ }
}
\ No newline at end of file
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java
diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java
similarity index 100%
rename from patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java
rename to patterns/design-patterns-creational/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java
diff --git a/patterns/design-patterns-functional/README.md b/patterns/design-patterns-functional/README.md
new file mode 100644
index 0000000000..04e21bafd5
--- /dev/null
+++ b/patterns/design-patterns-functional/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Currying in Java](https://www.baeldung.com/java-currying)
diff --git a/patterns/design-patterns-functional/pom.xml b/patterns/design-patterns-functional/pom.xml
new file mode 100644
index 0000000000..5df7cc0cb9
--- /dev/null
+++ b/patterns/design-patterns-functional/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+ design-patterns-functional
+ 1.0
+ design-patterns-functional
+ jar
+
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/currying/Letter.java b/patterns/design-patterns-functional/src/main/java/com/baeldung/currying/Letter.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/currying/Letter.java
rename to patterns/design-patterns-functional/src/main/java/com/baeldung/currying/Letter.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/currying/LetterUnitTest.java b/patterns/design-patterns-functional/src/test/java/com/baeldung/currying/LetterUnitTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/currying/LetterUnitTest.java
rename to patterns/design-patterns-functional/src/test/java/com/baeldung/currying/LetterUnitTest.java
diff --git a/patterns/design-patterns-structural/README.md b/patterns/design-patterns-structural/README.md
new file mode 100644
index 0000000000..91620a522e
--- /dev/null
+++ b/patterns/design-patterns-structural/README.md
@@ -0,0 +1,7 @@
+### Relevant Articles:
+- [Facade Design Pattern in Java](https://www.baeldung.com/java-facade-pattern)
+- [Proxy, Decorator, Adapter and Bridge Patterns](https://www.baeldung.com/java-structural-design-patterns)
+- [Composite Design Pattern in Java](https://www.baeldung.com/java-composite-pattern)
+- [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern)
+- [The Adapter Pattern in Java](https://www.baeldung.com/java-adapter-pattern)
+- [The Proxy Pattern in Java](https://www.baeldung.com/java-proxy-pattern)
diff --git a/patterns/design-patterns-structural/pom.xml b/patterns/design-patterns-structural/pom.xml
new file mode 100644
index 0000000000..63806058c9
--- /dev/null
+++ b/patterns/design-patterns-structural/pom.xml
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+ design-patterns-structural
+ 1.0
+ design-patterns-structural
+ jar
+
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java
similarity index 94%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java
index a4e10a0868..9f696a5f40 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java
+++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java
@@ -1,6 +1,6 @@
package com.baeldung.adapter;
-import static com.baeldung.util.LogerUtil.LOG;
+import static com.baeldung.util.LoggerUtil.LOG;
public class AdapterPatternDriver {
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/AstonMartin.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AstonMartin.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/AstonMartin.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AstonMartin.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/BugattiVeyron.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/BugattiVeyron.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/BugattiVeyron.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/BugattiVeyron.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/McLaren.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/McLaren.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/McLaren.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/McLaren.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/Movable.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/Movable.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/Movable.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/Movable.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapter.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapter.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapter.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Blue.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Blue.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Blue.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Blue.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/BridgePatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/BridgePatternDriver.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Color.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Color.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Color.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Color.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Red.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Red.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Red.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Red.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Shape.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Shape.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Shape.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Shape.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Square.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Square.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Square.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Square.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Triangle.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Triangle.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Triangle.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Triangle.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/CompositeDemo.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/CompositeDemo.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/composite/CompositeDemo.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/CompositeDemo.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/Department.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/Department.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/composite/Department.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/Department.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/FinancialDepartment.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/composite/FinancialDepartment.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/HeadDepartment.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/HeadDepartment.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/composite/HeadDepartment.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/HeadDepartment.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/SalesDepartment.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/composite/SalesDepartment.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/BubbleLights.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/BubbleLights.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/BubbleLights.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/BubbleLights.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTree.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTree.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTree.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTree.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java
similarity index 90%
rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java
index c20c23ff6e..6a9da7c78c 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java
+++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java
@@ -1,6 +1,6 @@
package com.baeldung.decorator;
-import static com.baeldung.util.LogerUtil.LOG;
+import static com.baeldung.util.LoggerUtil.LOG;
public class DecoratorPatternDriver {
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/Garland.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/Garland.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/Garland.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/Garland.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/TreeDecorator.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/TreeDecorator.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/TreeDecorator.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/TreeDecorator.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/CarEngineFacade.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/CarEngineFacade.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/CarEngineFacade.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/CarEngineFacade.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CoolingController.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CoolingController.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CoolingController.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CoolingController.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelPump.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelPump.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelPump.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelPump.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Radiator.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Radiator.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Radiator.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Radiator.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Starter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Starter.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Starter.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Starter.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObject.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObject.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObject.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObject.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java
similarity index 88%
rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java
index 7ade31da88..6d38672a63 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java
+++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java
@@ -1,6 +1,6 @@
package com.baeldung.proxy;
-import static com.baeldung.util.LogerUtil.LOG;;
+import static com.baeldung.util.LoggerUtil.LOG;
public class ExpensiveObjectImpl implements ExpensiveObject {
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java
similarity index 100%
rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/util/LogerUtil.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java
similarity index 87%
rename from patterns/design-patterns/src/main/java/com/baeldung/util/LogerUtil.java
rename to patterns/design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java
index 7217a4bc40..9702cba0f5 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/util/LogerUtil.java
+++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java
@@ -8,7 +8,7 @@ import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
-public class LogerUtil {
+public class LoggerUtil {
public final static Logger LOG = Logger.getLogger("GLOBAL");
@@ -22,7 +22,7 @@ public class LogerUtil {
props.load(
new BufferedReader(
new InputStreamReader(
- LogerUtil.class.getResourceAsStream("/log4jstructuraldp.properties")
+ LoggerUtil.class.getResourceAsStream("/log4jstructuraldp.properties")
)
)
);
diff --git a/patterns/design-patterns/src/main/resources/log4jstructuraldp.properties b/patterns/design-patterns-structural/src/main/resources/log4jstructuraldp.properties
similarity index 100%
rename from patterns/design-patterns/src/main/resources/log4jstructuraldp.properties
rename to patterns/design-patterns-structural/src/main/resources/log4jstructuraldp.properties
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/AdapterPatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/adapter/AdapterPatternIntegrationTest.java
similarity index 75%
rename from patterns/design-patterns/src/test/java/com/baeldung/AdapterPatternIntegrationTest.java
rename to patterns/design-patterns-structural/src/test/java/com/baeldung/adapter/AdapterPatternIntegrationTest.java
index 78a1492d83..536caf7341 100644
--- a/patterns/design-patterns/src/test/java/com/baeldung/AdapterPatternIntegrationTest.java
+++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/adapter/AdapterPatternIntegrationTest.java
@@ -1,16 +1,9 @@
-package com.baeldung;
+package com.baeldung.adapter;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import com.baeldung.adapter.AstonMartin;
-import com.baeldung.adapter.BugattiVeyron;
-import com.baeldung.adapter.McLaren;
-import com.baeldung.adapter.Movable;
-import com.baeldung.adapter.MovableAdapter;
-import com.baeldung.adapter.MovableAdapterImpl;
-
public class AdapterPatternIntegrationTest {
@Test
public void givenMovableAdapter_WhenConvertingMPHToKMPH_thenSuccessfullyConverted() {
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/BridgePatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/bridge/BridgePatternIntegrationTest.java
similarity index 72%
rename from patterns/design-patterns/src/test/java/com/baeldung/BridgePatternIntegrationTest.java
rename to patterns/design-patterns-structural/src/test/java/com/baeldung/bridge/BridgePatternIntegrationTest.java
index adcb5cdd2c..814a91c070 100644
--- a/patterns/design-patterns/src/test/java/com/baeldung/BridgePatternIntegrationTest.java
+++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/bridge/BridgePatternIntegrationTest.java
@@ -1,15 +1,9 @@
-package com.baeldung;
+package com.baeldung.bridge;
import static org.junit.Assert.*;
import org.junit.Test;
-import com.baeldung.bridge.Blue;
-import com.baeldung.bridge.Red;
-import com.baeldung.bridge.Shape;
-import com.baeldung.bridge.Square;
-import com.baeldung.bridge.Triangle;
-
public class BridgePatternIntegrationTest {
@Test
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/DecoratorPatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/decorator/DecoratorPatternIntegrationTest.java
similarity index 75%
rename from patterns/design-patterns/src/test/java/com/baeldung/DecoratorPatternIntegrationTest.java
rename to patterns/design-patterns-structural/src/test/java/com/baeldung/decorator/DecoratorPatternIntegrationTest.java
index 23a717ae2e..0f2e262346 100644
--- a/patterns/design-patterns/src/test/java/com/baeldung/DecoratorPatternIntegrationTest.java
+++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/decorator/DecoratorPatternIntegrationTest.java
@@ -1,14 +1,9 @@
-package com.baeldung;
+package com.baeldung.decorator;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import com.baeldung.decorator.BubbleLights;
-import com.baeldung.decorator.ChristmasTree;
-import com.baeldung.decorator.ChristmasTreeImpl;
-import com.baeldung.decorator.Garland;
-
public class DecoratorPatternIntegrationTest {
@Test
public void givenDecoratorPattern_WhenDecoratorsInjectedAtRuntime_thenConfigSuccess() {
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java
similarity index 100%
rename from patterns/design-patterns/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java
rename to patterns/design-patterns-structural/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/ProxyPatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/ProxyPatternIntegrationTest.java
similarity index 87%
rename from patterns/design-patterns/src/test/java/com/baeldung/ProxyPatternIntegrationTest.java
rename to patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/ProxyPatternIntegrationTest.java
index c035793b64..6db19f7cea 100644
--- a/patterns/design-patterns/src/test/java/com/baeldung/ProxyPatternIntegrationTest.java
+++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/ProxyPatternIntegrationTest.java
@@ -1,6 +1,6 @@
-package com.baeldung;
+package com.baeldung.proxy;
-import static com.baeldung.util.LogerUtil.LOG;
+import static com.baeldung.util.LoggerUtil.LOG;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@@ -11,9 +11,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import com.baeldung.proxy.ExpensiveObject;
-import com.baeldung.proxy.ExpensiveObjectProxy;
-
public class ProxyPatternIntegrationTest {
public static TestAppenderDP appender;
diff --git a/patterns/design-patterns/src/test/java/com/baeldung/TestAppenderDP.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/TestAppenderDP.java
similarity index 95%
rename from patterns/design-patterns/src/test/java/com/baeldung/TestAppenderDP.java
rename to patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/TestAppenderDP.java
index 2b3bc47292..1c6d9a2064 100644
--- a/patterns/design-patterns/src/test/java/com/baeldung/TestAppenderDP.java
+++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/TestAppenderDP.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.proxy;
import java.util.ArrayList;
import java.util.List;
diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md
deleted file mode 100644
index 1c611f05d2..0000000000
--- a/patterns/design-patterns/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-### Relevant Articles:
-- [Facade Design Pattern in Java](http://www.baeldung.com/java-facade-pattern)
-- [Singletons in Java](http://www.baeldung.com/java-singleton)
-- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns)
-- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns)
-- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern)
-- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight)
-- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern)
-- [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking)
-- [Composite Design Pattern in Java](http://www.baeldung.com/java-composite-pattern)
-- [Visitor Design Pattern in Java](http://www.baeldung.com/java-visitor-pattern)
-- [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern)
-- [Interpreter Design Pattern in Java](http://www.baeldung.com/java-interpreter-pattern)
-- [State Design Pattern in Java](https://www.baeldung.com/java-state-design-pattern)
-- [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern)
-- [Abstract Factory Pattern in Java](https://www.baeldung.com/java-abstract-factory-pattern)
-- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/java-template-method-pattern)
-- [Chain of Responsibility Design Pattern in Java](http://www.baeldung.com/chain-of-responsibility-pattern)
-- [The Command Pattern in Java](http://www.baeldung.com/java-command-pattern)
-- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods)
-- [The Adapter Pattern in Java](https://www.baeldung.com/java-adapter-pattern)
-- [Currying in Java](https://www.baeldung.com/java-currying)
-- [The Proxy Pattern in Java](https://www.baeldung.com/java-proxy-pattern)
diff --git a/patterns/dipmodular/README.md b/patterns/dipmodular/README.md
new file mode 100644
index 0000000000..ba46158b8c
--- /dev/null
+++ b/patterns/dipmodular/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles:
+
+- [The Dependency Inversion Principle in Java](https://www.baeldung.com/java-dependency-inversion-principle)
diff --git a/patterns/pom.xml b/patterns/pom.xml
index 7f7368ca07..196c3c3319 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -16,8 +16,12 @@
front-controllerintercepting-filter
- design-patterns
- design-patterns-2
+ design-patterns-architectural
+ design-patterns-behavioral
+ design-patterns-behavioral-2
+ design-patterns-creational
+ design-patterns-functional
+ design-patterns-structuralsoliddipbackoff-jitter
diff --git a/pdf/README.md b/pdf/README.md
index 5454d2b2de..8525dc4f69 100644
--- a/pdf/README.md
+++ b/pdf/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [PDF Conversions in Java](http://www.baeldung.com/pdf-conversions-java)
-- [Creating PDF Files in Java](http://www.baeldung.com/java-pdf-creation)
+- [PDF Conversions in Java](https://www.baeldung.com/pdf-conversions-java)
+- [Creating PDF Files in Java](https://www.baeldung.com/java-pdf-creation)
diff --git a/performance-tests/README.md b/performance-tests/README.md
index 0064157966..918c81bb69 100644
--- a/performance-tests/README.md
+++ b/performance-tests/README.md
@@ -1,10 +1,10 @@
### Relevant Articles:
-- [Performance of Java Mapping Frameworks](http://www.baeldung.com/java-performance-mapping-frameworks)
+- [Performance of Java Mapping Frameworks](https://www.baeldung.com/java-performance-mapping-frameworks)
### Running
To run the performance benchmarks:
1: `mvn clean install`
-2: `java -jar target/benchmarks.jar`
\ No newline at end of file
+2: `java -jar target/benchmarks.jar`
diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md
index 99374f9135..3271f0c1b6 100644
--- a/persistence-modules/hibernate-mapping/README.md
+++ b/persistence-modules/hibernate-mapping/README.md
@@ -1,7 +1,10 @@
+## Hibernate Mapping
+
+This module contains articles about Object-relational Mapping (ORM) with Hibernate.
### Relevant Articles:
- [Persisting Maps with Hibernate](https://www.baeldung.com/hibernate-persisting-maps)
- [Difference Between @Size, @Length, and @Column(length=value)](https://www.baeldung.com/jpa-size-length-column-differences)
- [Hibernate Validator Specific Constraints](https://www.baeldung.com/hibernate-validator-constraints)
-- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many)
\ No newline at end of file
+- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many)
diff --git a/persistence-modules/hibernate-parameters/pom.xml b/persistence-modules/hibernate-parameters/pom.xml
new file mode 100644
index 0000000000..b744e181da
--- /dev/null
+++ b/persistence-modules/hibernate-parameters/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+ com.baeldung
+ hibernate-parameters
+ 0.1-SNAPSHOT
+ hibernate-parameters
+ jar
+ Hibernate tutorial illustrating the use of named parameters
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+ org.hibernate
+ hibernate-core
+ 5.4.4.Final
+
+
+
+ com.h2database
+ h2
+ 1.4.196
+
+
+
+
+
+
+ false
+ src/test/java
+
+ **/*.xml
+
+
+
+ src/test/resources
+
+
+
+
+
+ true
+
+
+
diff --git a/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml
new file mode 100644
index 0000000000..4055718776
--- /dev/null
+++ b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java
new file mode 100644
index 0000000000..f44b1bfd8a
--- /dev/null
+++ b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java
@@ -0,0 +1,30 @@
+package com.baeldung.hibernate_parameters;
+
+public class Event {
+ private Long id;
+
+ private String title;
+
+ public Event() {
+ }
+
+ public Event(String title) {
+ this.title = title;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ private void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java
new file mode 100644
index 0000000000..23854dc393
--- /dev/null
+++ b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.hibernate_parameters;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistry;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.query.Query;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+public class NamedParameterUnitTest {
+ private SessionFactory sessionFactory;
+
+ @Before
+ public void setUp() throws Exception {
+ final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
+ .configure()
+ .build();
+ try {
+ sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ session.save(new Event("Event 1"));
+ session.save(new Event("Event 2"));
+ session.getTransaction().commit();
+ session.close();
+ } catch (Exception e) {
+ StandardServiceRegistryBuilder.destroy(registry);
+ }
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (sessionFactory != null) {
+ sessionFactory.close();
+ }
+ }
+
+ @Test
+ public void whenNamedParameterProvided_thenCorrect() {
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);
+
+ // This binds the value "Event1" to the parameter :eventTitle
+ query.setParameter("eventTitle", "Event 1");
+
+ assertEquals(1, query.list().size());
+ session.getTransaction().commit();
+ session.close();
+ }
+
+ @Test(expected = org.hibernate.QueryException.class)
+ public void whenNamedParameterMissing_thenThrowsQueryException() {
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);
+
+ try {
+ query.list();
+ fail("We are expecting an exception!");
+ } finally {
+ session.getTransaction().commit();
+ session.close();
+ }
+ }
+}
diff --git a/persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml b/persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml
new file mode 100644
index 0000000000..480baae4c1
--- /dev/null
+++ b/persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ org.h2.Driver
+ jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE
+ sa
+
+
+ 1
+
+ org.hibernate.dialect.H2Dialect
+
+ org.hibernate.cache.internal.NoCacheProvider
+
+ true
+
+ create
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md
index 65322f0cea..a8e2eae38b 100644
--- a/persistence-modules/hibernate5/README.md
+++ b/persistence-modules/hibernate5/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Hibernate 5
+
+This module contains articles about Hibernate 5.
+
+### Relevant articles:
- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping)
- [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers)
diff --git a/persistence-modules/java-cassandra/README.md b/persistence-modules/java-cassandra/README.md
index 3ab6f5f099..f3710c9d69 100644
--- a/persistence-modules/java-cassandra/README.md
+++ b/persistence-modules/java-cassandra/README.md
@@ -1,2 +1,3 @@
### Relevant Articles:
- [A Guide to Cassandra with Java](http://www.baeldung.com/cassandra-with-java)
+- [Intro to DataStax Java Driver for Apache Cassandra](https://www.baeldung.com/cassandra-datastax-java-driver)
diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml
index e7c93bc4e5..3f8367d130 100644
--- a/persistence-modules/java-cassandra/pom.xml
+++ b/persistence-modules/java-cassandra/pom.xml
@@ -35,6 +35,11 @@
java-driver-core${datastax-cassandra.version}
+
+ com.datastax.oss
+ java-driver-query-builder
+ ${datastax-cassandra.version}
+ io.netty
diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java
index 23140e0455..f067ee8b73 100644
--- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java
+++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java
@@ -26,7 +26,7 @@ public class Application {
KeyspaceRepository keyspaceRepository = new KeyspaceRepository(session);
- keyspaceRepository.createKeyspace("testKeyspace", "SimpleStrategy", 1);
+ keyspaceRepository.createKeyspace("testKeyspace", 1);
keyspaceRepository.useKeyspace("testKeyspace");
VideoRepository videoRepository = new VideoRepository(session);
diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java
index fd4581d055..899481738a 100644
--- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java
+++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java
@@ -1,7 +1,11 @@
package com.baeldung.datastax.cassandra.repository;
+import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.CqlSession;
+import com.datastax.oss.driver.api.querybuilder.SchemaBuilder;
+import com.datastax.oss.driver.api.querybuilder.schema.CreateKeyspace;
+
public class KeyspaceRepository {
private final CqlSession session;
@@ -9,19 +13,15 @@ public class KeyspaceRepository {
this.session = session;
}
- public void createKeyspace(String keyspaceName, String replicationStrategy, int numberOfReplicas) {
- StringBuilder sb = new StringBuilder("CREATE KEYSPACE IF NOT EXISTS ").append(keyspaceName)
- .append(" WITH replication = {")
- .append("'class':'").append(replicationStrategy)
- .append("','replication_factor':").append(numberOfReplicas)
- .append("};");
+ public void createKeyspace(String keyspaceName, int numberOfReplicas) {
+ CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName)
+ .ifNotExists()
+ .withSimpleStrategy(numberOfReplicas);
- final String query = sb.toString();
-
- session.execute(query);
+ session.execute(createKeyspace.build());
}
public void useKeyspace(String keyspace) {
- session.execute("USE " + keyspace);
+ session.execute("USE " + CqlIdentifier.fromCql(keyspace));
}
}
diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java
index 9a09d77072..48eb000eba 100644
--- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java
+++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java
@@ -7,6 +7,12 @@ import com.datastax.oss.driver.api.core.cql.BoundStatement;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
import com.datastax.oss.driver.api.core.cql.ResultSet;
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
+import com.datastax.oss.driver.api.core.type.DataTypes;
+import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
+import com.datastax.oss.driver.api.querybuilder.SchemaBuilder;
+import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert;
+import com.datastax.oss.driver.api.querybuilder.schema.CreateTable;
+import com.datastax.oss.driver.api.querybuilder.select.Select;
import java.util.ArrayList;
import java.util.List;
@@ -27,15 +33,12 @@ public class VideoRepository {
}
public void createTable(String keyspace) {
- StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME).append(" (")
- .append("video_id UUID,")
- .append("title TEXT,")
- .append("creation_date TIMESTAMP,")
- .append("PRIMARY KEY(video_id));");
+ CreateTable createTable = SchemaBuilder.createTable(TABLE_NAME).ifNotExists()
+ .withPartitionKey("video_id", DataTypes.UUID)
+ .withColumn("title", DataTypes.TEXT)
+ .withColumn("creation_date", DataTypes.TIMESTAMP);
- String query = sb.toString();
-
- executeStatement(SimpleStatement.newInstance(query), keyspace);
+ executeStatement(createTable.build(), keyspace);
}
public UUID insertVideo(Video video) {
@@ -47,17 +50,23 @@ public class VideoRepository {
video.setId(videoId);
- String absoluteTableName = keyspace != null ? keyspace + "." + TABLE_NAME: TABLE_NAME;
+ RegularInsert insertInto = QueryBuilder.insertInto(TABLE_NAME)
+ .value("video_id", QueryBuilder.bindMarker())
+ .value("title", QueryBuilder.bindMarker())
+ .value("creation_date", QueryBuilder.bindMarker());
- StringBuilder sb = new StringBuilder("INSERT INTO ").append(absoluteTableName)
- .append("(video_id, title, creation_date) values (:video_id, :title, :creation_date)");
+ SimpleStatement insertStatement = insertInto.build();
- PreparedStatement preparedStatement = session.prepare(sb.toString());
+ if (keyspace != null) {
+ insertStatement = insertStatement.setKeyspace(keyspace);
+ }
+
+ PreparedStatement preparedStatement = session.prepare(insertStatement);
BoundStatement statement = preparedStatement.bind()
- .setUuid("video_id", video.getId())
- .setString("title", video.getTitle())
- .setInstant("creation_date", video.getCreationDate());
+ .setUuid(0, video.getId())
+ .setString(1, video.getTitle())
+ .setInstant(2, video.getCreationDate());
session.execute(statement);
@@ -69,11 +78,9 @@ public class VideoRepository {
}
public List
diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml
index 388abafdaf..fd48a47f12 100644
--- a/persistence-modules/r2dbc/pom.xml
+++ b/persistence-modules/r2dbc/pom.xml
@@ -17,6 +17,7 @@
1.8
+ 0.8.0.M8
@@ -41,7 +42,7 @@
io.r2dbcr2dbc-h2
- 0.8.0.M8
+ ${r2dbc-h2.version}
diff --git a/persistence-modules/sirix/pom.xml b/persistence-modules/sirix/pom.xml
index 677c5b8f3a..8de961120f 100644
--- a/persistence-modules/sirix/pom.xml
+++ b/persistence-modules/sirix/pom.xml
@@ -20,7 +20,7 @@
io.sirixsirix-core
- 0.9.3
+ ${sirix-core.version}
@@ -48,5 +48,6 @@
UTF-811
+ 0.9.3
diff --git a/persistence-modules/spring-boot-jdbi/HELP.md b/persistence-modules/spring-boot-jdbi/HELP.md
new file mode 100644
index 0000000000..d5a5463718
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/HELP.md
@@ -0,0 +1,9 @@
+# Getting Started
+
+### Reference Documentation
+For further reference, please consider the following sections:
+
+* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
+* [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using-boot-devtools)
+* [Spring Configuration Processor](https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#configuration-metadata-annotation-processor)
+
diff --git a/persistence-modules/spring-boot-jdbi/pom.xml b/persistence-modules/spring-boot-jdbi/pom.xml
new file mode 100644
index 0000000000..3f9bc8ab10
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/pom.xml
@@ -0,0 +1,107 @@
+
+
+ 4.0.0
+ com.baeldung.boot.jdbi
+ spring-boot-jdbi
+ 0.0.1-SNAPSHOT
+ spring-boot-jdbi
+ Sample SpringBoot JDBI Project
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../pom.xml
+
+
+
+
+ 1.8
+ 3.9.1
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 2.1.8.RELEASE
+ pom
+ import
+
+
+
+ org.jdbi
+ jdbi3-spring4
+ ${jdbi.version}
+
+
+
+ org.jdbi
+ jdbi3-sqlobject
+ ${jdbi.version}
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+ org.jdbi
+ jdbi3-spring4
+
+
+
+ org.jdbi
+ jdbi3-sqlobject
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java
new file mode 100644
index 0000000000..ddbe6cc118
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java
@@ -0,0 +1,57 @@
+package com.baeldung.boot.jdbi;
+
+import java.util.List;
+
+import javax.sql.DataSource;
+
+import org.jdbi.v3.core.Jdbi;
+import org.jdbi.v3.core.mapper.RowMapper;
+import org.jdbi.v3.core.spi.JdbiPlugin;
+import org.jdbi.v3.sqlobject.SqlObjectPlugin;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import com.baeldung.boot.jdbi.dao.CarMakerDao;
+import com.baeldung.boot.jdbi.dao.CarModelDao;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Configuration
+@Slf4j
+public class JdbiConfiguration {
+ @Bean
+ public Jdbi jdbi(DataSource ds,List jdbiPlugins, List> rowMappers) {
+ TransactionAwareDataSourceProxy proxy = new TransactionAwareDataSourceProxy(ds);
+ Jdbi jdbi = Jdbi.create(proxy);
+
+ // Register all available plugins
+ log.info("[I27] Installing plugins... ({} found)", jdbiPlugins.size());
+ jdbiPlugins.forEach(plugin -> jdbi.installPlugin(plugin));
+
+ // Register all available rowMappers
+ log.info("[I31] Installing rowMappers... ({} found)", rowMappers.size());
+ rowMappers.forEach(mapper -> jdbi.registerRowMapper(mapper));
+
+ return jdbi;
+ }
+
+ @Bean
+ public JdbiPlugin sqlObjectPlugin() {
+ return new SqlObjectPlugin();
+ }
+
+ @Bean
+ public CarMakerDao carMakerDao(Jdbi jdbi) {
+ return jdbi.onDemand(CarMakerDao.class);
+ }
+
+ @Bean
+ public CarModelDao carModelDao(Jdbi jdbi) {
+ return jdbi.onDemand(CarModelDao.class);
+ }
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java
new file mode 100644
index 0000000000..63afe3a3bf
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.boot.jdbi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@EnableTransactionManagement
+public class SpringBootJdbiApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootJdbiApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java
new file mode 100644
index 0000000000..6cc7268144
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java
@@ -0,0 +1,35 @@
+/**
+ *
+ */
+package com.baeldung.boot.jdbi.dao;
+
+import java.util.List;
+
+import org.jdbi.v3.sqlobject.customizer.Bind;
+import org.jdbi.v3.sqlobject.customizer.BindBean;
+import org.jdbi.v3.sqlobject.locator.UseClasspathSqlLocator;
+import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys;
+import org.jdbi.v3.sqlobject.statement.SqlBatch;
+import org.jdbi.v3.sqlobject.statement.SqlQuery;
+import org.jdbi.v3.sqlobject.statement.SqlUpdate;
+
+import com.baeldung.boot.jdbi.domain.CarMaker;
+
+/**
+ * @author Philippe
+ *
+ */
+@UseClasspathSqlLocator
+public interface CarMakerDao {
+
+ @SqlUpdate
+ @GetGeneratedKeys
+ Long insert(@BindBean CarMaker carMaker);
+
+ @SqlBatch("insert")
+ @GetGeneratedKeys
+ List bulkInsert(@BindBean List carMakers);
+
+ @SqlQuery
+ CarMaker findById(@Bind("id") Long id);
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java
new file mode 100644
index 0000000000..18a05c6108
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java
@@ -0,0 +1,28 @@
+package com.baeldung.boot.jdbi.dao;
+
+import java.util.List;
+
+import org.jdbi.v3.sqlobject.customizer.Bind;
+import org.jdbi.v3.sqlobject.customizer.BindBean;
+import org.jdbi.v3.sqlobject.locator.UseClasspathSqlLocator;
+import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys;
+import org.jdbi.v3.sqlobject.statement.SqlBatch;
+import org.jdbi.v3.sqlobject.statement.SqlQuery;
+import org.jdbi.v3.sqlobject.statement.SqlUpdate;
+
+import com.baeldung.boot.jdbi.domain.CarModel;
+
+@UseClasspathSqlLocator
+public interface CarModelDao {
+
+ @SqlUpdate("insert")
+ @GetGeneratedKeys
+ Long insert(@BindBean CarModel carModel);
+
+ @SqlBatch("insert")
+ @GetGeneratedKeys
+ List bulkInsert(@BindBean List models);
+
+ @SqlQuery
+ CarModel findByMakerIdAndSku(@Bind("makerId") Long makerId, @Bind("sku") String sku );
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java
new file mode 100644
index 0000000000..c32b0c30db
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java
@@ -0,0 +1,14 @@
+package com.baeldung.boot.jdbi.domain;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class CarMaker {
+ private Long id;
+ private String name;
+ private List models;
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java
new file mode 100644
index 0000000000..80b615801b
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java
@@ -0,0 +1,14 @@
+package com.baeldung.boot.jdbi.domain;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Builder
+@Data
+public class CarModel {
+ private Long id;
+ private String name;
+ private Integer year;
+ private String sku;
+ private Long makerId;
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java
new file mode 100644
index 0000000000..54fc80d4ab
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java
@@ -0,0 +1,27 @@
+package com.baeldung.boot.jdbi.mapper;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+import org.jdbi.v3.core.mapper.RowMapper;
+import org.jdbi.v3.core.statement.StatementContext;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.boot.jdbi.domain.CarMaker;
+import com.baeldung.boot.jdbi.domain.CarModel;
+
+@Component
+public class CarMakerMapper implements RowMapper {
+
+ @Override
+ public CarMaker map(ResultSet rs, StatementContext ctx) throws SQLException {
+ CarMaker maker = CarMaker.builder()
+ .id(rs.getLong("id"))
+ .name(rs.getString("name"))
+ .models(new ArrayList())
+ .build();
+
+ return maker;
+ }
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java
new file mode 100644
index 0000000000..eeceafd649
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java
@@ -0,0 +1,25 @@
+package com.baeldung.boot.jdbi.mapper;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.jdbi.v3.core.mapper.RowMapper;
+import org.jdbi.v3.core.statement.StatementContext;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.boot.jdbi.domain.CarModel;
+
+@Component
+public class CarModelMapper implements RowMapper{
+
+ @Override
+ public CarModel map(ResultSet rs, StatementContext ctx) throws SQLException {
+ return CarModel.builder()
+ .id(rs.getLong("id"))
+ .name(rs.getString("name"))
+ .sku(rs.getString("sku"))
+ .year(rs.getInt("year"))
+ .build();
+ }
+
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java
new file mode 100644
index 0000000000..a058130563
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package com.baeldung.boot.jdbi.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baeldung.boot.jdbi.dao.CarMakerDao;
+import com.baeldung.boot.jdbi.dao.CarModelDao;
+import com.baeldung.boot.jdbi.domain.CarMaker;
+import com.baeldung.boot.jdbi.domain.CarModel;
+
+/**
+ * @author Philippe
+ *
+ */
+@Service
+public class CarMakerService {
+
+ private CarMakerDao carMakerDao;
+ private CarModelDao carModelDao;
+
+ public CarMakerService(CarMakerDao carMakerDao,CarModelDao carModelDao) {
+
+ this.carMakerDao = carMakerDao;
+ this.carModelDao = carModelDao;
+ }
+
+ @Transactional
+ public int bulkInsert(CarMaker carMaker) {
+ Long carMakerId;
+ if (carMaker.getId() == null ) {
+ carMakerId = carMakerDao.insert(carMaker);
+ carMaker.setId(carMakerId);
+ }
+
+ // Make sure all models belong to the same maker
+ carMaker.getModels().forEach(m -> {
+ m.setMakerId(carMaker.getId());
+ carModelDao.insert(m);
+ });
+
+ return carMaker.getModels().size();
+ }
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/application.yml b/persistence-modules/spring-boot-jdbi/src/main/resources/application.yml
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/resources/application.yml
@@ -0,0 +1 @@
+
diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql
new file mode 100644
index 0000000000..b36659110a
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql
@@ -0,0 +1,11 @@
+--
+-- findById
+--
+select
+ id,
+ name
+from
+ car_maker
+where
+ id = :id
+;
diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql
new file mode 100644
index 0000000000..0e045d7274
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql
@@ -0,0 +1,4 @@
+--
+-- Insert
+--
+insert into car_maker(id,name) values (:id,:name);
diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql
new file mode 100644
index 0000000000..270d9baaa8
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql
@@ -0,0 +1,10 @@
+--
+-- Insert
+--
+select *
+from
+ car_model
+where
+ maker_fk = :makerId and
+ sku = :sku
+;
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql
new file mode 100644
index 0000000000..b277213584
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql
@@ -0,0 +1,8 @@
+--
+-- Insert
+--
+insert into car_model(maker_fk,name,sku,year) values (
+ :makerId,
+ :name,
+ :sku,
+ :year );
diff --git a/persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java b/persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java
new file mode 100644
index 0000000000..e4b623ee2b
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java
@@ -0,0 +1,121 @@
+package com.baeldung.boot.jdbi;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.jdbi.v3.core.Jdbi;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.boot.jdbi.dao.CarMakerDao;
+import com.baeldung.boot.jdbi.dao.CarModelDao;
+import com.baeldung.boot.jdbi.domain.CarMaker;
+import com.baeldung.boot.jdbi.domain.CarModel;
+import com.baeldung.boot.jdbi.service.CarMakerService;
+
+import lombok.extern.slf4j.Slf4j;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@Slf4j
+public class SpringBootJdbiApplicationUnitTest {
+
+
+ @Autowired
+ private CarMakerDao carMakerDao;
+
+ @Autowired
+ private CarModelDao carModelDao;
+
+ @Autowired
+ private CarMakerService carMakerService;
+
+ @Test
+ public void givenNewCarMaker_whenInsertNewCarMaker_thenSuccess() {
+
+ assertNotNull(carMakerDao);
+
+ CarMaker carMaker = CarMaker.builder()
+ .name("Diamond Motors")
+ .build();
+
+ Long generatedId = carMakerDao.insert(carMaker);
+ log.info("[I37] generatedId = {}", generatedId);
+ assertThat(generatedId).isGreaterThan(0);
+ }
+
+ @Test
+ public void givenNewCarMakers_whenInsertNewCarMakers_thenSuccess() {
+
+ assertNotNull(carMakerDao);
+
+ CarMaker carMaker1 = CarMaker.builder()
+ .name("maker1")
+ .build();
+
+ CarMaker carMaker2 = CarMaker.builder()
+ .name("maker2")
+ .build();
+
+ List makers = new ArrayList<>();
+ makers.add(carMaker1);
+ makers.add(carMaker2);
+
+ List generatedIds = carMakerDao.bulkInsert(makers);
+ log.info("[I37] generatedIds = {}", generatedIds);
+ assertThat(generatedIds).size().isEqualTo(makers.size());
+ }
+
+
+ @Test
+ public void givenExistingCarMaker_whenFindById_thenReturnExistingCarMaker() {
+
+ CarMaker maker = carMakerDao.findById(1l);
+ assertThat(maker).isNotNull();
+ assertThat(maker.getId()).isEqualTo(1);
+
+ }
+
+ @Test
+ public void givenExistingCarMaker_whenBulkInsertFails_thenRollback() {
+
+ CarMaker maker = carMakerDao.findById(1l);
+ CarModel m1 = CarModel.builder()
+ .makerId(maker.getId())
+ .name("Model X1")
+ .sku("1-M1")
+ .year(2019)
+ .build();
+ maker.getModels().add(m1);
+
+ CarModel m2 = CarModel.builder()
+ .makerId(maker.getId())
+ .name("Model X1")
+ .sku("1-M1")
+ .year(2019)
+ .build();
+ maker.getModels().add(m2);
+
+ // This insert fails because we have the same SKU
+ try {
+ carMakerService.bulkInsert(maker);
+ assertTrue("Insert must fail", true);
+ }
+ catch(Exception ex) {
+ log.info("[I113] Exception: {}", ex.getMessage());
+ }
+
+ CarModel m = carModelDao.findByMakerIdAndSku(maker.getId(), "1-M1");
+ assertThat(m).isNull();
+
+ }
+
+}
diff --git a/persistence-modules/spring-boot-jdbi/src/test/resources/data.sql b/persistence-modules/spring-boot-jdbi/src/test/resources/data.sql
new file mode 100644
index 0000000000..e3e1f4ae32
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/test/resources/data.sql
@@ -0,0 +1,12 @@
+
+insert into car_maker(id,name) values (1,'Special Motors');
+insert into car_maker(id,name) values (2,'BWM');
+insert into car_maker(id,name) values (3,'Dolores');
+
+insert into car_model(id,maker_fk,name,sku,year) values(1,1,'Muze','SM001',2018);
+insert into car_model(id,maker_fk,name,sku,year) values(2,1,'Empada','SM002',2008);
+
+insert into car_model(id,maker_fk,name,sku,year) values(4,2,'BWM-100','BWM100',2008);
+insert into car_model(id,maker_fk,name,sku,year) values(5,2,'BWM-200','BWM200',2009);
+insert into car_model(id,maker_fk,name,sku,year) values(6,2,'BWM-300','BWM300',2008);
+
diff --git a/persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql b/persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql
new file mode 100644
index 0000000000..a0d0eaf62e
--- /dev/null
+++ b/persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql
@@ -0,0 +1,24 @@
+--
+-- Car makers table
+--
+create table car_maker(
+ id identity,
+ name varchar(128) not null
+);
+
+create unique index ui_car_maker_01 on car_maker(name);
+
+--
+-- Car models table
+--
+create table car_model(
+ id identity,
+ maker_fk int not null,
+ name varchar(128) not null,
+ sku varchar(128) not null,
+ year int not null
+);
+
+create unique index ui_car_model_01 on car_model(maker_fk,sku);
+create unique index ui_car_model_02 on car_model(maker_fk,name,year);
+
diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml
index 6be58332aa..29374ec116 100644
--- a/persistence-modules/spring-boot-mysql/pom.xml
+++ b/persistence-modules/spring-boot-mysql/pom.xml
@@ -17,7 +17,6 @@
org.springframework.bootspring-boot-starter-web
- 2.1.5.RELEASEorg.springframework.boot
diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD
index 709f505ea9..96eb326cbe 100644
--- a/persistence-modules/spring-boot-persistence/README.MD
+++ b/persistence-modules/spring-boot-persistence/README.MD
@@ -9,3 +9,4 @@
- [Configuring a DataSource Programmatically in Spring Boot](https://www.baeldung.com/spring-boot-configure-data-source-programmatic)
- [Resolving “Failed to Configure a DataSource” Error](https://www.baeldung.com/spring-boot-failed-to-configure-data-source)
- [Spring Boot with Hibernate](https://www.baeldung.com/spring-boot-hibernate)
+- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases)
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index e283759c75..c7cda07a1a 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -59,6 +59,20 @@
validation-api${validation-api.version}
+
+ org.xerial
+ sqlite-jdbc
+
+
+ org.apache.derby
+ derby
+ ${derby.version}
+
+
+ org.hsqldb
+ hsqldb
+ ${hsqldb.version}
+
@@ -83,6 +97,8 @@
9.0.102.23.02.0.1.Final
+ 10.13.1.1
+ 2.3.4
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
index c5c77be56f..6325d2cd2e 100644
--- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
@@ -20,6 +20,9 @@ import java.util.Properties;
@Configuration
@EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.repository" })
@PropertySource("classpath:persistence-generic-entity.properties")
+//@PropertySource("classpath:persistence-derby.properties")
+//@PropertySource("classpath:persistence-hsqldb.properties")
+//@PropertySource("classpath:persistence-sqlite.properties")
@EnableTransactionManagement
@Profile("default") //only required to allow H2JpaConfig and H2TestProfileJPAConfig to coexist in same project
//this demo project is showcasing several ways to achieve the same end, and class-level
diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties
new file mode 100644
index 0000000000..5b5ff05236
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties
@@ -0,0 +1,8 @@
+jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver
+jdbc.url=jdbc:derby:memory:myD;create=true
+jdbc.user=sa
+jdbc.pass=
+
+hibernate.dialect=org.hibernate.dialect.DerbyDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties
new file mode 100644
index 0000000000..d045a8b7e5
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties
@@ -0,0 +1,8 @@
+jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver
+jdbc.url=jdbc:hsqldb:mem:myDb
+jdbc.user=sa
+jdbc.pass=
+
+hibernate.dialect=org.hibernate.dialect.HSQLDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties
new file mode 100644
index 0000000000..ee16081603
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties
@@ -0,0 +1,7 @@
+jdbc.driverClassName=org.sqlite.JDBC
+jdbc.url=jdbc:sqlite:memory:myDb?cache=shared
+jdbc.user=sa
+jdbc.pass=sa
+hibernate.dialect=com.baeldung.dialect.SQLiteDialect
+hibernate.hbm2ddl.auto=create-drop
+hibernate.show_sql=true
diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml
index a857ee538f..f57d9aaa62 100644
--- a/persistence-modules/spring-data-couchbase-2/pom.xml
+++ b/persistence-modules/spring-data-couchbase-2/pom.xml
@@ -1,4 +1,5 @@
-4.0.0org.baeldung
@@ -59,13 +60,24 @@
${spring-framework.version}test
+
+ javax.el
+ javax.el-api
+ ${javax.el.version}
+
+
+ org.glassfish
+ javax.el
+ ${javax.el.version}
+
- 4.3.4.RELEASE
+ 4.3.4.RELEASE2.1.5.RELEASE5.3.3.Final2.9.6
+ 3.0.0
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java
index af228735b8..5e20a98a1d 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -9,6 +9,45 @@ import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+/**
+ * This LiveTest requires:
+ *
+ * 1- Couchbase instance running (e.g. with `docker run -d --name db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase`)
+ *
+ *
+ * 2- Couchbase configured with (we can use the console in localhost:8091):
+ *
+ * 2.1- Buckets: named 'baeldung' and 'baeldung2'
+ *
+ * 2.2- Security: users 'baeldung' and 'baeldung2'. Note: in newer versions an empty password is not allowed, then we have to change the passwords in the project)
+ *
+ * 2.3- Spacial View: Add new spacial view (in Index tab) in document 'campus_spatial', view 'byLocation' with the following function:
+ * {@code
+ * function (doc) {
+ * if (doc.location &&
+ * doc._class == "org.baeldung.spring.data.couchbase.model.Campus") {
+ * emit([doc.location.x, doc.location.y], null);
+ * }
+ * }}
+ *
+ * 2.4- MapReduce Views: Add new views in document 'campus':
+ * 2.4.1- view 'all' with function:
+ * {@code
+ * function (doc, meta) {
+ * if(doc._class == "org.baeldung.spring.data.couchbase.model.Campus") {
+ * emit(meta.id, null);
+ * }
+ * }}
+ *
+ * 2.4.2- view 'byName' with function:
+ * {@code
+ * function (doc, meta) {
+ * if(doc._class == "org.baeldung.spring.data.couchbase.model.Campus" &&
+ * doc.name) {
+ * emit(doc.name, null);
+ * }
+ * }}
+ */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MultiBucketCouchbaseConfig.class, MultiBucketIntegrationTestConfig.class })
@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class })
diff --git a/persistence-modules/spring-data-dynamodb/README.MD b/persistence-modules/spring-data-dynamodb/README.MD
index 9a6855ea0b..9f6cdfdb17 100644
--- a/persistence-modules/spring-data-dynamodb/README.MD
+++ b/persistence-modules/spring-data-dynamodb/README.MD
@@ -1,2 +1,6 @@
+## Spring Data with DynamoDB
+
+This module contains articles about Spring Data with DynamoDB.
+
### Relevant Articles:
- [DynamoDB in a Spring Boot Application Using Spring Data](http://www.baeldung.com/spring-data-dynamodb)
diff --git a/persistence-modules/spring-data-eclipselink/README.md b/persistence-modules/spring-data-eclipselink/README.md
index 7981470488..3bad63d7ef 100644
--- a/persistence-modules/spring-data-eclipselink/README.md
+++ b/persistence-modules/spring-data-eclipselink/README.md
@@ -1,3 +1,8 @@
+## Spring Data with EclipseLink
+
+This module contains articles about Spring Data with EclipseLink.
+
### Relevant articles
- [A Guide to EclipseLink with Spring](http://www.baeldung.com/spring-eclipselink)
+- [Pessimistic Locking in JPA](https://www.baeldung.com/jpa-pessimistic-locking)
diff --git a/persistence-modules/spring-data-keyvalue/README.md b/persistence-modules/spring-data-keyvalue/README.md
index f76cf4d5ac..9f53a11b2c 100644
--- a/persistence-modules/spring-data-keyvalue/README.md
+++ b/persistence-modules/spring-data-keyvalue/README.md
@@ -1,2 +1,6 @@
+## Spring Data Key-Value
+
+This module contains articles about Spring Data Key-Value
+
### Relevant Articles:
- [A Guide to Spring Data Key Value](http://www.baeldung.com/spring-data-key-value)
diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java
new file mode 100644
index 0000000000..a2a3d1761f
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.contexttests.mongoconfig;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.config.MongoConfig;
+
+/**
+ * This Live test requires:
+ * * mongodb instance running on the environment
+ *
+ * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`)
+ *
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MongoConfig.class)
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+
+}
diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java
new file mode 100644
index 0000000000..d2a946fb90
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.contexttests.mongoreactiveconfig;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.config.MongoReactiveConfig;
+
+/**
+ * This Live test requires:
+ * * mongodb instance running on the environment
+ *
+ * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`)
+ *
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MongoReactiveConfig.class)
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+
+}
diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java
new file mode 100644
index 0000000000..6e8905c139
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.contexttests.simplemongoconfig;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.config.SimpleMongoConfig;
+
+/**
+ * This Live test requires:
+ * * mongodb instance running on the environment
+ *
+ * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`)
+ *
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = SimpleMongoConfig.class)
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+
+}
diff --git a/persistence-modules/spring-data-solr/README.md b/persistence-modules/spring-data-solr/README.md
index fbce5280e3..c282fd2ce7 100644
--- a/persistence-modules/spring-data-solr/README.md
+++ b/persistence-modules/spring-data-solr/README.md
@@ -1,2 +1,6 @@
+## Spring Data with Solr
+
+This module contains articles about Spring Data with Solr.
+
### Relevant Articles:
- [Introduction to Spring Data Solr](http://www.baeldung.com/spring-data-solr)
diff --git a/persistence-modules/spring-hibernate-3/README.md b/persistence-modules/spring-hibernate-3/README.md
index ac840b6f66..898c6522a9 100644
--- a/persistence-modules/spring-hibernate-3/README.md
+++ b/persistence-modules/spring-hibernate-3/README.md
@@ -1,13 +1,12 @@
-=========
+## Spring with Hibernate 3
-## Spring with Hibernate 3 Example Project
+This module contains articles about Spring with Hibernate 3
+
+### Relevant Articles:
-
-### Relevant ArticleS:
- [Hibernate 3 with Spring](http://www.baeldung.com/hibernate3-spring)
- [HibernateException: No Hibernate Session Bound to Thread in Hibernate 3](http://www.baeldung.com/no-hibernate-session-bound-to-thread-exception)
-
### Quick Start
```
diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md
index 7a18761a7b..a74600a47f 100644
--- a/persistence-modules/spring-hibernate-5/README.md
+++ b/persistence-modules/spring-hibernate-5/README.md
@@ -1,3 +1,7 @@
+## Hibernate 5 with Spring
+
+This module contains articles about Hibernate 5 with Spring.
+
### Relevant articles
- [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many)
@@ -7,4 +11,4 @@
- [@DynamicUpdate with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-dynamicupdate)
- [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache)
- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate)
-- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource)
\ No newline at end of file
+- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource)
diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md
index 56ce68c126..d04e9f6f41 100644
--- a/persistence-modules/spring-jpa/README.md
+++ b/persistence-modules/spring-jpa/README.md
@@ -9,7 +9,6 @@
- [Sorting with JPA](http://www.baeldung.com/jpa-sort)
- [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database)
- [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source)
-- [A Guide to Hibernate with Spring 4](http://www.baeldung.com/the-persistence-layer-with-spring-and-jpa)
- [Obtaining Auto-generated Keys in Spring JDBC](http://www.baeldung.com/spring-jdbc-autogenerated-keys)
- [Transactions with Spring 4 and JPA](http://www.baeldung.com/transaction-configuration-with-jpa-and-spring)
- [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml
index d0b3f5fe29..f0cf8e49d5 100644
--- a/persistence-modules/spring-persistence-simple/pom.xml
+++ b/persistence-modules/spring-persistence-simple/pom.xml
@@ -116,7 +116,7 @@
com.mysema.mavenapt-maven-plugin
- 1.1.3
+ ${apt-maven-plugin.version}generate-sources
@@ -148,6 +148,7 @@
21.03.8.0
+ 1.1.3
\ No newline at end of file
diff --git a/play-framework/README.md b/play-framework/README.md
index 0fd13fba27..2309b67422 100644
--- a/play-framework/README.md
+++ b/play-framework/README.md
@@ -1,4 +1,4 @@
###Relevant Articles:
-- [REST API with Play Framework in Java](http://www.baeldung.com/rest-api-with-play)
-- [Routing In Play Applications in Java](http://www.baeldung.com/routing-in-play)
-- [Introduction To Play In Java](http://www.baeldung.com/java-intro-to-the-play-framework)
+- [REST API with Play Framework in Java](https://www.baeldung.com/rest-api-with-play)
+- [Routing In Play Applications in Java](https://www.baeldung.com/routing-in-play)
+- [Introduction To Play In Java](https://www.baeldung.com/java-intro-to-the-play-framework)
diff --git a/play-framework/introduction/.gitignore b/play-framework/introduction/.gitignore
index eb372fc719..e497f3fc67 100644
--- a/play-framework/introduction/.gitignore
+++ b/play-framework/introduction/.gitignore
@@ -1,6 +1,7 @@
logs
target
/.idea
+/.g8
/.idea_modules
/.classpath
/.project
diff --git a/play-framework/introduction/LICENSE b/play-framework/introduction/LICENSE
deleted file mode 100644
index 4baedcb95f..0000000000
--- a/play-framework/introduction/LICENSE
+++ /dev/null
@@ -1,8 +0,0 @@
-This software is licensed under the Apache 2 license, quoted below.
-
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with
-the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
-
-Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
-language governing permissions and limitations under the License.
\ No newline at end of file
diff --git a/play-framework/introduction/README b/play-framework/introduction/README
deleted file mode 100644
index f21d092edf..0000000000
--- a/play-framework/introduction/README
+++ /dev/null
@@ -1,49 +0,0 @@
-This is your new Play application
-=================================
-
-This file will be packaged with your application when using `activator dist`.
-
-There are several demonstration files available in this template.
-
-Controllers
-===========
-
-- HomeController.java:
-
- Shows how to handle simple HTTP requests.
-
-- AsyncController.java:
-
- Shows how to do asynchronous programming when handling a request.
-
-- CountController.java:
-
- Shows how to inject a component into a controller and use the component when
- handling requests.
-
-Components
-==========
-
-- Module.java:
-
- Shows how to use Guice to bind all the components needed by your application.
-
-- Counter.java:
-
- An example of a component that contains state, in this case a simple counter.
-
-- ApplicationTimer.java:
-
- An example of a component that starts when the application starts and stops
- when the application stops.
-
-Filters
-=======
-
-- Filters.java:
-
- Creates the list of HTTP filters used by your application.
-
-- ExampleFilter.java
-
- A simple filter that adds a header to every response.
\ No newline at end of file
diff --git a/play-framework/introduction/app/Filters.java b/play-framework/introduction/app/Filters.java
deleted file mode 100644
index 255de8ca93..0000000000
--- a/play-framework/introduction/app/Filters.java
+++ /dev/null
@@ -1,46 +0,0 @@
-import javax.inject.*;
-import play.*;
-import play.mvc.EssentialFilter;
-import play.http.HttpFilters;
-import play.mvc.*;
-
-import filters.ExampleFilter;
-
-/**
- * This class configures filters that run on every request. This
- * class is queried by Play to get a list of filters.
- *
- * Play will automatically use filters from any class called
- * Filters that is placed the root package. You can load filters
- * from a different class by adding a `play.http.filters` setting to
- * the application.conf configuration file.
- */
-@Singleton
-public class Filters implements HttpFilters {
-
- private final Environment env;
- private final EssentialFilter exampleFilter;
-
- /**
- * @param env Basic environment settings for the current application.
- * @param exampleFilter A demonstration filter that adds a header to
- */
- @Inject
- public Filters(Environment env, ExampleFilter exampleFilter) {
- this.env = env;
- this.exampleFilter = exampleFilter;
- }
-
- @Override
- public EssentialFilter[] filters() {
- // Use the example filter if we're running development mode. If
- // we're running in production or test mode then don't use any
- // filters at all.
- if (env.mode().equals(Mode.DEV)) {
- return new EssentialFilter[] { exampleFilter };
- } else {
- return new EssentialFilter[] {};
- }
- }
-
-}
diff --git a/play-framework/introduction/app/Module.java b/play-framework/introduction/app/Module.java
deleted file mode 100644
index 6e7d1766ef..0000000000
--- a/play-framework/introduction/app/Module.java
+++ /dev/null
@@ -1,31 +0,0 @@
-import com.google.inject.AbstractModule;
-import java.time.Clock;
-
-import services.ApplicationTimer;
-import services.AtomicCounter;
-import services.Counter;
-
-/**
- * This class is a Guice module that tells Guice how to bind several
- * different types. This Guice module is created when the Play
- * application starts.
- *
- * Play will automatically use any class called `Module` that is in
- * the root package. You can create modules in other locations by
- * adding `play.modules.enabled` settings to the `application.conf`
- * configuration file.
- */
-public class Module extends AbstractModule {
-
- @Override
- public void configure() {
- // Use the system clock as the default implementation of Clock
- bind(Clock.class).toInstance(Clock.systemDefaultZone());
- // Ask Guice to create an instance of ApplicationTimer when the
- // application starts.
- bind(ApplicationTimer.class).asEagerSingleton();
- // Set AtomicCounter as the implementation for Counter.
- bind(Counter.class).to(AtomicCounter.class);
- }
-
-}
diff --git a/play-framework/introduction/app/controllers/AsyncController.java b/play-framework/introduction/app/controllers/AsyncController.java
deleted file mode 100644
index 92c84bb755..0000000000
--- a/play-framework/introduction/app/controllers/AsyncController.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package controllers;
-
-import akka.actor.ActorSystem;
-
-import javax.inject.*;
-
-import play.*;
-import play.mvc.*;
-
-import java.util.concurrent.Executor;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.TimeUnit;
-
-import scala.concurrent.duration.Duration;
-import scala.concurrent.ExecutionContextExecutor;
-
-/**
- * This controller contains an action that demonstrates how to write
- * simple asynchronous code in a controller. It uses a timer to
- * asynchronously delay sending a response for 1 second.
- *
- * @param actorSystem We need the {@link ActorSystem}'s
- * {@link Scheduler} to run code after a delay.
- * @param exec We need a Java {@link Executor} to apply the result
- * of the {@link CompletableFuture} and a Scala
- * {@link ExecutionContext} so we can use the Akka {@link Scheduler}.
- * An {@link ExecutionContextExecutor} implements both interfaces.
- */
-@Singleton
-public class AsyncController extends Controller {
-
- private final ActorSystem actorSystem;
- private final ExecutionContextExecutor exec;
-
- @Inject
- public AsyncController(ActorSystem actorSystem, ExecutionContextExecutor exec) {
- this.actorSystem = actorSystem;
- this.exec = exec;
- }
-
- /**
- * An action that returns a plain text message after a delay
- * of 1 second.
- *
- * The configuration in the routes file means that this method
- * will be called when the application receives a GET request with
- * a path of /message.
- */
- public CompletionStage message() {
- return getFutureMessage(1, TimeUnit.SECONDS).thenApplyAsync(Results::ok, exec);
- }
-
- private CompletionStage getFutureMessage(long time, TimeUnit timeUnit) {
- CompletableFuture future = new CompletableFuture<>();
- actorSystem.scheduler().scheduleOnce(
- Duration.create(time, timeUnit),
- () -> future.complete("Hi!"),
- exec
- );
- return future;
- }
-
-}
diff --git a/play-framework/introduction/app/controllers/CountController.java b/play-framework/introduction/app/controllers/CountController.java
deleted file mode 100644
index 02fcb15f8e..0000000000
--- a/play-framework/introduction/app/controllers/CountController.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package controllers;
-
-import javax.inject.*;
-import play.*;
-import play.mvc.*;
-
-import services.Counter;
-
-/**
- * This controller demonstrates how to use dependency injection to
- * bind a component into a controller class. The class contains an
- * action that shows an incrementing count to users. The {@link Counter}
- * object is injected by the Guice dependency injection system.
- */
-@Singleton
-public class CountController extends Controller {
-
- private final Counter counter;
-
- @Inject
- public CountController(Counter counter) {
- this.counter = counter;
- }
-
- /**
- * An action that responds with the {@link Counter}'s current
- * count. The result is plain text. This action is mapped to
- * GET requests with a path of /count
- * requests by an entry in the routes config file.
- */
- public Result count() {
- return ok(Integer.toString(counter.nextCount()));
- }
-
-}
diff --git a/play-framework/introduction/app/controllers/HomeController.java b/play-framework/introduction/app/controllers/HomeController.java
index 6a79856eb4..9b1146886e 100644
--- a/play-framework/introduction/app/controllers/HomeController.java
+++ b/play-framework/introduction/app/controllers/HomeController.java
@@ -1,14 +1,25 @@
package controllers;
+import play.libs.concurrent.HttpExecutionContext;
import play.mvc.*;
+import play.twirl.api.Html;
-import views.html.*;
+import javax.inject.Inject;
+import java.util.concurrent.CompletionStage;
+
+import static java.util.concurrent.CompletableFuture.supplyAsync;
/**
* This controller contains an action to handle HTTP requests
* to the application's home page.
*/
public class HomeController extends Controller {
+ private HttpExecutionContext ec;
+
+ @Inject
+ public HomeController(HttpExecutionContext ec) {
+ this.ec = ec;
+ }
/**
* An action that renders an HTML page with a welcome message.
@@ -17,7 +28,41 @@ public class HomeController extends Controller {
* GET request with a path of /.
*/
public Result index() {
- return ok(index.render("Your new application is ready."));
+ return ok(views.html.index.render());
}
+ public Result applyHtml() {
+ return ok(Html.apply("
This text will appear as a heading 1
"));
+ }
+
+ public Result badRequestPage() {
+ return badRequest("Your request data has issues.");
+ }
+
+ public Result notFoundPage() {
+ return notFound("Could not find the page you requested.");
+ }
+
+ public Result customContentType() {
+ return ok("This is some text content").as("text/html");
+ }
+
+ public CompletionStage asyncOperation() {
+ return supplyAsync(() -> {
+ return longRunningTask();
+ }, ec.current())
+ .thenApplyAsync(s -> {
+ return ok("Got result -> " + s);
+ }, ec.current());
+ }
+
+ private String longRunningTask() {
+ return "Long running task has completed";
+ }
+
+ public Result setHeaders() {
+ return ok("This is some text content")
+ .as("text/html")
+ .withHeader("Header-Key", "Some value");
+ }
}
diff --git a/play-framework/introduction/app/controllers/StudentController.java b/play-framework/introduction/app/controllers/StudentController.java
deleted file mode 100644
index 8b759b9598..0000000000
--- a/play-framework/introduction/app/controllers/StudentController.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package controllers;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import models.Student;
-import models.StudentStore;
-import play.libs.Json;
-import play.mvc.Controller;
-import play.mvc.Result;
-import util.Util;
-
-import java.util.Set;
-
-public class StudentController extends Controller {
- public Result create() {
- JsonNode json = request().body().asJson();
- if (json == null) {
- return badRequest(Util.createResponse("Expecting Json data", false));
- }
- Student student = StudentStore.getInstance().addStudent(Json.fromJson(json, Student.class));
- JsonNode jsonObject = Json.toJson(student);
- return created(Util.createResponse(jsonObject, true));
- }
-
- public Result update() {
- JsonNode json = request().body().asJson();
- if (json == null) {
- return badRequest(Util.createResponse("Expecting Json data", false));
- }
- Student student = StudentStore.getInstance().updateStudent(Json.fromJson(json, Student.class));
- if (student == null) {
- return notFound(Util.createResponse("Student not found", false));
- }
-
- JsonNode jsonObject = Json.toJson(student);
- return ok(Util.createResponse(jsonObject, true));
- }
-
- public Result retrieve(int id) {
- if (StudentStore.getInstance().getStudent(id) == null) {
- return notFound(Util.createResponse("Student with id:" + id + " not found", false));
- }
- JsonNode jsonObjects = Json.toJson(StudentStore.getInstance().getStudent(id));
- return ok(Util.createResponse(jsonObjects, true));
- }
-
- public Result listStudents() {
- Set result = StudentStore.getInstance().getAllStudents();
- ObjectMapper mapper = new ObjectMapper();
-
- JsonNode jsonData = mapper.convertValue(result, JsonNode.class);
- return ok(Util.createResponse(jsonData, true));
-
- }
-
- public Result delete(int id) {
- if (!StudentStore.getInstance().deleteStudent(id)) {
- return notFound(Util.createResponse("Student with id:" + id + " not found", false));
- }
- return ok(Util.createResponse("Student with id:" + id + " deleted", true));
- }
-
-}
diff --git a/play-framework/introduction/app/filters/ExampleFilter.java b/play-framework/introduction/app/filters/ExampleFilter.java
deleted file mode 100644
index 67a6a36cc3..0000000000
--- a/play-framework/introduction/app/filters/ExampleFilter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package filters;
-
-import akka.stream.Materializer;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.Executor;
-import java.util.function.Function;
-import javax.inject.*;
-import play.mvc.*;
-import play.mvc.Http.RequestHeader;
-
-
-/**
- * This is a simple filter that adds a header to all requests. It's
- * added to the application's list of filters by the
- * {@link Filters} class.
- */
-@Singleton
-public class ExampleFilter extends Filter {
-
- private final Executor exec;
-
- /**
- * @param mat This object is needed to handle streaming of requests
- * and responses.
- * @param exec This class is needed to execute code asynchronously.
- * It is used below by the thenAsyncApply method.
- */
- @Inject
- public ExampleFilter(Materializer mat, Executor exec) {
- super(mat);
- this.exec = exec;
- }
-
- @Override
- public CompletionStage apply(
- Function> next,
- RequestHeader requestHeader) {
-
- return next.apply(requestHeader).thenApplyAsync(
- result -> result.withHeader("X-ExampleFilter", "foo"),
- exec
- );
- }
-
-}
diff --git a/play-framework/introduction/app/models/StudentStore.java b/play-framework/introduction/app/models/StudentStore.java
deleted file mode 100644
index add6a5dbd6..0000000000
--- a/play-framework/introduction/app/models/StudentStore.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package models;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public class StudentStore {
- private static StudentStore instance;
- private Map students = new HashMap<>();
-
- public static StudentStore getInstance() {
- if (instance == null) {
- instance = new StudentStore();
- }
- return instance;
- }
-
- public Student addStudent(Student student) {
- int id = students.size();
- student.setId(id);
- students.put(id, student);
- return student;
- }
-
- public Student getStudent(int id) {
- return students.get(id);
- }
-
- public Set getAllStudents() {
- return new HashSet<>(students.values());
- }
-
- public Student updateStudent(Student student) {
- int id = student.getId();
- if (students.containsKey(id)) {
- students.put(id, student);
- return student;
- }
- return null;
- }
-
- public boolean deleteStudent(int id) {
- return students.remove(id) != null;
- }
-}
\ No newline at end of file
diff --git a/play-framework/introduction/app/services/ApplicationTimer.java b/play-framework/introduction/app/services/ApplicationTimer.java
deleted file mode 100644
index a951562b1d..0000000000
--- a/play-framework/introduction/app/services/ApplicationTimer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package services;
-
-import java.time.Clock;
-import java.time.Instant;
-import java.util.concurrent.CompletableFuture;
-import javax.inject.*;
-import play.Logger;
-import play.inject.ApplicationLifecycle;
-
-/**
- * This class demonstrates how to run code when the
- * application starts and stops. It starts a timer when the
- * application starts. When the application stops it prints out how
- * long the application was running for.
- *
- * This class is registered for Guice dependency injection in the
- * {@link Module} class. We want the class to start when the application
- * starts, so it is registered as an "eager singleton". See the code
- * in the {@link Module} class to see how this happens.
- *
- * This class needs to run code when the server stops. It uses the
- * application's {@link ApplicationLifecycle} to register a stop hook.
- */
-@Singleton
-public class ApplicationTimer {
-
- private final Clock clock;
- private final ApplicationLifecycle appLifecycle;
- private final Instant start;
-
- @Inject
- public ApplicationTimer(Clock clock, ApplicationLifecycle appLifecycle) {
- this.clock = clock;
- this.appLifecycle = appLifecycle;
- // This code is called when the application starts.
- start = clock.instant();
- Logger.info("ApplicationTimer demo: Starting application at " + start);
-
- // When the application starts, register a stop hook with the
- // ApplicationLifecycle object. The code inside the stop hook will
- // be run when the application stops.
- appLifecycle.addStopHook(() -> {
- Instant stop = clock.instant();
- Long runningTime = stop.getEpochSecond() - start.getEpochSecond();
- Logger.info("ApplicationTimer demo: Stopping application at " + clock.instant() + " after " + runningTime + "s.");
- return CompletableFuture.completedFuture(null);
- });
- }
-
-}
diff --git a/play-framework/introduction/app/services/AtomicCounter.java b/play-framework/introduction/app/services/AtomicCounter.java
deleted file mode 100644
index 41f741cbf7..0000000000
--- a/play-framework/introduction/app/services/AtomicCounter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package services;
-
-import java.util.concurrent.atomic.AtomicInteger;
-import javax.inject.*;
-
-/**
- * This class is a concrete implementation of the {@link Counter} trait.
- * It is configured for Guice dependency injection in the {@link Module}
- * class.
- *
- * This class has a {@link Singleton} annotation because we need to make
- * sure we only use one counter per application. Without this
- * annotation we would get a new instance every time a {@link Counter} is
- * injected.
- */
-@Singleton
-public class AtomicCounter implements Counter {
-
- private final AtomicInteger atomicCounter = new AtomicInteger();
-
- @Override
- public int nextCount() {
- return atomicCounter.getAndIncrement();
- }
-
-}
diff --git a/play-framework/introduction/app/services/Counter.java b/play-framework/introduction/app/services/Counter.java
deleted file mode 100644
index dadad8b09d..0000000000
--- a/play-framework/introduction/app/services/Counter.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package services;
-
-/**
- * This interface demonstrates how to create a component that is injected
- * into a controller. The interface represents a counter that returns a
- * incremented number each time it is called.
- *
- * The {@link Modules} class binds this interface to the
- * {@link AtomicCounter} implementation.
- */
-public interface Counter {
- int nextCount();
-}
diff --git a/play-framework/introduction/app/views/index.scala.html b/play-framework/introduction/app/views/index.scala.html
index 4539f5a10b..68d37fb1d4 100644
--- a/play-framework/introduction/app/views/index.scala.html
+++ b/play-framework/introduction/app/views/index.scala.html
@@ -1,20 +1,5 @@
-@*
- * This template takes a single argument, a String containing a
- * message to display.
- *@
-@(message: String)
+@()
-@*
- * Call the `main` template with two arguments. The first
- * argument is a `String` with the title of the page, the second
- * argument is an `Html` object containing the body of the page.
- *@
@main("Welcome to Play") {
-
- @*
- * Get an `Html` object by calling the built-in Play welcome
- * template and passing a `String` message.
- *@
- @play20.welcome(message, style = "Java")
-
+
Welcome to Play!
}
diff --git a/play-framework/introduction/app/views/main.scala.html b/play-framework/introduction/app/views/main.scala.html
index 9414f4be6e..c5f755f236 100644
--- a/play-framework/introduction/app/views/main.scala.html
+++ b/play-framework/introduction/app/views/main.scala.html
@@ -13,11 +13,12 @@
@title
-
@* And here's where we render the `Html` object containing
* the page content. *@
@content
+
+