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.0 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} + @@ -73,5 +88,7 @@ 4.3 28.0-jre 2.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-slf4j runtime - - 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.baeldung bazelgreeting - 1.0.0-SNAPSHOT + ${bazelgreeting.version} org.apache.commons commons-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.0 com.baeldung - autovalue + code-generation 1.0 - autovalue + code-generation com.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.0 2.4.0 1.1-groovy-2.4 + 1.1.3 3.8.1 1.2.3 2.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.boot spring-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.1 1.8.9 2.0.0-RC.4 - 1.44 1.7.0 1.19 1.19 2.0.4.RELEASE - 3.8.0 2.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.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/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.assertj assertj-core ${assertj.version} test - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - org.openjdk.jmh jmh-core @@ -51,11 +30,6 @@ jmh-generator-annprocess ${openjdk.jmh.version} - - org.apache.commons - commons-exec - ${commons-exec.version} - org.projectlombok lombok @@ -66,13 +40,6 @@ 1.19 - 1.2.0 - 3.8.1 - 4.1 - 4.01 - 1.7.0 3.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 array = new ArrayList<>(asList(0, "one", 2, "three")); - - for (Object item : array) { - array.set(3, 3); - } - } - - @Test - public void removingElementUsingIteratorAPI() throws Exception { - List originalList = new ArrayList<>(asList("zero", "one", "two", "three")); - - Iterator iterator = originalList.iterator(); - - while (iterator.hasNext()) { - String next = iterator.next(); - if (Objects.equals(next, "one")) iterator.remove(); - } - - assertEquals(originalList, asList("zero", "two", "three")); - } - - @Test - public void modifyingContentAndIteratingUsingListIteratorAPI() throws Exception { - List originalList = new ArrayList<>(asList("zero", "one", "two", "three")); - - ListIterator iterator = originalList.listIterator(); - - while (iterator.hasNext()) { - String next = iterator.next(); - if (Objects.equals(next, "one")) { - iterator.set("another"); - } - - if (Objects.equals(next, "two")) { - iterator.remove(); - } - - if (Objects.equals(next, "three")) { - iterator.add("four"); - } - } - - assertEquals(originalList, asList("zero", "another", "three", "four")); - } - - @Test - public void removingElementUsingCopyAndListAPI() throws Exception { - List originalList = new ArrayList<>(asList("zero", "one", "two", "three")); - - List listCopy = new ArrayList<>(originalList); - - for (String next : listCopy) { - if (Objects.equals(next, "one")) originalList.remove(originalList.indexOf(next) - 1); - } - - assertEquals(originalList, asList("one", "two", "three")); - } - - @Test - public void copyOnWriteList() throws Exception { - List originalList = new CopyOnWriteArrayList<>(asList("zero", "one", "two", "three")); - - for (String next : originalList) { - if (Objects.equals(next, "one")) originalList.remove(originalList.indexOf(next) - 1); - } - - assertEquals(originalList, asList("one", "two", "three")); - } -} diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java index fd84503226..29b1ab9e70 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.ArrayList; import java.util.Arrays; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java index 72354622ae..0e3c9cd217 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.ArrayList; import java.util.Arrays; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java index 842e253e9e..9a4d80b403 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Collections; import java.util.HashMap; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java similarity index 93% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java index f88f58a55b..88fd343f56 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +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/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java index 23933b2b4b..7cbfa9bfa9 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Collections; import java.util.Map; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java index 3ce1e6ed26..98820665c1 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Arrays; import java.util.Collections; diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md b/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md deleted file mode 100644 index 317d81fae7..0000000000 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: -- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) -- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) diff --git a/core-java-modules/core-java-arrays/.gitignore b/core-java-modules/core-java-concurrency-2/.gitignore similarity index 95% rename from core-java-modules/core-java-arrays/.gitignore rename to core-java-modules/core-java-concurrency-2/.gitignore index 374c8bf907..3de4cc647e 100644 --- a/core-java-modules/core-java-arrays/.gitignore +++ b/core-java-modules/core-java-concurrency-2/.gitignore @@ -16,6 +16,7 @@ *.ear # Files generated by integration tests +*.txt backup-pom.xml /bin/ /temp diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md new file mode 100644 index 0000000000..749d174968 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java Concurrency 2 Examples + +### Relevant Articles: +- [Using a Mutex Object in Java](https://www.baeldung.com/java-mutex) + diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml new file mode 100644 index 0000000000..6b179a29c7 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + com.baeldung + core-java-concurrency-2 + 0.1.0-SNAPSHOT + core-java-concurrency-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + core-java-concurrency-2 + + + src/main/resources + true + + + + + diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java diff --git a/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %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-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java diff --git a/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore b/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-advanced/README.md b/core-java-modules/core-java-concurrency-advanced/README.md index 8e99858693..f76e68757a 100644 --- a/core-java-modules/core-java-concurrency-advanced/README.md +++ b/core-java-modules/core-java-concurrency-advanced/README.md @@ -1,7 +1,7 @@ -========= - ## Core Java Concurrency Advanced Examples +This module contains articles about advanced concurrency in core Java. + ### Relevant Articles: - [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava) - [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch) diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md new file mode 100644 index 0000000000..e72725b7cb --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/README.md @@ -0,0 +1,10 @@ +========= + +## Core Java Concurrency Basic 2 Examples + +### Relevant Articles: +- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) +- [wait and notify() Methods in Java](https://www.baeldung.com/java-wait-notify) +- [Difference Between Wait and Sleep in Java](https://www.baeldung.com/java-wait-and-sleep) +- [Guide to the Synchronized Keyword in Java](https://www.baeldung.com/java-synchronized) +- [Life Cycle of a Thread in Java](https://www.baeldung.com/java-thread-lifecycle) diff --git a/testing-modules/mocks/jmockit/pom.xml b/core-java-modules/core-java-concurrency-basic-2/pom.xml similarity index 55% rename from testing-modules/mocks/jmockit/pom.xml rename to core-java-modules/core-java-concurrency-basic-2/pom.xml index 12bbe6b60d..7e0a160456 100644 --- a/testing-modules/mocks/jmockit/pom.xml +++ b/core-java-modules/core-java-concurrency-basic-2/pom.xml @@ -1,27 +1,24 @@ 4.0.0 - jmockit - jmockit + com.baeldung + core-java-concurrency-basic-2 + 0.1.0-SNAPSHOT + core-java-concurrency-basic-2 + jar com.baeldung - mocks - 1.0.0-SNAPSHOT - ../ + parent-java + 0.0.1-SNAPSHOT + ../../parent-java - - org.jmockit - jmockit - ${jmockit.version} - test - - jmockit + core-java-concurrency-basic-2 src/main/resources @@ -31,7 +28,6 @@ - 1.24 - \ No newline at end of file + diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/delay/Delay.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/delay/Delay.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/delay/Delay.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/delay/Delay.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %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-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java index e2bc328df3..473fe6ff8e 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java @@ -1,15 +1,15 @@ package com.baeldung.concurrent.waitandnotify; -import static org.junit.Assert.assertEquals; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class NetworkIntegrationTest { diff --git a/core-java-modules/core-java-concurrency-basic/README.md b/core-java-modules/core-java-concurrency-basic/README.md index c498bed315..846687b8dd 100644 --- a/core-java-modules/core-java-concurrency-basic/README.md +++ b/core-java-modules/core-java-concurrency-basic/README.md @@ -1,20 +1,16 @@ -========= +## Core Java Concurrency Basic -## Core Java Concurrency Basic Examples +This module contains articles about basic Java concurrency ### Relevant Articles: -- [Guide To CompletableFuture](http://www.baeldung.com/java-completablefuture) -- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial) -- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future) -- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep) -- [Guide to the Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized) -- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) -- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) -- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) -- [ExecutorService – Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) -- [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify) -- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle) -- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable) +- [Guide To CompletableFuture](https://www.baeldung.com/java-completablefuture) +- [A Guide to the Java ExecutorService](https://www.baeldung.com/java-executor-service-tutorial) +- [Guide to java.util.concurrent.Future](https://www.baeldung.com/java-future) +- [Overview of the java.util.concurrent](https://www.baeldung.com/java-util-concurrent) +- [Implementing a Runnable vs Extending a Thread](https://www.baeldung.com/java-runnable-vs-extending-thread) +- [How to Kill a Java Thread](https://www.baeldung.com/java-thread-stop) +- [ExecutorService – Waiting for Threads to Finish](https://www.baeldung.com/java-executor-wait-for-threads) +- [Runnable vs. Callable in Java](https://www.baeldung.com/java-runnable-callable) - [What is Thread-Safety and How to Achieve it?](https://www.baeldung.com/java-thread-safety) - [How to Start a Thread in Java](https://www.baeldung.com/java-start-thread) -- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) +- [[Next -->]](/core-java-modules/core-java-concurrency-basic-2) diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java similarity index 99% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java index a1f5b6f1e2..998152c452 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.concurrent.executorservice; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java index 176151083c..6761b05282 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; -import org.junit.Test; -import static org.assertj.core.api.Assertions.assertThat; import com.baeldung.concurrent.threadsafety.callables.CounterCallable; import com.baeldung.concurrent.threadsafety.services.Counter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class CounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class CounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java index e34eb250bf..2dcb846bf4 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; -import org.junit.Test; -import static org.assertj.core.api.Assertions.assertThat; import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class ExtrinsicLockCounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class ExtrinsicLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java similarity index 55% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java index 2708152906..018d4164f0 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java @@ -1,13 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.mathutils.MathUtils; import org.junit.Test; + +import java.math.BigInteger; + import static org.assertj.core.api.Assertions.assertThat; -public class MathUtilsTest { +public class MathUtilsUnitTest { @Test public void whenCalledFactorialMethod_thenCorrect() { - assertThat(MathUtils.factorial(2)).isEqualTo(2); + assertThat(MathUtils.factorial(2)).isEqualTo(new BigInteger("2")); } } diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java index e62206c09a..4df695a537 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; -import org.junit.Test; -import static org.assertj.core.api.Assertions.assertThat; import com.baeldung.concurrent.threadsafety.callables.MessageServiceCallable; import com.baeldung.concurrent.threadsafety.services.MessageService; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class MessageServiceTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class MessageServiceUnitTest { @Test public void whenCalledgetMessage_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java index 20fa2c74da..330d2d4c86 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -public class ReentrantLockCounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class ReentrantLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java similarity index 90% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java index 6113473cac..71fad2c87f 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -public class ReentrantReadWriteLockCounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class ReentrantReadWriteLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { @@ -16,9 +18,9 @@ public class ReentrantReadWriteLockCounterTest { ReentrantReadWriteLockCounter counter = new ReentrantReadWriteLockCounter(); Future future1 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter)); Future future2 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter)); - - assertThat(future1.get()).isEqualTo(1); + assertThat(future2.get()).isEqualTo(2); + assertThat(future1.get()).isEqualTo(1); } } diff --git a/core-java-modules/core-java-concurrency-collections/README.md b/core-java-modules/core-java-concurrency-collections/README.md index b982a91861..80a21ee533 100644 --- a/core-java-modules/core-java-concurrency-collections/README.md +++ b/core-java-modules/core-java-concurrency-collections/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Concurrency Collections -## Core Java Concurrency Collections Examples +This module contains articles about concurrent Java collections ### Relevant Articles: - [Guide to java.util.concurrent.BlockingQueue](http://www.baeldung.com/java-blocking-queue) diff --git a/core-java-modules/core-java-datetime/README.md b/core-java-modules/core-java-datetime/README.md new file mode 100644 index 0000000000..71aea2e9db --- /dev/null +++ b/core-java-modules/core-java-datetime/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone) +- [Overriding System Time for Testing in Java](https://www.baeldung.com/java-override-system-time) \ No newline at end of file diff --git a/core-java-modules/core-java-datetime/pom.xml b/core-java-modules/core-java-datetime/pom.xml new file mode 100644 index 0000000000..e2f86c7254 --- /dev/null +++ b/core-java-modules/core-java-datetime/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + com.baeldung + core-java-datetime + 0.1.0-SNAPSHOT + core-java-datetime + 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 + + + joda-time + joda-time + ${joda.version} + + + org.aspectj + aspectjrt + ${asspectj.version} + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + org.jmockit + jmockit + ${jmockit.version} + test + + + + + core-java-datetime + + + src/main/resources + true + + + + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + true + + + + + + + + 3.6.1 + 2.10 + + 3.6.1 + 1.8.9 + 2.0.0-RC.4 + 1.44 + + 2.22.1 + + diff --git a/testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml b/core-java-modules/core-java-datetime/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml rename to core-java-modules/core-java-datetime/src/main/resources/logback.xml diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md index 79e5bad23a..0120b970c3 100644 --- a/core-java-modules/core-java-exceptions/README.md +++ b/core-java-modules/core-java-exceptions/README.md @@ -1,3 +1,13 @@ -## Relevant Articles: +## Core Java Exceptions -- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch) +This module contains articles about core java exceptions + +### Relevant articles: +- [Chained Exceptions in Java](https://www.baeldung.com/java-chained-exceptions) +- [ClassNotFoundException vs NoClassDefFoundError](https://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror) +- [Create a Custom Exception in Java](https://www.baeldung.com/java-new-custom-exception) +- [Exception Handling in Java](https://www.baeldung.com/java-exceptions) +- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize) +- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws) +- [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws) +- [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error) diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml index 2e5200944a..da5ec76622 100644 --- a/core-java-modules/core-java-exceptions/pom.xml +++ b/core-java-modules/core-java-exceptions/pom.xml @@ -1,35 +1,46 @@ + - 4.0.0 - com.baeldung.exception.numberformat - core-java-exceptions - 0.0.1-SNAPSHOT - core-java-exceptions + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + com.baeldung.exceptions + 4.0.0 + core-java-exceptions + 0.1.0-SNAPSHOT + core-java-exceptions + jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + - - - junit - junit - ${junit.version} - test - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - + + + javax.mail + mail + ${javax.mail.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + - - 3.9 - + + 1.5.0-b01 + + 3.10.0 + - + \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java deleted file mode 100644 index 780189b654..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.exceptions; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; - -public class CheckedUncheckedExceptions { - public static void checkedExceptionWithThrows() throws FileNotFoundException { - File file = new File("not_existing_file.txt"); - FileInputStream stream = new FileInputStream(file); - } - - public static void checkedExceptionWithTryCatch() { - File file = new File("not_existing_file.txt"); - try { - FileInputStream stream = new FileInputStream(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public static int divideByZero() { - int numerator = 1; - int denominator = 0; - return numerator / denominator; - } - - public static void checkFile(String fileName) throws IncorrectFileNameException { - if (fileName == null || fileName.isEmpty()) { - throw new NullOrEmptyException("The filename is null."); - } - if (!isCorrectFileName(fileName)) { - throw new IncorrectFileNameException("Incorrect filename : " + fileName); - } - } - - private static boolean isCorrectFileName(String fileName) { - if (fileName.equals("wrongFileName.txt")) - return false; - else - return true; - } -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java deleted file mode 100644 index 9877fe25ca..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.exceptions; - -public class IncorrectFileNameException extends Exception { - private static final long serialVersionUID = 1L; - - public IncorrectFileNameException(String errorMessage) { - super(errorMessage); - } - - public IncorrectFileNameException(String errorMessage, Throwable thr) { - super(errorMessage, thr); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java deleted file mode 100644 index d4ee9c0d6f..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.exceptions; - -public class NullOrEmptyException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public NullOrEmptyException(String errorMessage) { - super(errorMessage); - } - - public NullOrEmptyException(String errorMessage, Throwable thr) { - super(errorMessage, thr); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java deleted file mode 100644 index cf449110e6..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.baeldung.exceptions; - -import java.time.LocalDate; -import java.time.Period; -import java.time.format.DateTimeParseException; -import java.util.Objects; - -/** - * Utility class to find root cause exceptions. - */ -public class RootCauseFinder { - - private RootCauseFinder() { - } - - public static Throwable findCauseUsingPlainJava(Throwable throwable) { - Objects.requireNonNull(throwable); - Throwable rootCause = throwable; - while (rootCause.getCause() != null && rootCause.getCause() != rootCause) { - rootCause = rootCause.getCause(); - } - return rootCause; - } - - /** - * Calculates the age of a person from a given date. - */ - static class AgeCalculator { - - private AgeCalculator() { - } - - public static int calculateAge(String birthDate) { - if (birthDate == null || birthDate.isEmpty()) { - throw new IllegalArgumentException(); - } - - try { - return Period - .between(parseDate(birthDate), LocalDate.now()) - .getYears(); - } catch (DateParseException ex) { - throw new CalculationException(ex); - } - } - - private static LocalDate parseDate(String birthDateAsString) { - - LocalDate birthDate; - try { - birthDate = LocalDate.parse(birthDateAsString); - } catch (DateTimeParseException ex) { - throw new InvalidFormatException(birthDateAsString, ex); - } - - if (birthDate.isAfter(LocalDate.now())) { - throw new DateOutOfRangeException(birthDateAsString); - } - - return birthDate; - } - - } - - static class CalculationException extends RuntimeException { - - CalculationException(DateParseException ex) { - super(ex); - } - } - - static class DateParseException extends RuntimeException { - - DateParseException(String input) { - super(input); - } - - DateParseException(String input, Throwable thr) { - super(input, thr); - } - } - - static class InvalidFormatException extends DateParseException { - - InvalidFormatException(String input, Throwable thr) { - super("Invalid date format: " + input, thr); - } - } - - static class DateOutOfRangeException extends DateParseException { - - DateOutOfRangeException(String date) { - super("Date out of range: " + date); - } - - } - -} diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java similarity index 73% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java index 3d66c2b535..a2eae50108 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java @@ -1,9 +1,9 @@ -package com.baeldung.chainedexception; +package com.baeldung.exceptions.chainedexception; -import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; -import com.baeldung.chainedexception.exceptions.ManagerUpsetException; -import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; -import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.exceptions.chainedexception.exceptions.TeamLeadUpsetException; public class LogWithChain { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java similarity index 75% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java index 7556e30663..8c37db0307 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java @@ -1,9 +1,9 @@ -package com.baeldung.chainedexception; +package com.baeldung.exceptions.chainedexception; -import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; -import com.baeldung.chainedexception.exceptions.ManagerUpsetException; -import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; -import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.exceptions.chainedexception.exceptions.TeamLeadUpsetException; public class LogWithoutChain { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java similarity index 82% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java index e20c58ea5b..91537b58d4 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class GirlFriendOfManagerUpsetException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java similarity index 80% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java index e95a3921a4..351521a522 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class ManagerUpsetException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java similarity index 80% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java index b9521858b3..dd84baae74 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class NoLeaveGrantedException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java similarity index 80% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java index f874620f00..4ea8c3db7a 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class TeamLeadUpsetException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java similarity index 96% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java index b6f4d960aa..adc1b1613c 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; import java.io.File; import java.io.FileNotFoundException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java similarity index 83% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java index c6dc6d6964..4e8fece145 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; public class IncorrectFileExtensionException extends RuntimeException{ private static final long serialVersionUID = 1L; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java similarity index 82% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java index a804cadb84..f7f6a9dd8c 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; public class IncorrectFileNameException extends Exception { private static final long serialVersionUID = 1L; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java similarity index 99% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java index 32d88cfd12..14483b3489 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; import java.io.File; import java.io.FileNotFoundException; diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java new file mode 100644 index 0000000000..bc2c6baffb --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java @@ -0,0 +1,5 @@ +package com.baeldung.exceptions.exceptionhandling; + +public class MyException extends Throwable { + +} diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java similarity index 72% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java index e866802fe3..1251cd58e6 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; public class Player { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java similarity index 75% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java index d92edeebbd..432232c23e 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; import java.io.IOException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java similarity index 71% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java index 299370ee86..ba2a6d74e4 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; public class PlayerScoreException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java similarity index 71% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java index 0211284e5d..0f926ccf58 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; public class TimeoutException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java similarity index 88% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java index af0449c0da..9e5e7461ea 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalize; +package com.baeldung.exceptions.keywords.finalize; public class FinalizeObject { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java index 8615c78652..b006850199 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalkeyword; +package com.baeldung.exceptions.keywords.finalkeyword; public final class Child extends Parent { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java similarity index 56% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java index 1530c5037f..f8adf27914 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalkeyword; +package com.baeldung.exceptions.keywords.finalkeyword; /*public class GrandChild extends Child { // Compilation error diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java similarity index 87% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java index 5cd2996e7a..2a5d19a32f 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalkeyword; +package com.baeldung.exceptions.keywords.finalkeyword; public class Parent { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java similarity index 92% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java index 3c0aee3196..8f9d9a29d2 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finallykeyword; +package com.baeldung.exceptions.keywords.finallykeyword; public class FinallyExample { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java similarity index 55% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java index b5b357a322..a82f430959 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java @@ -1,4 +1,4 @@ -package com.baeldung.noclassdeffounderror; +package com.baeldung.exceptions.noclassdeffounderror; public class ClassWithInitErrors { static int data = 1 / 0; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java index 7bcefbdbd3..0dc74a9d01 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java @@ -1,4 +1,4 @@ -package com.baeldung.noclassdeffounderror; +package com.baeldung.exceptions.noclassdeffounderror; public class NoClassDefFoundErrorExample { public ClassWithInitErrors getClassWithInitErrors() { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java similarity index 90% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java index 88a8696053..06b587d0e0 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import lombok.SneakyThrows; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java similarity index 90% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java index 847aaa7249..e86ef53733 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import java.io.IOException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java similarity index 74% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java index 91b8a3bbb0..5beac1cd04 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class AccountHolder { private String firstName; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java index 3b95fd1368..e290a1fe38 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class ClassOne { private int oneValue; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java index 0adf075b43..fc6a89e1fb 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class ClassTwo { private int twoValue; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java index c67eeb30d1..858871cb9d 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class InfiniteRecursionWithTerminationCondition { public int calculateFactorial(final int number) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java index 8d10c65dcc..69b1c0b5ab 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class RecursionWithCorrectTerminationCondition { public int calculateFactorial(final int number) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java similarity index 75% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java index 0b7fb3cf94..c07fdcb01b 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class UnintendedInfiniteRecursion { public int calculateFactorial(int number) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java index 0b371dcedb..448c8e2213 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; public class DataAccessException extends RuntimeException { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java similarity index 95% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java index 17fbf5a582..dfe8fcbd5a 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import com.sun.mail.iap.ConnectionException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java similarity index 79% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java index 7d8345c3c1..73453f4fc0 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import java.sql.SQLException; import java.util.List; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java similarity index 90% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java index 6bb8b90bf1..605d900633 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import java.sql.SQLException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java similarity index 85% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java index 2fd87f124d..f8a603f013 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import com.sun.mail.iap.ConnectionException; diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java deleted file mode 100644 index 6dcd0d72e0..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.exception.error; - -import org.junit.Assert; -import org.junit.Test; - -public class ErrorGeneratorUnitTest { - - @Test(expected = AssertionError.class) - public void whenError_thenIsNotCaughtByCatchException() { - try { - throw new AssertionError(); - } catch (Exception e) { - Assert.fail(); // errors are not caught by catch exception - } - } - - @Test - public void whenError_thenIsCaughtByCatchError() { - try { - throw new AssertionError(); - } catch (Error e) { - // caught! -> test pass - } - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java deleted file mode 100644 index cb26bf451a..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.baeldung.exception.numberformat; - -import static org.junit.Assert.assertEquals; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.text.NumberFormat; -import java.text.ParseException; -import java.util.Locale; -import java.util.logging.Logger; - -import org.junit.Test; - -/** - * A set of examples tested to show cases where NumberFormatException is thrown and not thrown. - */ -public class NumberFormatExceptionUnitTest { - - Logger LOG = Logger.getLogger(NumberFormatExceptionUnitTest.class.getName()); - - /* ---INTEGER FAIL CASES--- */ - @Test(expected = NumberFormatException.class) - public void givenByteConstructor_whenAlphabetAsInput_thenFail() { - Byte byteInt = new Byte("one"); - } - - @Test(expected = NumberFormatException.class) - public void givenShortConstructor_whenSpaceInInput_thenFail() { - Short shortInt = new Short("2 "); - } - - @Test(expected = NumberFormatException.class) - public void givenParseIntMethod_whenSpaceInInput_thenFail() { - Integer aIntPrim = Integer.parseInt("6000 "); - } - - @Test(expected = NumberFormatException.class) - public void givenParseIntMethod_whenUnderscoreInInput_thenFail() { - int bIntPrim = Integer.parseInt("_6000"); - } - - @Test(expected = NumberFormatException.class) - public void givenIntegerValueOfMethod_whenCommaInInput_thenFail() { - Integer cIntPrim = Integer.valueOf("6,000"); - } - - @Test(expected = NumberFormatException.class) - public void givenBigIntegerConstructor_whenDecimalInInput_thenFail() { - BigInteger bigInteger = new BigInteger("4.0"); - } - - @Test(expected = NumberFormatException.class) - public void givenDecodeMethod_whenAlphabetInInput_thenFail() { - Long decodedLong = Long.decode("64403L"); - } - - /* ---INTEGER PASS CASES--- */ - @Test - public void givenInvalidNumberInputs_whenOptimized_thenPass() { - Byte byteInt = new Byte("1"); - assertEquals(1, byteInt.intValue()); - - Short shortInt = new Short("2 ".trim()); - assertEquals(2, shortInt.intValue()); - - Integer aIntObj = Integer.valueOf("6"); - assertEquals(6, aIntObj.intValue()); - - BigInteger bigInteger = new BigInteger("4"); - assertEquals(4, bigInteger.intValue()); - - int aIntPrim = Integer.parseInt("6000 ".trim()); - assertEquals(6000, aIntPrim); - - int bIntPrim = Integer.parseInt("_6000".replaceAll("_", "")); - assertEquals(6000, bIntPrim); - - int cIntPrim = Integer.parseInt("-6000"); - assertEquals(-6000, cIntPrim); - - Long decodeInteger = Long.decode("644032334"); - assertEquals(644032334L, decodeInteger.longValue()); - } - - /* ---DOUBLE FAIL CASES--- */ - @Test(expected = NumberFormatException.class) - public void givenFloatConstructor_whenAlphabetInInput_thenFail() { - Float floatDecimalObj = new Float("one.1"); - } - - @Test(expected = NumberFormatException.class) - public void givenDoubleConstructor_whenAlphabetInInput_thenFail() { - Double doubleDecimalObj = new Double("two.2"); - } - - @Test(expected = NumberFormatException.class) - public void givenBigDecimalConstructor_whenSpecialCharsInInput_thenFail() { - BigDecimal bigDecimalObj = new BigDecimal("3_0.3"); - } - - @Test(expected = NumberFormatException.class) - public void givenParseDoubleMethod_whenCommaInInput_thenFail() { - double aDoublePrim = Double.parseDouble("4000,1"); - } - - /* ---DOUBLE PASS CASES--- */ - @Test - public void givenDoubleConstructor_whenDecimalInInput_thenPass() { - Double doubleDecimalObj = new Double("2.2"); - assertEquals(2.2, doubleDecimalObj.doubleValue(), 0); - } - - @Test - public void givenDoubleValueOfMethod_whenMinusInInput_thenPass() { - Double aDoubleObj = Double.valueOf("-6000"); - assertEquals(-6000, aDoubleObj.doubleValue(), 0); - } - - @Test - public void givenUsDecimalNumber_whenParsedWithNumberFormat_thenPass() throws ParseException { - Number parsedNumber = parseNumberWithLocale("4000.1", Locale.US); - assertEquals(4000.1, parsedNumber); - assertEquals(4000.1, parsedNumber.doubleValue(), 0); - assertEquals(4000, parsedNumber.intValue()); - } - - /** - * In most European countries (for example, France), comma is used as decimal in place of period. - * @throws ParseException if the input string contains special characters other than comma or decimal. - * In this test case, anything after decimal (period) is dropped when a European locale is set. - */ - @Test - public void givenEuDecimalNumberHasComma_whenParsedWithNumberFormat_thenPass() throws ParseException { - Number parsedNumber = parseNumberWithLocale("4000,1", Locale.FRANCE); - LOG.info("Number parsed is: " + parsedNumber); - assertEquals(4000.1, parsedNumber); - assertEquals(4000.1, parsedNumber.doubleValue(), 0); - assertEquals(4000, parsedNumber.intValue()); - } - - /** - * Converts a string into a number retaining all decimals, and symbols valid in a locale. - * @param number the input string for a number. - * @param locale the locale to consider while parsing a number. - * @return the generic number object which can represent multiple number types. - * @throws ParseException when input contains invalid characters. - */ - private Number parseNumberWithLocale(String number, Locale locale) throws ParseException { - locale = locale == null ? Locale.getDefault() : locale; - NumberFormat numberFormat = NumberFormat.getInstance(locale); - return numberFormat.parse(number); - } - -} diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java deleted file mode 100644 index d82b1349d8..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.exceptions; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.FileNotFoundException; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -/** - * Tests the {@link CheckedUncheckedExceptions}. - */ -public class CheckedUncheckedExceptionsUnitTest { - - @Test - public void whenFileNotExist_thenThrowException() { - assertThrows(FileNotFoundException.class, () -> { - CheckedUncheckedExceptions.checkedExceptionWithThrows(); - }); - } - - @Test - public void whenTryCatchExcetpion_thenSuccess() { - try { - CheckedUncheckedExceptions.checkedExceptionWithTryCatch(); - } catch (Exception e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void whenDivideByZero_thenThrowException() { - assertThrows(ArithmeticException.class, () -> { - CheckedUncheckedExceptions.divideByZero(); - }); - } - - @Test - public void whenInvalidFile_thenThrowException() { - - assertThrows(IncorrectFileNameException.class, () -> { - CheckedUncheckedExceptions.checkFile("wrongFileName.txt"); - }); - } - - @Test - public void whenNullOrEmptyFile_thenThrowException() { - assertThrows(NullOrEmptyException.class, () -> { - CheckedUncheckedExceptions.checkFile(null); - }); - assertThrows(NullOrEmptyException.class, () -> { - CheckedUncheckedExceptions.checkFile(""); - }); - } -} diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java deleted file mode 100644 index 5d0f3b9c3e..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.baeldung.exceptions; - -import com.google.common.base.Throwables; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoUnit; - -import static com.baeldung.exceptions.RootCauseFinder.*; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Tests the {@link RootCauseFinder}. - */ -public class RootCauseFinderUnitTest { - - @Test - public void givenBirthDate_whenCalculatingAge_thenAgeReturned() { - try { - int age = AgeCalculator.calculateAge("1990-01-01"); - Assertions.assertEquals(1990, LocalDate - .now() - .minus(age, ChronoUnit.YEARS) - .getYear()); - } catch (CalculationException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("010102"); - } catch (CalculationException ex) { - assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException); - } - } - - @Test - public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("2020-04-04"); - } catch (CalculationException ex) { - assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException); - } - } - - @Test - public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge(null); - } catch (Exception ex) { - assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException); - } - } - - @Test - public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("010102"); - } catch (CalculationException ex) { - assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException); - } - } - - @Test - public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("2020-04-04"); - } catch (CalculationException ex) { - assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException); - } - } - - @Test - public void givenNullDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseNotFound() { - try { - AgeCalculator.calculateAge(null); - } catch (Exception ex) { - assertTrue(ExceptionUtils.getRootCause(ex) instanceof IllegalArgumentException); - } - } - - @Test - public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("010102"); - } catch (CalculationException ex) { - assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException); - } - } - - @Test - public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("2020-04-04"); - } catch (CalculationException ex) { - assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException); - } - } - - @Test - public void givenNullDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge(null); - } catch (Exception ex) { - assertTrue(Throwables.getRootCause(ex) instanceof IllegalArgumentException); - } - } - -} diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java similarity index 84% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java index 59605fb1c9..9311a9d886 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.classnotfoundexception; +package com.baeldung.exceptions.classnotfoundexception; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java index 230698f719..80787daaaa 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java similarity index 92% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java index acb05eb763..8e135c1cec 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java similarity index 97% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java index 29c690133d..3551de3631 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java similarity index 85% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java index 521c50098a..135a51f9dd 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.noclassdeffounderror; +package com.baeldung.exceptions.noclassdeffounderror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java similarity index 89% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java index 8d8e4f14fe..086c4eaef0 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java similarity index 89% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java index da1b2e617b..3b70128a9b 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java similarity index 82% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java index 180b7723ac..dac8698bf8 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java similarity index 81% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java index 95164ac935..db6b1d45f8 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java similarity index 95% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java index ccf8c25271..2c7289cd5c 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java similarity index 89% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java index 40c2c4799e..e7fb0874ea 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java similarity index 94% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java index f4e2e5221a..0f1d71034d 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java similarity index 92% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java index b9a658a960..87f6224217 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension b/core-java-modules/core-java-exceptions/src/test/resources/correctFileNameWithoutProperExtension similarity index 100% rename from core-java-modules/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension rename to core-java-modules/core-java-exceptions/src/test/resources/correctFileNameWithoutProperExtension diff --git a/core-java-modules/core-java-function/README.md b/core-java-modules/core-java-function/README.md new file mode 100644 index 0000000000..677f148bdb --- /dev/null +++ b/core-java-modules/core-java-function/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain) \ No newline at end of file diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml new file mode 100644 index 0000000000..5ed7ca68c2 --- /dev/null +++ b/core-java-modules/core-java-function/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + com.baeldung + core-java-function + 0.1.0-SNAPSHOT + core-java-function + 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-function + + + src/main/resources + true + + + + + + + 3.6.1 + 1.8.9 + + 2.22.1 + + diff --git a/testing-modules/runjunitfromjava/src/main/resources/logback.xml b/core-java-modules/core-java-function/src/main/resources/logback.xml similarity index 100% rename from testing-modules/runjunitfromjava/src/main/resources/logback.xml rename to core-java-modules/core-java-function/src/main/resources/logback.xml diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java rename to core-java-modules/core-java-function/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java diff --git a/core-java-modules/core-java-io-2/.gitignore b/core-java-modules/core-java-io-2/.gitignore new file mode 100644 index 0000000000..de044ef20f --- /dev/null +++ b/core-java-modules/core-java-io-2/.gitignore @@ -0,0 +1,3 @@ +# Intellij +.idea/ +*.iml diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml new file mode 100644 index 0000000000..64d9434beb --- /dev/null +++ b/core-java-modules/core-java-io-2/pom.xml @@ -0,0 +1,279 @@ + + 4.0.0 + core-java-io-2 + 0.1.0-SNAPSHOT + core-java-io-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + org.unix4j + unix4j-command + ${unix4j.version} + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.javamoney + moneta + ${moneta.version} + + + org.owasp.esapi + esapi + ${esapi.version} + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + runtime + + + + org.asynchttpclient + async-http-client + ${async-http-client.version} + + + com.opencsv + opencsv + ${opencsv.version} + test + + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + + + + + core-java-io-2 + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 4.1 + 4.01 + 0.4 + 1.8.7 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + 4.1 + + 3.6.1 + 1.7.0 + + + 3.0.0-M1 + 2.4.0 + 2.1.0.1 + 1.19 + 2.4.5 + + 1.18 + 0.1.5 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java new file mode 100644 index 0000000000..34a8f61615 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java @@ -0,0 +1,57 @@ +package com.baeldung.filereader; + +import java.io.*; + +public class FileReaderExample { + + public static String readAllCharactersOneByOne(Reader reader) throws IOException { + StringBuilder content = new StringBuilder(); + int nextChar; + while ((nextChar = reader.read()) != -1) { + content.append((char) nextChar); + } + return String.valueOf(content); + } + + public static String readMultipleCharacters(Reader reader, int length) throws IOException { + char[] buffer = new char[length]; + int charactersRead = reader.read(buffer, 0, length); + + + if (charactersRead != -1) { + return new String(buffer, 0, charactersRead); + } else { + return ""; + } + } + + public static String readFile(String path) { + FileReader fileReader = null; + try { + fileReader = new FileReader(path); + return readAllCharactersOneByOne(fileReader); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fileReader != null) { + try { + fileReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + public static String readFileUsingTryWithResources(String path) { + try (FileReader fileReader = new FileReader(path)) { + return readAllCharactersOneByOne(fileReader); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + +} \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java new file mode 100644 index 0000000000..338d53c597 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.createfiles; + +import com.google.common.io.Files; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class CreateFilesUnitTest { + @Test + public void givenAnExistingDirectory_whenCreatingAFileWithAbsolutePath_thenFileIsCreated() throws IOException { + File tempDirectory = new File(System.getProperty("java.io.tmpdir")); + File fileWithAbsolutePath = new File(tempDirectory.getAbsolutePath() + "/myDirectory/testFile.txt"); + + assertFalse(fileWithAbsolutePath.exists()); + + Files.touch(fileWithAbsolutePath); + + assertTrue(fileWithAbsolutePath.exists()); + } + + @Test + public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFileWithRelativePath_thenFileIsCreated() throws IOException { + File tempDirectory = new File(System.getProperty("java.io.tmpdir")); + File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt"); + + assertFalse(fileWithRelativePath.exists()); + + Files.touch(fileWithRelativePath); + + assertTrue(fileWithRelativePath.exists()); + } + + @Test + public void whenCreatingAFileWithFileSeparator_thenFileIsCreated() throws IOException { + File tempDirectory = new File(System.getProperty("java.io.tmpdir")); + File newFile = new File(tempDirectory.getAbsolutePath() + File.separator + "newFile.txt"); + + assertFalse(newFile.exists()); + + Files.touch(newFile); + + assertTrue(newFile.exists()); + } +} diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java new file mode 100644 index 0000000000..4f893fb327 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.filereader; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +public class FileReaderExampleUnitTest { + + + private static final String FILE_PATH = "src/test/resources/HelloWorld.txt"; + + + @Test + public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException { + String expectedText = "Hello, World!"; + File file = new File(FILE_PATH); + try (FileReader fileReader = new FileReader(file)) { + String content = FileReaderExample.readAllCharactersOneByOne(fileReader); + Assert.assertEquals(expectedText, content); + } + } + + @Test + public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException { + String expectedText = "Hello"; + File file = new File(FILE_PATH); + try (FileReader fileReader = new FileReader(file)) { + String content = FileReaderExample.readMultipleCharacters(fileReader, 5); + Assert.assertEquals(expectedText, content); + } + } + + @Test + public void whenReadFile_thenReturnsContent() { + String expectedText = "Hello, World!"; + String content = FileReaderExample.readFile(FILE_PATH); + Assert.assertEquals(expectedText, content); + } + + @Test + public void whenReadFileUsingTryWithResources_thenReturnsContent() { + String expectedText = "Hello, World!"; + String content = FileReaderExample.readFileUsingTryWithResources(FILE_PATH); + Assert.assertEquals(expectedText, content); + } + +} diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java new file mode 100644 index 0000000000..f94a73b023 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.filewriter; + +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; + +public class FileWriterExampleUnitTest { + + @After + public void tearDown() throws IOException { + Files.delete(Path.of("src/test/resources/FileWriterTest.txt")); + } + + @Test + public void testWriteString() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { + fileWriter.write("Hello Folks!"); + } + Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testAppendString() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { + fileWriter.write("Hello Folks!"); + } + // using another try with resources to reopen the file in append mode + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", true)) { + fileWriter.write("Hello Folks Again!"); + } + + Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testWriteCharArray() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { + fileWriter.write("Hello Folks!".toCharArray()); + } + Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } +} diff --git a/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt new file mode 100644 index 0000000000..b45ef6fec8 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/.gitignore b/core-java-modules/core-java-io-files/.gitignore new file mode 100644 index 0000000000..c61d35324d --- /dev/null +++ b/core-java-modules/core-java-io-files/.gitignore @@ -0,0 +1,5 @@ +0.* + +# Files generated by integration tests +# *.txt +/temp \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/README.md b/core-java-modules/core-java-io-files/README.md new file mode 100644 index 0000000000..80c0dc941e --- /dev/null +++ b/core-java-modules/core-java-io-files/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java IO Files Cookbooks and Examples + +### Relevant Articles: +- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened) \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/pom.xml b/core-java-modules/core-java-io-files/pom.xml new file mode 100644 index 0000000000..0f4b5eea1d --- /dev/null +++ b/core-java-modules/core-java-io-files/pom.xml @@ -0,0 +1,296 @@ + + 4.0.0 + core-java-io-files + 0.1.0-SNAPSHOT + core-java-io-files + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + org.unix4j + unix4j-command + ${unix4j.version} + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.javamoney + moneta + ${moneta.version} + + + org.owasp.esapi + esapi + ${esapi.version} + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + runtime + + + + org.asynchttpclient + async-http-client + ${async-http-client.version} + + + com.opencsv + opencsv + ${opencsv.version} + test + + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + + + + + core-java-io-files + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 4.1 + 4.01 + 0.4 + 1.8.7 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + 4.1 + + 3.6.1 + 1.7.0 + + + 3.0.0-M1 + 2.4.0 + 2.1.0.1 + 1.19 + 2.4.5 + + 1.18 + 0.1.5 + 3.1.0 + + + + diff --git a/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java new file mode 100644 index 0000000000..7512b177df --- /dev/null +++ b/core-java-modules/core-java-io-files/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-files/src/main/resources/input.txt b/core-java-modules/core-java-io-files/src/main/resources/input.txt new file mode 100644 index 0000000000..650da894e8 --- /dev/null +++ b/core-java-modules/core-java-io-files/src/main/resources/input.txt @@ -0,0 +1,45 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien. + +Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla. + +Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis. + +Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis. + +Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et. + +Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor. + +Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui. + +Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices. + +Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas. + +Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus. + +Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque. + +Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla. + +Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non. + +Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam. + +Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in. + +Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat. + +Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi. + +Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex. + +Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor. + +Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue. \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/src/test/resources/.gitignore b/core-java-modules/core-java-io-files/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-io-files/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-io/README.md b/core-java-modules/core-java-io/README.md index 6737ad6eb9..023d7d64b5 100644 --- a/core-java-modules/core-java-io/README.md +++ b/core-java-modules/core-java-io/README.md @@ -1,6 +1,6 @@ -========= +## Core Java IO -## Core Java IO Cookbooks and Examples +This module contains articles about core Java input and output (IO) ### Relevant Articles: - [How to Read a Large File Efficiently with Java](http://www.baeldung.com/java-read-lines-large-file) @@ -41,3 +41,4 @@ - [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files) - [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes) - [Introduction to the Java NIO Selector](https://www.baeldung.com/java-nio-selector) +- [[More -->]](/core-java-modules/core-java-io-2) diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index 1a133d2cbe..84bf3baeed 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -207,6 +207,21 @@ ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + @@ -274,6 +289,8 @@ 1.18 0.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.2 3.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.0 core-java-networking-2 core-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-io commons-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-b01 4.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.8 1.8 5.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.0 3.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-exceptions core-java-optional core-java-lang-operators core-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.assertj assertj-core @@ -50,6 +66,9 @@ + 0.6.5 + 4.1 + 1.7.0 8.2.0 3.0.2 8.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.0 3.6.1 7.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.1 2.10 + 3.9 1.6 1.9 1.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[] 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[] 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> 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[] 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 + plugins 1.0-SNAPSHOT - hello-world + plugins hpi A 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-kt arrow-core - 0.7.3 + ${arrow-core.version} @@ -117,7 +117,7 @@ nl.komponents.kovenant kovenant - 3.3.0 + ${kovenant.version} pom @@ -132,13 +132,13 @@ com.google.guava guava - 27.1-jre + ${guava.version} org.jetbrains.kotlinx kotlinx-collections-immutable - 0.1 + ${kotlinx-collections-immutable.version} @@ -151,26 +151,26 @@ net.bytebuddy byte-buddy - 1.8.13 + ${byte-buddy.version} compile net.bytebuddy byte-buddy-agent - 1.8.13 + ${byte-buddy.version} compile org.objenesis objenesis - 2.6 + ${objenesis.version} compile io.reactivex.rxjava2 rxkotlin - 2.3.0 + ${rxkotlin.version} @@ -186,6 +186,13 @@ 3.10.0 0.10.4 1.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-chain commons-chain ${commons-chain.version} - - org.apache.commons - commons-csv - ${commons-csv.version} - commons-dbutils commons-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.1 1.9.3 1.2 - 1.4 3.6.2 1.6 - 4.1 - 2.0.0.0 1.10.L001 3.5.2 3.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-SNAPSHOT libraries-primitive + + 1.8 + 1.8 + + - - + + it.unimi.dsi fastutil 8.2.2 @@ -36,5 +41,18 @@ 1.19 test + + + 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.0 1.9.0 1.9.27 1.5.0 3.0.0 0.8.1 4.3.8.RELEASE - 3.0.3 + 4.1.1 3.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.asciidoctor asciidoctor-maven-plugin - 1.5.7.1 + ${asciidoctor-maven-plugin.version} @@ -789,6 +789,7 @@ 2.7.1 3.6 0.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 @@ log4j2 logback log-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.Final 4.3.4.RELEASE 1.8 1.8 1.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-modules com.baeldung 1.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-beanutils commons-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.199 9080 9443 + 7.3 + 1.62 + 1.62 com.nimbusds nimbus-jose-jwt - 7.3 + ${nimbus-jose-jwt.version} org.bouncycastle bcprov-jdk15on - 1.62 + ${bcprov-jdk15on.version} org.bouncycastle bcpkix-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 @@ 8643 http://localhost:9080 http://localhost:9280 + 1.1 org.eclipse.microprofile.jwt microprofile-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 @@ false RELEASE 2.6.4 + 8.0 + 1.3 javax javaee-web-api - 8.0 + ${javaee-web-api.version} provided org.eclipse.microprofile.config microprofile-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.optaplanner optaplanner-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-architectural 1.0 - design-patterns + design-patterns-architectural jar @@ -21,7 +21,8 @@ ${assertj-core.version} test - + + javax javaee-api ${javaee.version} @@ -37,24 +38,15 @@ ${mysql-connector.version} jar - - log4j - log4j - ${log4j.version} - - - com.googlecode.grep4j - grep4j - ${grep4j.version} - UTF-8 1.8 1.8 - 1.8.7 + 3.9.1 + 8.0 5.2.16.Final 6.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-behavioral 1.0 - design-patterns-2 + design-patterns-behavioral jar @@ -31,32 +31,21 @@ commons-lang3 ${commons-lang3.version} + org.assertj assertj-core - ${assertj.version} + ${assertj-core.version} test - - - org.inferred - freebuilder - ${freebuilder.version} - true - - - com.google.code.findbugs - jsr305 - ${javax.annotations.version} - + UTF-8 1.8 1.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-controller intercepting-filter - design-patterns - design-patterns-2 + design-patterns-architectural + design-patterns-behavioral + design-patterns-behavioral-2 + design-patterns-creational + design-patterns-functional + design-patterns-structural solid dip backoff-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.r2dbc r2dbc-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.sirix sirix-core - 0.9.3 + ${sirix-core.version} @@ -48,5 +48,6 @@ UTF-8 11 + 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.boot spring-boot-starter-web - 2.1.5.RELEASE org.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.10 2.23.0 2.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.0 org.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.RELEASE 2.1.5.RELEASE 5.3.3.Final 2.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.maven apt-maven-plugin - 1.1.3 + ${apt-maven-plugin.version} generate-sources @@ -148,6 +148,7 @@ 21.0 3.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 + + diff --git a/play-framework/introduction/bin/activator b/play-framework/introduction/bin/activator deleted file mode 100644 index a8b11d482f..0000000000 --- a/play-framework/introduction/bin/activator +++ /dev/null @@ -1,397 +0,0 @@ -#!/usr/bin/env bash - -### ------------------------------- ### -### Helper methods for BASH scripts ### -### ------------------------------- ### - -realpath () { -( - TARGET_FILE="$1" - FIX_CYGPATH="$2" - - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE=$(basename "$TARGET_FILE") - - COUNT=0 - while [ -L "$TARGET_FILE" -a $COUNT -lt 100 ] - do - TARGET_FILE=$(readlink "$TARGET_FILE") - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE=$(basename "$TARGET_FILE") - COUNT=$(($COUNT + 1)) - done - - # make sure we grab the actual windows path, instead of cygwin's path. - if [[ "x$FIX_CYGPATH" != "x" ]]; then - echo "$(cygwinpath "$(pwd -P)/$TARGET_FILE")" - else - echo "$(pwd -P)/$TARGET_FILE" - fi -) -} - - -# Uses uname to detect if we're in the odd cygwin environment. -is_cygwin() { - local os=$(uname -s) - case "$os" in - CYGWIN*) return 0 ;; - *) return 1 ;; - esac -} - -# TODO - Use nicer bash-isms here. -CYGWIN_FLAG=$(if is_cygwin; then echo true; else echo false; fi) - - -# This can fix cygwin style /cygdrive paths so we get the -# windows style paths. -cygwinpath() { - local file="$1" - if [[ "$CYGWIN_FLAG" == "true" ]]; then - echo $(cygpath -w $file) - else - echo $file - fi -} - -# Make something URI friendly -make_url() { - url="$1" - local nospaces=${url// /%20} - if is_cygwin; then - echo "/${nospaces//\\//}" - else - echo "$nospaces" - fi -} - -declare -a residual_args -declare -a java_args -declare -a scalac_args -declare -a sbt_commands -declare java_cmd=java -declare java_version -declare -r real_script_path="$(realpath "$0")" -declare -r sbt_home="$(realpath "$(dirname "$(dirname "$real_script_path")")")" -declare -r sbt_bin_dir="$(dirname "$real_script_path")" -declare -r app_version="1.3.10" - -declare -r script_name=activator -declare -r java_opts=( "${ACTIVATOR_OPTS[@]}" "${SBT_OPTS[@]}" "${JAVA_OPTS[@]}" "${java_opts[@]}" ) -userhome="$HOME" -if is_cygwin; then - # cygwin sets home to something f-d up, set to real windows homedir - userhome="$USERPROFILE" -fi -declare -r activator_user_home_dir="${userhome}/.activator" -declare -r java_opts_config_home="${activator_user_home_dir}/activatorconfig.txt" -declare -r java_opts_config_version="${activator_user_home_dir}/${app_version}/activatorconfig.txt" - -echoerr () { - echo 1>&2 "$@" -} -vlog () { - [[ $verbose || $debug ]] && echoerr "$@" -} -dlog () { - [[ $debug ]] && echoerr "$@" -} - -jar_file () { - echo "$(cygwinpath "${sbt_home}/libexec/activator-launch-${app_version}.jar")" -} - -acquire_sbt_jar () { - sbt_jar="$(jar_file)" - - if [[ ! -f "$sbt_jar" ]]; then - echoerr "Could not find launcher jar: $sbt_jar" - exit 2 - fi -} - -execRunner () { - # print the arguments one to a line, quoting any containing spaces - [[ $verbose || $debug ]] && echo "# Executing command line:" && { - for arg; do - if printf "%s\n" "$arg" | grep -q ' '; then - printf "\"%s\"\n" "$arg" - else - printf "%s\n" "$arg" - fi - done - echo "" - } - - # THis used to be exec, but we loose the ability to re-hook stty then - # for cygwin... Maybe we should flag the feature here... - "$@" -} - -addJava () { - dlog "[addJava] arg = '$1'" - java_args=( "${java_args[@]}" "$1" ) -} -addSbt () { - dlog "[addSbt] arg = '$1'" - sbt_commands=( "${sbt_commands[@]}" "$1" ) -} -addResidual () { - dlog "[residual] arg = '$1'" - residual_args=( "${residual_args[@]}" "$1" ) -} -addDebugger () { - addJava "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$1" -} - -get_mem_opts () { - # if we detect any of these settings in ${JAVA_OPTS} we need to NOT output our settings. - # The reason is the Xms/Xmx, if they don't line up, cause errors. - if [[ "${JAVA_OPTS}" == *-Xmx* ]] || [[ "${JAVA_OPTS}" == *-Xms* ]] || [[ "${JAVA_OPTS}" == *-XX:MaxPermSize* ]] || [[ "${JAVA_OPTS}" == *-XX:MaxMetaspaceSize* ]] || [[ "${JAVA_OPTS}" == *-XX:ReservedCodeCacheSize* ]]; then - echo "" - else - # a ham-fisted attempt to move some memory settings in concert - # so they need not be messed around with individually. - local mem=${1:-1024} - local codecache=$(( $mem / 8 )) - (( $codecache > 128 )) || codecache=128 - (( $codecache < 512 )) || codecache=512 - local class_metadata_size=$(( $codecache * 2 )) - local class_metadata_opt=$([[ "$java_version" < "1.8" ]] && echo "MaxPermSize" || echo "MaxMetaspaceSize") - - echo "-Xms${mem}m -Xmx${mem}m -XX:ReservedCodeCacheSize=${codecache}m -XX:${class_metadata_opt}=${class_metadata_size}m" - fi -} - -require_arg () { - local type="$1" - local opt="$2" - local arg="$3" - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - echo "$opt requires <$type> argument" - exit 1 - fi -} - -is_function_defined() { - declare -f "$1" > /dev/null -} - -# If we're *not* running in a terminal, and we don't have any arguments, then we need to add the 'ui' parameter -detect_terminal_for_ui() { - [[ ! -t 0 ]] && [[ "${#residual_args}" == "0" ]] && { - addResidual "ui" - } - # SPECIAL TEST FOR MAC - [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]] && [[ "${#residual_args}" == "0" ]] && { - echo "Detected MAC OSX launched script...." - echo "Swapping to UI" - addResidual "ui" - } -} - -process_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -h|-help) usage; exit 1 ;; - -v|-verbose) verbose=1 && shift ;; - -d|-debug) debug=1 && shift ;; - - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; - -batch) exec &1 | awk -F '"' '/version/ {print $2}') - vlog "[process_args] java_version = '$java_version'" -} - -# Detect that we have java installed. -checkJava() { - local required_version="$1" - # Now check to see if it's a good enough version - if [[ "$java_version" == "" ]]; then - echo - echo No java installations was detected. - echo Please go to http://www.java.com/getjava/ and download - echo - exit 1 - elif [[ ! "$java_version" > "$required_version" ]]; then - echo - echo The java installation you have is not up to date - echo $script_name requires at least version $required_version+, you have - echo version $java_version - echo - echo Please go to http://www.java.com/getjava/ and download - echo a valid Java Runtime and install before running $script_name. - echo - exit 1 - fi -} - - -run() { - # no jar? download it. - [[ -f "$sbt_jar" ]] || acquire_sbt_jar "$sbt_version" || { - # still no jar? uh-oh. - echo "Download failed. Obtain the sbt-launch.jar manually and place it at $sbt_jar" - exit 1 - } - - # process the combined args, then reset "$@" to the residuals - process_args "$@" - detect_terminal_for_ui - set -- "${residual_args[@]}" - argumentCount=$# - - # TODO - java check should be configurable... - checkJava "1.6" - - #If we're in cygwin, we should use the windows config, and terminal hacks - if [[ "$CYGWIN_FLAG" == "true" ]]; then - stty -icanon min 1 -echo > /dev/null 2>&1 - addJava "-Djline.terminal=jline.UnixTerminal" - addJava "-Dsbt.cygwin=true" - fi - - # run sbt - execRunner "$java_cmd" \ - "-Dactivator.home=$(make_url "$sbt_home")" \ - ${SBT_OPTS:-$default_sbt_opts} \ - $(get_mem_opts $sbt_mem) \ - ${JAVA_OPTS} \ - ${java_args[@]} \ - -jar "$sbt_jar" \ - "${sbt_commands[@]}" \ - "${residual_args[@]}" - - exit_code=$? - - # Clean up the terminal from cygwin hacks. - if [[ "$CYGWIN_FLAG" == "true" ]]; then - stty icanon echo > /dev/null 2>&1 - fi - exit $exit_code -} - - -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" -declare -r sbt_opts_file=".sbtopts" -declare -r etc_sbt_opts_file="${sbt_home}/conf/sbtopts" -declare -r win_sbt_opts_file="${sbt_home}/conf/sbtconfig.txt" - -usage() { - cat < path to global settings/plugins directory (default: ~/.sbt) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11 series) - -ivy path to local Ivy repository (default: ~/.ivy2) - -mem set memory options (default: $sbt_mem, which is $(get_mem_opts $sbt_mem)) - -no-share use all local caches; no sharing - -no-global uses global caches, but does not use global ~/.sbt directory. - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - - # sbt version (default: from project/build.properties if present, else latest release) - -sbt-version use the specified version of sbt - -sbt-jar use the specified jar as the sbt launcher - -sbt-rc use an RC version of sbt - -sbt-snapshot use a snapshot version of sbt - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # jvm options and output control - JAVA_OPTS environment variable, if unset uses "$java_opts" - SBT_OPTS environment variable, if unset uses "$default_sbt_opts" - ACTIVATOR_OPTS Environment variable, if unset uses "" - .sbtopts if this file exists in the current directory, it is - prepended to the runner args - /etc/sbt/sbtopts if this file exists, it is prepended to the runner args - -Dkey=val pass -Dkey=val directly to the java runtime - -J-X pass option -X directly to the java runtime - (-J is stripped) - -S-X add -X to sbt's scalacOptions (-S is stripped) - -In the case of duplicated or conflicting options, the order above -shows precedence: JAVA_OPTS lowest, command line options highest. -EOM -} - - - -process_my_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; - -no-share) addJava "$noshare_opts" && shift ;; - -no-global) addJava "-Dsbt.global.base=$(pwd)/project/.sbtboot" && shift ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -sbt-dir) require_arg path "$1" "$2" && addJava "-Dsbt.global.base=$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -batch) exec ^&1') do ( - if %%~j==java set JAVAINSTALLED=1 - if %%~j==openjdk set JAVAINSTALLED=1 -) - -rem Detect the same thing about javac -if "%_JAVACCMD%"=="" ( - if not "%JAVA_HOME%"=="" ( - if exist "%JAVA_HOME%\bin\javac.exe" set "_JAVACCMD=%JAVA_HOME%\bin\javac.exe" - ) -) -if "%_JAVACCMD%"=="" set _JAVACCMD=javac -for /F %%j in ('"%_JAVACCMD%" -version 2^>^&1') do ( - if %%~j==javac set JAVACINSTALLED=1 -) - -rem BAT has no logical or, so we do it OLD SCHOOL! Oppan Redmond Style -set JAVAOK=true -if not defined JAVAINSTALLED set JAVAOK=false -if not defined JAVACINSTALLED set JAVAOK=false - -if "%JAVAOK%"=="false" ( - echo. - echo A Java JDK is not installed or can't be found. - if not "%JAVA_HOME%"=="" ( - echo JAVA_HOME = "%JAVA_HOME%" - ) - echo. - echo Please go to - echo http://www.oracle.com/technetwork/java/javase/downloads/index.html - echo and download a valid Java JDK and install before running Activator. - echo. - echo If you think this message is in error, please check - echo your environment variables to see if "java.exe" and "javac.exe" are - echo available via JAVA_HOME or PATH. - echo. - if defined DOUBLECLICKED pause - exit /B 1 -) - -rem Check what Java version is being used to determine what memory options to use -for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do ( - set JAVA_VERSION=%%g -) - -rem Strips away the " characters -set JAVA_VERSION=%JAVA_VERSION:"=% - -rem TODO Check if there are existing mem settings in JAVA_OPTS/CFG_OPTS and use those instead of the below -for /f "delims=. tokens=1-3" %%v in ("%JAVA_VERSION%") do ( - set MAJOR=%%v - set MINOR=%%w - set BUILD=%%x - - set META_SIZE=-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=256M - if "!MINOR!" LSS "8" ( - set META_SIZE=-XX:PermSize=64M -XX:MaxPermSize=256M - ) - - set MEM_OPTS=!META_SIZE! - ) - -rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. -set _JAVA_OPTS=%JAVA_OPTS% -if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS% - -set DEBUG_OPTS= - -rem Loop through the arguments, building remaining args in args variable -set args= -:argsloop -if not "%~1"=="" ( - rem Checks if the argument contains "-D" and if true, adds argument 1 with 2 and puts an equal sign between them. - rem This is done since batch considers "=" to be a delimiter so we need to circumvent this behavior with a small hack. - set arg1=%~1 - if "!arg1:~0,2!"=="-D" ( - set "args=%args% "%~1"="%~2"" - shift - shift - goto argsloop - ) - - if "%~1"=="-jvm-debug" ( - if not "%~2"=="" ( - rem This piece of magic somehow checks that an argument is a number - for /F "delims=0123456789" %%i in ("%~2") do ( - set var="%%i" - ) - if defined var ( - rem Not a number, assume no argument given and default to 9999 - set JPDA_PORT=9999 - ) else ( - rem Port was given, shift arguments - set JPDA_PORT=%~2 - shift - ) - ) else ( - set JPDA_PORT=9999 - ) - shift - - set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=!JPDA_PORT! - goto argsloop - ) - rem else - set "args=%args% "%~1"" - shift - goto argsloop -) - -:run - -if "!args!"=="" ( - if defined DOUBLECLICKED ( - set CMDS="ui" - ) else set CMDS=!args! -) else set CMDS=!args! - -rem We add a / in front, so we get file:///C: instead of file://C: -rem Java considers the later a UNC path. -rem We also attempt a solid effort at making it URI friendly. -rem We don't even bother with UNC paths. -set JAVA_FRIENDLY_HOME_1=/!ACTIVATOR_HOME:\=/! -set JAVA_FRIENDLY_HOME=/!JAVA_FRIENDLY_HOME_1: =%%20! - -rem Checks if the command contains spaces to know if it should be wrapped in quotes or not -set NON_SPACED_CMD=%_JAVACMD: =% -if "%_JAVACMD%"=="%NON_SPACED_CMD%" %_JAVACMD% %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\libexec\%ACTIVATOR_LAUNCH_JAR%" %CMDS% -if NOT "%_JAVACMD%"=="%NON_SPACED_CMD%" "%_JAVACMD%" %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\libexec\%ACTIVATOR_LAUNCH_JAR%" %CMDS% - -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end - -@endlocal - -exit /B %ERROR_CODE% diff --git a/play-framework/introduction/build.sbt b/play-framework/introduction/build.sbt index 0f5ea736f6..5b05db6719 100644 --- a/play-framework/introduction/build.sbt +++ b/play-framework/introduction/build.sbt @@ -1,13 +1,10 @@ -name := """student-api""" +name := """introduction""" +organization := "com.baeldung" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayJava) -scalaVersion := "2.11.7" +scalaVersion := "2.13.0" -libraryDependencies ++= Seq( - javaJdbc, - cache, - javaWs -) +libraryDependencies += guice diff --git a/play-framework/introduction/conf/application.conf b/play-framework/introduction/conf/application.conf index 489d3f9b3e..85c184dcb1 100644 --- a/play-framework/introduction/conf/application.conf +++ b/play-framework/introduction/conf/application.conf @@ -1,353 +1,2 @@ # This is the main configuration file for the application. # https://www.playframework.com/documentation/latest/ConfigFile -# ~~~~~ -# Play uses HOCON as its configuration file format. HOCON has a number -# of advantages over other config formats, but there are two things that -# can be used when modifying settings. -# -# You can include other configuration files in this main application.conf file: -#include "extra-config.conf" -# -# You can declare variables and substitute for them: -#mykey = ${some.value} -# -# And if an environment variable exists when there is no other subsitution, then -# HOCON will fall back to substituting environment variable: -#mykey = ${JAVA_HOME} - -## Akka -# https://www.playframework.com/documentation/latest/ScalaAkka#Configuration -# https://www.playframework.com/documentation/latest/JavaAkka#Configuration -# ~~~~~ -# Play uses Akka internally and exposes Akka Streams and actors in Websockets and -# other streaming HTTP responses. -akka { - # "akka.log-config-on-start" is extraordinarly useful because it log the complete - # configuration at INFO level, including defaults and overrides, so it s worth - # putting at the very top. - # - # Put the following in your conf/logback.xml file: - # - # - # - # And then uncomment this line to debug the configuration. - # - #log-config-on-start = true -} - -## Secret key -# http://www.playframework.com/documentation/latest/ApplicationSecret -# ~~~~~ -# The secret key is used to sign Play's session cookie. -# This must be changed for production, but we don't recommend you change it in this file. -play.crypto.secret = "changeme" - -## Modules -# https://www.playframework.com/documentation/latest/Modules -# ~~~~~ -# Control which modules are loaded when Play starts. Note that modules are -# the replacement for "GlobalSettings", which are deprecated in 2.5.x. -# Please see https://www.playframework.com/documentation/latest/GlobalSettings -# for more information. -# -# You can also extend Play functionality by using one of the publically available -# Play modules: https://playframework.com/documentation/latest/ModuleDirectory -play.modules { - # By default, Play will load any class called Module that is defined - # in the root package (the "app" directory), or you can define them - # explicitly below. - # If there are any built-in modules that you want to disable, you can list them here. - #enabled += my.application.Module - - # If there are any built-in modules that you want to disable, you can list them here. - #disabled += "" -} - -## IDE -# https://www.playframework.com/documentation/latest/IDE -# ~~~~~ -# Depending on your IDE, you can add a hyperlink for errors that will jump you -# directly to the code location in the IDE in dev mode. The following line makes -# use of the IntelliJ IDEA REST interface: -#play.editor="http://localhost:63342/api/file/?file=%s&line=%s" - -## Internationalisation -# https://www.playframework.com/documentation/latest/JavaI18N -# https://www.playframework.com/documentation/latest/ScalaI18N -# ~~~~~ -# Play comes with its own i18n settings, which allow the user's preferred language -# to map through to internal messages, or allow the language to be stored in a cookie. -play.i18n { - # The application languages - langs = [ "en" ] - - # Whether the language cookie should be secure or not - #langCookieSecure = true - - # Whether the HTTP only attribute of the cookie should be set to true - #langCookieHttpOnly = true -} - -## Play HTTP settings -# ~~~~~ -play.http { - ## Router - # https://www.playframework.com/documentation/latest/JavaRouting - # https://www.playframework.com/documentation/latest/ScalaRouting - # ~~~~~ - # Define the Router object to use for this application. - # This router will be looked up first when the application is starting up, - # so make sure this is the entry point. - # Furthermore, it's assumed your route file is named properly. - # So for an application router like `my.application.Router`, - # you may need to define a router file `conf/my.application.routes`. - # Default to Routes in the root package (aka "apps" folder) (and conf/routes) - #router = my.application.Router - - ## Action Creator - # https://www.playframework.com/documentation/latest/JavaActionCreator - # ~~~~~ - #actionCreator = null - - ## ErrorHandler - # https://www.playframework.com/documentation/latest/JavaRouting - # https://www.playframework.com/documentation/latest/ScalaRouting - # ~~~~~ - # If null, will attempt to load a class called ErrorHandler in the root package, - #errorHandler = null - - ## Filters - # https://www.playframework.com/documentation/latest/ScalaHttpFilters - # https://www.playframework.com/documentation/latest/JavaHttpFilters - # ~~~~~ - # Filters run code on every request. They can be used to perform - # common logic for all your actions, e.g. adding common headers. - # Defaults to "Filters" in the root package (aka "apps" folder) - # Alternatively you can explicitly register a class here. - #filters = my.application.Filters - - ## Session & Flash - # https://www.playframework.com/documentation/latest/JavaSessionFlash - # https://www.playframework.com/documentation/latest/ScalaSessionFlash - # ~~~~~ - session { - # Sets the cookie to be sent only over HTTPS. - #secure = true - - # Sets the cookie to be accessed only by the server. - #httpOnly = true - - # Sets the max-age field of the cookie to 5 minutes. - # NOTE: this only sets when the browser will discard the cookie. Play will consider any - # cookie value with a valid signature to be a valid session forever. To implement a server side session timeout, - # you need to put a timestamp in the session and check it at regular intervals to possibly expire it. - #maxAge = 300 - - # Sets the domain on the session cookie. - #domain = "example.com" - } - - flash { - # Sets the cookie to be sent only over HTTPS. - #secure = true - - # Sets the cookie to be accessed only by the server. - #httpOnly = true - } -} - -## Netty Provider -# https://www.playframework.com/documentation/latest/SettingsNetty -# ~~~~~ -play.server.netty { - # Whether the Netty wire should be logged - #log.wire = true - - # If you run Play on Linux, you can use Netty's native socket transport - # for higher performance with less garbage. - #transport = "native" -} - -## WS (HTTP Client) -# https://www.playframework.com/documentation/latest/ScalaWS#Configuring-WS -# ~~~~~ -# The HTTP client primarily used for REST APIs. The default client can be -# configured directly, but you can also create different client instances -# with customized settings. You must enable this by adding to build.sbt: -# -# libraryDependencies += ws // or javaWs if using java -# -play.ws { - # Sets HTTP requests not to follow 302 requests - #followRedirects = false - - # Sets the maximum number of open HTTP connections for the client. - #ahc.maxConnectionsTotal = 50 - - ## WS SSL - # https://www.playframework.com/documentation/latest/WsSSL - # ~~~~~ - ssl { - # Configuring HTTPS with Play WS does not require programming. You can - # set up both trustManager and keyManager for mutual authentication, and - # turn on JSSE debugging in development with a reload. - #debug.handshake = true - #trustManager = { - # stores = [ - # { type = "JKS", path = "exampletrust.jks" } - # ] - #} - } -} - -## Cache -# https://www.playframework.com/documentation/latest/JavaCache -# https://www.playframework.com/documentation/latest/ScalaCache -# ~~~~~ -# Play comes with an integrated cache API that can reduce the operational -# overhead of repeated requests. You must enable this by adding to build.sbt: -# -# libraryDependencies += cache -# -play.cache { - # If you want to bind several caches, you can bind the individually - #bindCaches = ["db-cache", "user-cache", "session-cache"] -} - -## Filters -# https://www.playframework.com/documentation/latest/Filters -# ~~~~~ -# There are a number of built-in filters that can be enabled and configured -# to give Play greater security. You must enable this by adding to build.sbt: -# -# libraryDependencies += filters -# -play.filters { - ## CORS filter configuration - # https://www.playframework.com/documentation/latest/CorsFilter - # ~~~~~ - # CORS is a protocol that allows web applications to make requests from the browser - # across different domains. - # NOTE: You MUST apply the CORS configuration before the CSRF filter, as CSRF has - # dependencies on CORS settings. - cors { - # Filter paths by a whitelist of path prefixes - #pathPrefixes = ["/some/path", ...] - - # The allowed origins. If null, all origins are allowed. - #allowedOrigins = ["http://www.example.com"] - - # The allowed HTTP methods. If null, all methods are allowed - #allowedHttpMethods = ["GET", "POST"] - } - - ## CSRF Filter - # https://www.playframework.com/documentation/latest/ScalaCsrf#Applying-a-global-CSRF-filter - # https://www.playframework.com/documentation/latest/JavaCsrf#Applying-a-global-CSRF-filter - # ~~~~~ - # Play supports multiple methods for verifying that a request is not a CSRF request. - # The primary mechanism is a CSRF token. This token gets placed either in the query string - # or body of every form submitted, and also gets placed in the users session. - # Play then verifies that both tokens are present and match. - csrf { - # Sets the cookie to be sent only over HTTPS - #cookie.secure = true - - # Defaults to CSRFErrorHandler in the root package. - #errorHandler = MyCSRFErrorHandler - } - - ## Security headers filter configuration - # https://www.playframework.com/documentation/latest/SecurityHeaders - # ~~~~~ - # Defines security headers that prevent XSS attacks. - # If enabled, then all options are set to the below configuration by default: - headers { - # The X-Frame-Options header. If null, the header is not set. - #frameOptions = "DENY" - - # The X-XSS-Protection header. If null, the header is not set. - #xssProtection = "1; mode=block" - - # The X-Content-Type-Options header. If null, the header is not set. - #contentTypeOptions = "nosniff" - - # The X-Permitted-Cross-Domain-Policies header. If null, the header is not set. - #permittedCrossDomainPolicies = "master-only" - - # The Content-Security-Policy header. If null, the header is not set. - #contentSecurityPolicy = "default-src 'self'" - } - - ## Allowed hosts filter configuration - # https://www.playframework.com/documentation/latest/AllowedHostsFilter - # ~~~~~ - # Play provides a filter that lets you configure which hosts can access your application. - # This is useful to prevent cache poisoning attacks. - hosts { - # Allow requests to example.com, its subdomains, and localhost:9000. - #allowed = [".example.com", "localhost:9000"] - } -} - -## Evolutions -# https://www.playframework.com/documentation/latest/Evolutions -# ~~~~~ -# Evolutions allows database scripts to be automatically run on startup in dev mode -# for database migrations. You must enable this by adding to build.sbt: -# -# libraryDependencies += evolutions -# -play.evolutions { - # You can disable evolutions for a specific datasource if necessary - #db.default.enabled = false -} - -## Database Connection Pool -# https://www.playframework.com/documentation/latest/SettingsJDBC -# ~~~~~ -# Play doesn't require a JDBC database to run, but you can easily enable one. -# -# libraryDependencies += jdbc -# -play.db { - # The combination of these two settings results in "db.default" as the - # default JDBC pool: - #config = "db" - #default = "default" - - # Play uses HikariCP as the default connection pool. You can override - # settings by changing the prototype: - prototype { - # Sets a fixed JDBC connection pool size of 50 - #hikaricp.minimumIdle = 50 - #hikaricp.maximumPoolSize = 50 - } -} - -## JDBC Datasource -# https://www.playframework.com/documentation/latest/JavaDatabase -# https://www.playframework.com/documentation/latest/ScalaDatabase -# ~~~~~ -# Once JDBC datasource is set up, you can work with several different -# database options: -# -# Slick (Scala preferred option): https://www.playframework.com/documentation/latest/PlaySlick -# JPA (Java preferred option): https://playframework.com/documentation/latest/JavaJPA -# EBean: https://playframework.com/documentation/latest/JavaEbean -# Anorm: https://www.playframework.com/documentation/latest/ScalaAnorm -# -db { - # You can declare as many datasources as you want. - # By convention, the default datasource is named `default` - - # https://www.playframework.com/documentation/latest/Developing-with-the-H2-Database - #default.driver = org.h2.Driver - #default.url = "jdbc:h2:mem:play" - #default.username = sa - #default.password = "" - - # You can turn on SQL logging for any datasource - # https://www.playframework.com/documentation/latest/Highlights25#Logging-SQL-statements - #default.logSql=true -} diff --git a/play-framework/introduction/conf/logback.xml b/play-framework/introduction/conf/logback.xml index 86ec12c0af..e8c982543f 100644 --- a/play-framework/introduction/conf/logback.xml +++ b/play-framework/introduction/conf/logback.xml @@ -27,12 +27,6 @@ - - - - - - diff --git a/play-framework/introduction/conf/routes b/play-framework/introduction/conf/routes index ab55792683..e26dc10383 100644 --- a/play-framework/introduction/conf/routes +++ b/play-framework/introduction/conf/routes @@ -2,11 +2,14 @@ # This file defines all application routes (Higher priority routes first) # ~~~~ -GET / controllers.StudentController.listStudents() -POST /:id controllers.StudentController.retrieve(id:Int) -POST / controllers.StudentController.create() -PUT / controllers.StudentController.update() -DELETE /:id controllers.StudentController.delete(id:Int) +# An example controller showing a sample home page +GET / controllers.HomeController.index +GET /baeldung/html controllers.HomeController.applyHtml +GET /baeldung/bad-req controllers.HomeController.badRequestPage +GET /baeldung/not-found controllers.HomeController.notFoundPage +GET /baeldung/custom-content-type controllers.HomeController.customContentType +GET /baeldung/async controllers.HomeController.asyncOperation +GET /baeldung/headers controllers.HomeController.setHeaders # Map static resources from the /public folder to the /assets URL path -GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/play-framework/introduction/libexec/activator-launch-1.3.10.jar b/play-framework/introduction/libexec/activator-launch-1.3.10.jar deleted file mode 100644 index 69050e7dec..0000000000 Binary files a/play-framework/introduction/libexec/activator-launch-1.3.10.jar and /dev/null differ diff --git a/play-framework/introduction/project/build.properties b/play-framework/introduction/project/build.properties index 6d9fa6badb..c0bab04941 100644 --- a/play-framework/introduction/project/build.properties +++ b/play-framework/introduction/project/build.properties @@ -1,4 +1 @@ -#Activator-generated Properties -#Wed Sep 07 12:29:40 EAT 2016 -template.uuid=c373963b-f5ad-433b-8e74-178e7ae25b1c -sbt.version=0.13.11 +sbt.version=1.2.8 diff --git a/play-framework/introduction/project/plugins.sbt b/play-framework/introduction/project/plugins.sbt index 51c5b2a35a..1c8c62a0d5 100644 --- a/play-framework/introduction/project/plugins.sbt +++ b/play-framework/introduction/project/plugins.sbt @@ -1,21 +1,7 @@ // The Play plugin -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.6") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.3") -// Web plugins -addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3") -addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7") -addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") -addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.2") - -// Play enhancer - this automatically generates getters/setters for public fields -// and rewrites accessors of these fields to use the getters/setters. Remove this -// plugin if you prefer not to have this feature, or disable on a per project -// basis using disablePlugins(PlayEnhancer) in your build.sbt -addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") - -// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using -// enablePlugins(PlayEbean). -// addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0") +// Defines scaffolding (found under .g8 folder) +// http://www.foundweekends.org/giter8/scaffolding.html +// sbt "g8Scaffold form" +addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0") diff --git a/play-framework/introduction/public/javascripts/hello.js b/play-framework/introduction/public/javascripts/hello.js deleted file mode 100644 index 02ee13c7ca..0000000000 --- a/play-framework/introduction/public/javascripts/hello.js +++ /dev/null @@ -1,3 +0,0 @@ -if (window.console) { - console.log("Welcome to your Play application's JavaScript!"); -} diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.css b/play-framework/introduction/public/javascripts/main.js similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.css rename to play-framework/introduction/public/javascripts/main.js diff --git a/play-framework/introduction/test/ApplicationLiveTest.java b/play-framework/introduction/test/ApplicationLiveTest.java deleted file mode 100644 index beeef1a602..0000000000 --- a/play-framework/introduction/test/ApplicationLiveTest.java +++ /dev/null @@ -1,172 +0,0 @@ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import model.Student; -import play.test.*; -import static play.test.Helpers.*; - -public class ApplicationLiveTest{ - private static final String BASE_URL = "http://localhost:9000"; - - @Test -public void testInServer() throws Exception { - TestServer server = testServer(3333); - running(server, () -> { - try { - WSClient ws = play.libs.ws.WS.newClient(3333); - CompletionStage completionStage = ws.url("/").get(); - WSResponse response = completionStage.toCompletableFuture().get(); - ws.close(); - assertEquals(OK, response.getStatus()); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - }); -} - @Test - public void whenCreatesRecord_thenCorrect() { - Student student = new Student("jody", "west", 50); - JSONObject obj = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))); - assertTrue(obj.getBoolean("isSuccessfull")); - JSONObject body = obj.getJSONObject("body"); - assertEquals(student.getAge(), body.getInt("age")); - assertEquals(student.getFirstName(), body.getString("firstName")); - assertEquals(student.getLastName(), body.getString("lastName")); - } - - @Test - public void whenDeletesCreatedRecord_thenCorrect() { - Student student = new Student("Usain", "Bolt", 25); - JSONObject ob1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - int id = ob1.getInt("id"); - JSONObject obj1 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertTrue(obj1.getBoolean("isSuccessfull")); - makeRequest(BASE_URL + "/" + id, "DELETE", null); - JSONObject obj2 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertFalse(obj2.getBoolean("isSuccessfull")); - } - - @Test - public void whenUpdatesCreatedRecord_thenCorrect() { - Student student = new Student("john", "doe", 50); - JSONObject body1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - assertEquals(student.getAge(), body1.getInt("age")); - int newAge = 60; - body1.put("age", newAge); - JSONObject body2 = new JSONObject(makeRequest(BASE_URL, "PUT", body1)).getJSONObject("body"); - assertFalse(student.getAge() == body2.getInt("age")); - assertTrue(newAge == body2.getInt("age")); - } - - @Test - public void whenGetsAllRecords_thenCorrect() { - Student student1 = new Student("jane", "daisy", 50); - Student student2 = new Student("john", "daniel", 60); - Student student3 = new Student("don", "mason", 55); - Student student4 = new Student("scarlet", "ohara", 90); - - makeRequest(BASE_URL, "POST", new JSONObject(student1)); - makeRequest(BASE_URL, "POST", new JSONObject(student2)); - makeRequest(BASE_URL, "POST", new JSONObject(student3)); - makeRequest(BASE_URL, "POST", new JSONObject(student4)); - - JSONObject objects = new JSONObject(makeRequest(BASE_URL, "GET", null)); - assertTrue(objects.getBoolean("isSuccessfull")); - JSONArray array = objects.getJSONArray("body"); - assertTrue(array.length() >= 4); - } - - public static String makeRequest(String myUrl, String httpMethod, JSONObject parameters) { - - URL url = null; - try { - url = new URL(myUrl); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - HttpURLConnection conn = null; - try { - - conn = (HttpURLConnection) url.openConnection(); - } catch (IOException e) { - e.printStackTrace(); - } - conn.setDoInput(true); - - conn.setReadTimeout(10000); - - conn.setRequestProperty("Content-Type", "application/json"); - DataOutputStream dos = null; - int respCode = 0; - String inputString = null; - try { - conn.setRequestMethod(httpMethod); - - if (Arrays.asList("POST", "PUT").contains(httpMethod)) { - String params = parameters.toString(); - - conn.setDoOutput(true); - - dos = new DataOutputStream(conn.getOutputStream()); - dos.writeBytes(params); - dos.flush(); - dos.close(); - } - respCode = conn.getResponseCode(); - if (respCode != 200 && respCode != 201) { - String error = inputStreamToString(conn.getErrorStream()); - return error; - } - inputString = inputStreamToString(conn.getInputStream()); - - } catch (IOException e) { - - e.printStackTrace(); - } - return inputString; - } - - public static String inputStreamToString(InputStream is) { - BufferedReader br = null; - StringBuilder sb = new StringBuilder(); - - String line; - try { - - br = new BufferedReader(new InputStreamReader(is)); - while ((line = br.readLine()) != null) { - sb.append(line); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - return sb.toString(); - - } -} diff --git a/play-framework/introduction/test/controllers/HomeControllerUnitTest.java b/play-framework/introduction/test/controllers/HomeControllerUnitTest.java new file mode 100644 index 0000000000..42a2e871f0 --- /dev/null +++ b/play-framework/introduction/test/controllers/HomeControllerUnitTest.java @@ -0,0 +1,97 @@ +package controllers; + +import org.junit.Test; +import play.Application; +import play.inject.guice.GuiceApplicationBuilder; +import play.mvc.Http; +import play.mvc.Result; +import play.test.WithApplication; + +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static play.mvc.Http.Status.*; +import static play.test.Helpers.GET; +import static play.test.Helpers.route; + +public class HomeControllerUnitTest extends WithApplication { + + @Override + protected Application provideApplication() { + return new GuiceApplicationBuilder().build(); + } + + @Test + public void givenRequest_whenRootPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } + + @Test + public void givenRequest_whenHtmlPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/html"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } + + @Test + public void givenRequest_whenBadRequest_ThenStatusBadRequest() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/bad-req"); + + Result result = route(app, request); + assertEquals(BAD_REQUEST, result.status()); + } + + @Test + public void givenRequest_whenNotFound_ThenStatusNotFound() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/not-found"); + + Result result = route(app, request); + assertEquals(NOT_FOUND, result.status()); + } + + @Test + public void givenRequest_whenCustomContentTypePath_ThenContextTypeTextHtml() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/custom-content-type"); + + Result result = route(app, request); + assertTrue(result.contentType().isPresent()); + assertEquals("text/html", result.contentType().get()); + } + + @Test + public void givenRequest_whenAsyncPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/async"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } + + @Test + public void givenRequest_whenHeadersPath_ThenCustomHeaderFieldSet() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/headers"); + + Result result = route(app, request); + final Optional headerOptional = result.header("Header-Key"); + assertTrue(headerOptional.isPresent()); + assertEquals("Some value", headerOptional.get()); + } +} diff --git a/play-framework/routing-in-play/LICENSE b/play-framework/routing-in-play/LICENSE deleted file mode 100644 index 4baedcb95f..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/README b/play-framework/routing-in-play/README deleted file mode 100644 index f21d092edf..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/Filters.java b/play-framework/routing-in-play/app/Filters.java deleted file mode 100644 index 255de8ca93..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/Module.java b/play-framework/routing-in-play/app/Module.java deleted file mode 100644 index 6e7d1766ef..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/controllers/HomeController.java b/play-framework/routing-in-play/app/controllers/HomeController.java index 6e340d594f..c7f6daa898 100644 --- a/play-framework/routing-in-play/app/controllers/HomeController.java +++ b/play-framework/routing-in-play/app/controllers/HomeController.java @@ -1,8 +1,13 @@ 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 @@ -16,18 +21,33 @@ public class HomeController extends Controller { * this method will be called when the application receives a * GET request with a path of /. */ - public Result index(String author,int id) { - return ok("Routing in Play by:"+author+" ID:"+id); - } - public Result greet(String name,int age) { - return ok("Hello "+name+", you are "+age+" years old"); - } - public Result introduceMe(String data) { - String[] clientData=data.split(","); - return ok("Your name is "+clientData[0]+", you are "+clientData[1]+" years old"); - } - public Result squareMe(Long num) { - return ok(num+" Squared is "+(num*num)); + public Result index() { + return ok(views.html.index.render()); } + public Result writer(String author) { + return ok("Routing in Play by " + author); + } + + public Result viewUser(String userId) { + final String response = String.format("Got user id {} in request.", userId); + return ok(response); + } + + public Result greet(String name, int age) { + return ok("Hello " + name + ", you are " + age + " years old"); + } + + public Result squareMe(Long num) { + return ok(num + " Squared is " + (num * num)); + } + + public Result writer(String author, int id) { + return ok("Routing in Play by: " + author + " ID: " + id); + } + + public Result introduceMe(String data) { + String[] clientData = data.split(","); + return ok("Your name is " + clientData[0] + ", you are " + clientData[1] + " years old"); + } } diff --git a/play-framework/routing-in-play/app/filters/ExampleFilter.java b/play-framework/routing-in-play/app/filters/ExampleFilter.java deleted file mode 100644 index 67a6a36cc3..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/services/ApplicationTimer.java b/play-framework/routing-in-play/app/services/ApplicationTimer.java deleted file mode 100644 index a951562b1d..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/services/AtomicCounter.java b/play-framework/routing-in-play/app/services/AtomicCounter.java deleted file mode 100644 index 41f741cbf7..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/services/Counter.java b/play-framework/routing-in-play/app/services/Counter.java deleted file mode 100644 index dadad8b09d..0000000000 --- a/play-framework/routing-in-play/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/routing-in-play/app/views/index.scala.html b/play-framework/routing-in-play/app/views/index.scala.html index 4539f5a10b..68d37fb1d4 100644 --- a/play-framework/routing-in-play/app/views/index.scala.html +++ b/play-framework/routing-in-play/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/routing-in-play/app/views/main.scala.html b/play-framework/routing-in-play/app/views/main.scala.html index 9414f4be6e..c5f755f236 100644 --- a/play-framework/routing-in-play/app/views/main.scala.html +++ b/play-framework/routing-in-play/app/views/main.scala.html @@ -13,11 +13,12 @@ @title - @* And here's where we render the `Html` object containing * the page content. *@ @content + + diff --git a/play-framework/routing-in-play/bin/activator b/play-framework/routing-in-play/bin/activator deleted file mode 100644 index a8b11d482f..0000000000 --- a/play-framework/routing-in-play/bin/activator +++ /dev/null @@ -1,397 +0,0 @@ -#!/usr/bin/env bash - -### ------------------------------- ### -### Helper methods for BASH scripts ### -### ------------------------------- ### - -realpath () { -( - TARGET_FILE="$1" - FIX_CYGPATH="$2" - - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE=$(basename "$TARGET_FILE") - - COUNT=0 - while [ -L "$TARGET_FILE" -a $COUNT -lt 100 ] - do - TARGET_FILE=$(readlink "$TARGET_FILE") - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE=$(basename "$TARGET_FILE") - COUNT=$(($COUNT + 1)) - done - - # make sure we grab the actual windows path, instead of cygwin's path. - if [[ "x$FIX_CYGPATH" != "x" ]]; then - echo "$(cygwinpath "$(pwd -P)/$TARGET_FILE")" - else - echo "$(pwd -P)/$TARGET_FILE" - fi -) -} - - -# Uses uname to detect if we're in the odd cygwin environment. -is_cygwin() { - local os=$(uname -s) - case "$os" in - CYGWIN*) return 0 ;; - *) return 1 ;; - esac -} - -# TODO - Use nicer bash-isms here. -CYGWIN_FLAG=$(if is_cygwin; then echo true; else echo false; fi) - - -# This can fix cygwin style /cygdrive paths so we get the -# windows style paths. -cygwinpath() { - local file="$1" - if [[ "$CYGWIN_FLAG" == "true" ]]; then - echo $(cygpath -w $file) - else - echo $file - fi -} - -# Make something URI friendly -make_url() { - url="$1" - local nospaces=${url// /%20} - if is_cygwin; then - echo "/${nospaces//\\//}" - else - echo "$nospaces" - fi -} - -declare -a residual_args -declare -a java_args -declare -a scalac_args -declare -a sbt_commands -declare java_cmd=java -declare java_version -declare -r real_script_path="$(realpath "$0")" -declare -r sbt_home="$(realpath "$(dirname "$(dirname "$real_script_path")")")" -declare -r sbt_bin_dir="$(dirname "$real_script_path")" -declare -r app_version="1.3.10" - -declare -r script_name=activator -declare -r java_opts=( "${ACTIVATOR_OPTS[@]}" "${SBT_OPTS[@]}" "${JAVA_OPTS[@]}" "${java_opts[@]}" ) -userhome="$HOME" -if is_cygwin; then - # cygwin sets home to something f-d up, set to real windows homedir - userhome="$USERPROFILE" -fi -declare -r activator_user_home_dir="${userhome}/.activator" -declare -r java_opts_config_home="${activator_user_home_dir}/activatorconfig.txt" -declare -r java_opts_config_version="${activator_user_home_dir}/${app_version}/activatorconfig.txt" - -echoerr () { - echo 1>&2 "$@" -} -vlog () { - [[ $verbose || $debug ]] && echoerr "$@" -} -dlog () { - [[ $debug ]] && echoerr "$@" -} - -jar_file () { - echo "$(cygwinpath "${sbt_home}/libexec/activator-launch-${app_version}.jar")" -} - -acquire_sbt_jar () { - sbt_jar="$(jar_file)" - - if [[ ! -f "$sbt_jar" ]]; then - echoerr "Could not find launcher jar: $sbt_jar" - exit 2 - fi -} - -execRunner () { - # print the arguments one to a line, quoting any containing spaces - [[ $verbose || $debug ]] && echo "# Executing command line:" && { - for arg; do - if printf "%s\n" "$arg" | grep -q ' '; then - printf "\"%s\"\n" "$arg" - else - printf "%s\n" "$arg" - fi - done - echo "" - } - - # THis used to be exec, but we loose the ability to re-hook stty then - # for cygwin... Maybe we should flag the feature here... - "$@" -} - -addJava () { - dlog "[addJava] arg = '$1'" - java_args=( "${java_args[@]}" "$1" ) -} -addSbt () { - dlog "[addSbt] arg = '$1'" - sbt_commands=( "${sbt_commands[@]}" "$1" ) -} -addResidual () { - dlog "[residual] arg = '$1'" - residual_args=( "${residual_args[@]}" "$1" ) -} -addDebugger () { - addJava "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$1" -} - -get_mem_opts () { - # if we detect any of these settings in ${JAVA_OPTS} we need to NOT output our settings. - # The reason is the Xms/Xmx, if they don't line up, cause errors. - if [[ "${JAVA_OPTS}" == *-Xmx* ]] || [[ "${JAVA_OPTS}" == *-Xms* ]] || [[ "${JAVA_OPTS}" == *-XX:MaxPermSize* ]] || [[ "${JAVA_OPTS}" == *-XX:MaxMetaspaceSize* ]] || [[ "${JAVA_OPTS}" == *-XX:ReservedCodeCacheSize* ]]; then - echo "" - else - # a ham-fisted attempt to move some memory settings in concert - # so they need not be messed around with individually. - local mem=${1:-1024} - local codecache=$(( $mem / 8 )) - (( $codecache > 128 )) || codecache=128 - (( $codecache < 512 )) || codecache=512 - local class_metadata_size=$(( $codecache * 2 )) - local class_metadata_opt=$([[ "$java_version" < "1.8" ]] && echo "MaxPermSize" || echo "MaxMetaspaceSize") - - echo "-Xms${mem}m -Xmx${mem}m -XX:ReservedCodeCacheSize=${codecache}m -XX:${class_metadata_opt}=${class_metadata_size}m" - fi -} - -require_arg () { - local type="$1" - local opt="$2" - local arg="$3" - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - echo "$opt requires <$type> argument" - exit 1 - fi -} - -is_function_defined() { - declare -f "$1" > /dev/null -} - -# If we're *not* running in a terminal, and we don't have any arguments, then we need to add the 'ui' parameter -detect_terminal_for_ui() { - [[ ! -t 0 ]] && [[ "${#residual_args}" == "0" ]] && { - addResidual "ui" - } - # SPECIAL TEST FOR MAC - [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]] && [[ "${#residual_args}" == "0" ]] && { - echo "Detected MAC OSX launched script...." - echo "Swapping to UI" - addResidual "ui" - } -} - -process_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -h|-help) usage; exit 1 ;; - -v|-verbose) verbose=1 && shift ;; - -d|-debug) debug=1 && shift ;; - - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; - -batch) exec &1 | awk -F '"' '/version/ {print $2}') - vlog "[process_args] java_version = '$java_version'" -} - -# Detect that we have java installed. -checkJava() { - local required_version="$1" - # Now check to see if it's a good enough version - if [[ "$java_version" == "" ]]; then - echo - echo No java installations was detected. - echo Please go to http://www.java.com/getjava/ and download - echo - exit 1 - elif [[ ! "$java_version" > "$required_version" ]]; then - echo - echo The java installation you have is not up to date - echo $script_name requires at least version $required_version+, you have - echo version $java_version - echo - echo Please go to http://www.java.com/getjava/ and download - echo a valid Java Runtime and install before running $script_name. - echo - exit 1 - fi -} - - -run() { - # no jar? download it. - [[ -f "$sbt_jar" ]] || acquire_sbt_jar "$sbt_version" || { - # still no jar? uh-oh. - echo "Download failed. Obtain the sbt-launch.jar manually and place it at $sbt_jar" - exit 1 - } - - # process the combined args, then reset "$@" to the residuals - process_args "$@" - detect_terminal_for_ui - set -- "${residual_args[@]}" - argumentCount=$# - - # TODO - java check should be configurable... - checkJava "1.6" - - #If we're in cygwin, we should use the windows config, and terminal hacks - if [[ "$CYGWIN_FLAG" == "true" ]]; then - stty -icanon min 1 -echo > /dev/null 2>&1 - addJava "-Djline.terminal=jline.UnixTerminal" - addJava "-Dsbt.cygwin=true" - fi - - # run sbt - execRunner "$java_cmd" \ - "-Dactivator.home=$(make_url "$sbt_home")" \ - ${SBT_OPTS:-$default_sbt_opts} \ - $(get_mem_opts $sbt_mem) \ - ${JAVA_OPTS} \ - ${java_args[@]} \ - -jar "$sbt_jar" \ - "${sbt_commands[@]}" \ - "${residual_args[@]}" - - exit_code=$? - - # Clean up the terminal from cygwin hacks. - if [[ "$CYGWIN_FLAG" == "true" ]]; then - stty icanon echo > /dev/null 2>&1 - fi - exit $exit_code -} - - -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" -declare -r sbt_opts_file=".sbtopts" -declare -r etc_sbt_opts_file="${sbt_home}/conf/sbtopts" -declare -r win_sbt_opts_file="${sbt_home}/conf/sbtconfig.txt" - -usage() { - cat < path to global settings/plugins directory (default: ~/.sbt) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11 series) - -ivy path to local Ivy repository (default: ~/.ivy2) - -mem set memory options (default: $sbt_mem, which is $(get_mem_opts $sbt_mem)) - -no-share use all local caches; no sharing - -no-global uses global caches, but does not use global ~/.sbt directory. - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - - # sbt version (default: from project/build.properties if present, else latest release) - -sbt-version use the specified version of sbt - -sbt-jar use the specified jar as the sbt launcher - -sbt-rc use an RC version of sbt - -sbt-snapshot use a snapshot version of sbt - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # jvm options and output control - JAVA_OPTS environment variable, if unset uses "$java_opts" - SBT_OPTS environment variable, if unset uses "$default_sbt_opts" - ACTIVATOR_OPTS Environment variable, if unset uses "" - .sbtopts if this file exists in the current directory, it is - prepended to the runner args - /etc/sbt/sbtopts if this file exists, it is prepended to the runner args - -Dkey=val pass -Dkey=val directly to the java runtime - -J-X pass option -X directly to the java runtime - (-J is stripped) - -S-X add -X to sbt's scalacOptions (-S is stripped) - -In the case of duplicated or conflicting options, the order above -shows precedence: JAVA_OPTS lowest, command line options highest. -EOM -} - - - -process_my_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; - -no-share) addJava "$noshare_opts" && shift ;; - -no-global) addJava "-Dsbt.global.base=$(pwd)/project/.sbtboot" && shift ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -sbt-dir) require_arg path "$1" "$2" && addJava "-Dsbt.global.base=$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -batch) exec ^&1') do ( - if %%~j==java set JAVAINSTALLED=1 - if %%~j==openjdk set JAVAINSTALLED=1 -) - -rem Detect the same thing about javac -if "%_JAVACCMD%"=="" ( - if not "%JAVA_HOME%"=="" ( - if exist "%JAVA_HOME%\bin\javac.exe" set "_JAVACCMD=%JAVA_HOME%\bin\javac.exe" - ) -) -if "%_JAVACCMD%"=="" set _JAVACCMD=javac -for /F %%j in ('"%_JAVACCMD%" -version 2^>^&1') do ( - if %%~j==javac set JAVACINSTALLED=1 -) - -rem BAT has no logical or, so we do it OLD SCHOOL! Oppan Redmond Style -set JAVAOK=true -if not defined JAVAINSTALLED set JAVAOK=false -if not defined JAVACINSTALLED set JAVAOK=false - -if "%JAVAOK%"=="false" ( - echo. - echo A Java JDK is not installed or can't be found. - if not "%JAVA_HOME%"=="" ( - echo JAVA_HOME = "%JAVA_HOME%" - ) - echo. - echo Please go to - echo http://www.oracle.com/technetwork/java/javase/downloads/index.html - echo and download a valid Java JDK and install before running Activator. - echo. - echo If you think this message is in error, please check - echo your environment variables to see if "java.exe" and "javac.exe" are - echo available via JAVA_HOME or PATH. - echo. - if defined DOUBLECLICKED pause - exit /B 1 -) - -rem Check what Java version is being used to determine what memory options to use -for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do ( - set JAVA_VERSION=%%g -) - -rem Strips away the " characters -set JAVA_VERSION=%JAVA_VERSION:"=% - -rem TODO Check if there are existing mem settings in JAVA_OPTS/CFG_OPTS and use those instead of the below -for /f "delims=. tokens=1-3" %%v in ("%JAVA_VERSION%") do ( - set MAJOR=%%v - set MINOR=%%w - set BUILD=%%x - - set META_SIZE=-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=256M - if "!MINOR!" LSS "8" ( - set META_SIZE=-XX:PermSize=64M -XX:MaxPermSize=256M - ) - - set MEM_OPTS=!META_SIZE! - ) - -rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. -set _JAVA_OPTS=%JAVA_OPTS% -if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS% - -set DEBUG_OPTS= - -rem Loop through the arguments, building remaining args in args variable -set args= -:argsloop -if not "%~1"=="" ( - rem Checks if the argument contains "-D" and if true, adds argument 1 with 2 and puts an equal sign between them. - rem This is done since batch considers "=" to be a delimiter so we need to circumvent this behavior with a small hack. - set arg1=%~1 - if "!arg1:~0,2!"=="-D" ( - set "args=%args% "%~1"="%~2"" - shift - shift - goto argsloop - ) - - if "%~1"=="-jvm-debug" ( - if not "%~2"=="" ( - rem This piece of magic somehow checks that an argument is a number - for /F "delims=0123456789" %%i in ("%~2") do ( - set var="%%i" - ) - if defined var ( - rem Not a number, assume no argument given and default to 9999 - set JPDA_PORT=9999 - ) else ( - rem Port was given, shift arguments - set JPDA_PORT=%~2 - shift - ) - ) else ( - set JPDA_PORT=9999 - ) - shift - - set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=!JPDA_PORT! - goto argsloop - ) - rem else - set "args=%args% "%~1"" - shift - goto argsloop -) - -:run - -if "!args!"=="" ( - if defined DOUBLECLICKED ( - set CMDS="ui" - ) else set CMDS=!args! -) else set CMDS=!args! - -rem We add a / in front, so we get file:///C: instead of file://C: -rem Java considers the later a UNC path. -rem We also attempt a solid effort at making it URI friendly. -rem We don't even bother with UNC paths. -set JAVA_FRIENDLY_HOME_1=/!ACTIVATOR_HOME:\=/! -set JAVA_FRIENDLY_HOME=/!JAVA_FRIENDLY_HOME_1: =%%20! - -rem Checks if the command contains spaces to know if it should be wrapped in quotes or not -set NON_SPACED_CMD=%_JAVACMD: =% -if "%_JAVACMD%"=="%NON_SPACED_CMD%" %_JAVACMD% %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\libexec\%ACTIVATOR_LAUNCH_JAR%" %CMDS% -if NOT "%_JAVACMD%"=="%NON_SPACED_CMD%" "%_JAVACMD%" %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\libexec\%ACTIVATOR_LAUNCH_JAR%" %CMDS% - -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end - -@endlocal - -exit /B %ERROR_CODE% diff --git a/play-framework/routing-in-play/build.sbt b/play-framework/routing-in-play/build.sbt index 083d071676..4fb0126eaa 100644 --- a/play-framework/routing-in-play/build.sbt +++ b/play-framework/routing-in-play/build.sbt @@ -1,13 +1,10 @@ -name := """webapp""" +name := """play-routing""" +organization := "com.baeldung" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayJava) -scalaVersion := "2.11.7" +scalaVersion := "2.13.0" -libraryDependencies ++= Seq( - javaJdbc, - cache, - javaWs -) +libraryDependencies += guice diff --git a/play-framework/routing-in-play/conf/application.conf b/play-framework/routing-in-play/conf/application.conf index 489d3f9b3e..85c184dcb1 100644 --- a/play-framework/routing-in-play/conf/application.conf +++ b/play-framework/routing-in-play/conf/application.conf @@ -1,353 +1,2 @@ # This is the main configuration file for the application. # https://www.playframework.com/documentation/latest/ConfigFile -# ~~~~~ -# Play uses HOCON as its configuration file format. HOCON has a number -# of advantages over other config formats, but there are two things that -# can be used when modifying settings. -# -# You can include other configuration files in this main application.conf file: -#include "extra-config.conf" -# -# You can declare variables and substitute for them: -#mykey = ${some.value} -# -# And if an environment variable exists when there is no other subsitution, then -# HOCON will fall back to substituting environment variable: -#mykey = ${JAVA_HOME} - -## Akka -# https://www.playframework.com/documentation/latest/ScalaAkka#Configuration -# https://www.playframework.com/documentation/latest/JavaAkka#Configuration -# ~~~~~ -# Play uses Akka internally and exposes Akka Streams and actors in Websockets and -# other streaming HTTP responses. -akka { - # "akka.log-config-on-start" is extraordinarly useful because it log the complete - # configuration at INFO level, including defaults and overrides, so it s worth - # putting at the very top. - # - # Put the following in your conf/logback.xml file: - # - # - # - # And then uncomment this line to debug the configuration. - # - #log-config-on-start = true -} - -## Secret key -# http://www.playframework.com/documentation/latest/ApplicationSecret -# ~~~~~ -# The secret key is used to sign Play's session cookie. -# This must be changed for production, but we don't recommend you change it in this file. -play.crypto.secret = "changeme" - -## Modules -# https://www.playframework.com/documentation/latest/Modules -# ~~~~~ -# Control which modules are loaded when Play starts. Note that modules are -# the replacement for "GlobalSettings", which are deprecated in 2.5.x. -# Please see https://www.playframework.com/documentation/latest/GlobalSettings -# for more information. -# -# You can also extend Play functionality by using one of the publically available -# Play modules: https://playframework.com/documentation/latest/ModuleDirectory -play.modules { - # By default, Play will load any class called Module that is defined - # in the root package (the "app" directory), or you can define them - # explicitly below. - # If there are any built-in modules that you want to disable, you can list them here. - #enabled += my.application.Module - - # If there are any built-in modules that you want to disable, you can list them here. - #disabled += "" -} - -## IDE -# https://www.playframework.com/documentation/latest/IDE -# ~~~~~ -# Depending on your IDE, you can add a hyperlink for errors that will jump you -# directly to the code location in the IDE in dev mode. The following line makes -# use of the IntelliJ IDEA REST interface: -#play.editor="http://localhost:63342/api/file/?file=%s&line=%s" - -## Internationalisation -# https://www.playframework.com/documentation/latest/JavaI18N -# https://www.playframework.com/documentation/latest/ScalaI18N -# ~~~~~ -# Play comes with its own i18n settings, which allow the user's preferred language -# to map through to internal messages, or allow the language to be stored in a cookie. -play.i18n { - # The application languages - langs = [ "en" ] - - # Whether the language cookie should be secure or not - #langCookieSecure = true - - # Whether the HTTP only attribute of the cookie should be set to true - #langCookieHttpOnly = true -} - -## Play HTTP settings -# ~~~~~ -play.http { - ## Router - # https://www.playframework.com/documentation/latest/JavaRouting - # https://www.playframework.com/documentation/latest/ScalaRouting - # ~~~~~ - # Define the Router object to use for this application. - # This router will be looked up first when the application is starting up, - # so make sure this is the entry point. - # Furthermore, it's assumed your route file is named properly. - # So for an application router like `my.application.Router`, - # you may need to define a router file `conf/my.application.routes`. - # Default to Routes in the root package (aka "apps" folder) (and conf/routes) - #router = my.application.Router - - ## Action Creator - # https://www.playframework.com/documentation/latest/JavaActionCreator - # ~~~~~ - #actionCreator = null - - ## ErrorHandler - # https://www.playframework.com/documentation/latest/JavaRouting - # https://www.playframework.com/documentation/latest/ScalaRouting - # ~~~~~ - # If null, will attempt to load a class called ErrorHandler in the root package, - #errorHandler = null - - ## Filters - # https://www.playframework.com/documentation/latest/ScalaHttpFilters - # https://www.playframework.com/documentation/latest/JavaHttpFilters - # ~~~~~ - # Filters run code on every request. They can be used to perform - # common logic for all your actions, e.g. adding common headers. - # Defaults to "Filters" in the root package (aka "apps" folder) - # Alternatively you can explicitly register a class here. - #filters = my.application.Filters - - ## Session & Flash - # https://www.playframework.com/documentation/latest/JavaSessionFlash - # https://www.playframework.com/documentation/latest/ScalaSessionFlash - # ~~~~~ - session { - # Sets the cookie to be sent only over HTTPS. - #secure = true - - # Sets the cookie to be accessed only by the server. - #httpOnly = true - - # Sets the max-age field of the cookie to 5 minutes. - # NOTE: this only sets when the browser will discard the cookie. Play will consider any - # cookie value with a valid signature to be a valid session forever. To implement a server side session timeout, - # you need to put a timestamp in the session and check it at regular intervals to possibly expire it. - #maxAge = 300 - - # Sets the domain on the session cookie. - #domain = "example.com" - } - - flash { - # Sets the cookie to be sent only over HTTPS. - #secure = true - - # Sets the cookie to be accessed only by the server. - #httpOnly = true - } -} - -## Netty Provider -# https://www.playframework.com/documentation/latest/SettingsNetty -# ~~~~~ -play.server.netty { - # Whether the Netty wire should be logged - #log.wire = true - - # If you run Play on Linux, you can use Netty's native socket transport - # for higher performance with less garbage. - #transport = "native" -} - -## WS (HTTP Client) -# https://www.playframework.com/documentation/latest/ScalaWS#Configuring-WS -# ~~~~~ -# The HTTP client primarily used for REST APIs. The default client can be -# configured directly, but you can also create different client instances -# with customized settings. You must enable this by adding to build.sbt: -# -# libraryDependencies += ws // or javaWs if using java -# -play.ws { - # Sets HTTP requests not to follow 302 requests - #followRedirects = false - - # Sets the maximum number of open HTTP connections for the client. - #ahc.maxConnectionsTotal = 50 - - ## WS SSL - # https://www.playframework.com/documentation/latest/WsSSL - # ~~~~~ - ssl { - # Configuring HTTPS with Play WS does not require programming. You can - # set up both trustManager and keyManager for mutual authentication, and - # turn on JSSE debugging in development with a reload. - #debug.handshake = true - #trustManager = { - # stores = [ - # { type = "JKS", path = "exampletrust.jks" } - # ] - #} - } -} - -## Cache -# https://www.playframework.com/documentation/latest/JavaCache -# https://www.playframework.com/documentation/latest/ScalaCache -# ~~~~~ -# Play comes with an integrated cache API that can reduce the operational -# overhead of repeated requests. You must enable this by adding to build.sbt: -# -# libraryDependencies += cache -# -play.cache { - # If you want to bind several caches, you can bind the individually - #bindCaches = ["db-cache", "user-cache", "session-cache"] -} - -## Filters -# https://www.playframework.com/documentation/latest/Filters -# ~~~~~ -# There are a number of built-in filters that can be enabled and configured -# to give Play greater security. You must enable this by adding to build.sbt: -# -# libraryDependencies += filters -# -play.filters { - ## CORS filter configuration - # https://www.playframework.com/documentation/latest/CorsFilter - # ~~~~~ - # CORS is a protocol that allows web applications to make requests from the browser - # across different domains. - # NOTE: You MUST apply the CORS configuration before the CSRF filter, as CSRF has - # dependencies on CORS settings. - cors { - # Filter paths by a whitelist of path prefixes - #pathPrefixes = ["/some/path", ...] - - # The allowed origins. If null, all origins are allowed. - #allowedOrigins = ["http://www.example.com"] - - # The allowed HTTP methods. If null, all methods are allowed - #allowedHttpMethods = ["GET", "POST"] - } - - ## CSRF Filter - # https://www.playframework.com/documentation/latest/ScalaCsrf#Applying-a-global-CSRF-filter - # https://www.playframework.com/documentation/latest/JavaCsrf#Applying-a-global-CSRF-filter - # ~~~~~ - # Play supports multiple methods for verifying that a request is not a CSRF request. - # The primary mechanism is a CSRF token. This token gets placed either in the query string - # or body of every form submitted, and also gets placed in the users session. - # Play then verifies that both tokens are present and match. - csrf { - # Sets the cookie to be sent only over HTTPS - #cookie.secure = true - - # Defaults to CSRFErrorHandler in the root package. - #errorHandler = MyCSRFErrorHandler - } - - ## Security headers filter configuration - # https://www.playframework.com/documentation/latest/SecurityHeaders - # ~~~~~ - # Defines security headers that prevent XSS attacks. - # If enabled, then all options are set to the below configuration by default: - headers { - # The X-Frame-Options header. If null, the header is not set. - #frameOptions = "DENY" - - # The X-XSS-Protection header. If null, the header is not set. - #xssProtection = "1; mode=block" - - # The X-Content-Type-Options header. If null, the header is not set. - #contentTypeOptions = "nosniff" - - # The X-Permitted-Cross-Domain-Policies header. If null, the header is not set. - #permittedCrossDomainPolicies = "master-only" - - # The Content-Security-Policy header. If null, the header is not set. - #contentSecurityPolicy = "default-src 'self'" - } - - ## Allowed hosts filter configuration - # https://www.playframework.com/documentation/latest/AllowedHostsFilter - # ~~~~~ - # Play provides a filter that lets you configure which hosts can access your application. - # This is useful to prevent cache poisoning attacks. - hosts { - # Allow requests to example.com, its subdomains, and localhost:9000. - #allowed = [".example.com", "localhost:9000"] - } -} - -## Evolutions -# https://www.playframework.com/documentation/latest/Evolutions -# ~~~~~ -# Evolutions allows database scripts to be automatically run on startup in dev mode -# for database migrations. You must enable this by adding to build.sbt: -# -# libraryDependencies += evolutions -# -play.evolutions { - # You can disable evolutions for a specific datasource if necessary - #db.default.enabled = false -} - -## Database Connection Pool -# https://www.playframework.com/documentation/latest/SettingsJDBC -# ~~~~~ -# Play doesn't require a JDBC database to run, but you can easily enable one. -# -# libraryDependencies += jdbc -# -play.db { - # The combination of these two settings results in "db.default" as the - # default JDBC pool: - #config = "db" - #default = "default" - - # Play uses HikariCP as the default connection pool. You can override - # settings by changing the prototype: - prototype { - # Sets a fixed JDBC connection pool size of 50 - #hikaricp.minimumIdle = 50 - #hikaricp.maximumPoolSize = 50 - } -} - -## JDBC Datasource -# https://www.playframework.com/documentation/latest/JavaDatabase -# https://www.playframework.com/documentation/latest/ScalaDatabase -# ~~~~~ -# Once JDBC datasource is set up, you can work with several different -# database options: -# -# Slick (Scala preferred option): https://www.playframework.com/documentation/latest/PlaySlick -# JPA (Java preferred option): https://playframework.com/documentation/latest/JavaJPA -# EBean: https://playframework.com/documentation/latest/JavaEbean -# Anorm: https://www.playframework.com/documentation/latest/ScalaAnorm -# -db { - # You can declare as many datasources as you want. - # By convention, the default datasource is named `default` - - # https://www.playframework.com/documentation/latest/Developing-with-the-H2-Database - #default.driver = org.h2.Driver - #default.url = "jdbc:h2:mem:play" - #default.username = sa - #default.password = "" - - # You can turn on SQL logging for any datasource - # https://www.playframework.com/documentation/latest/Highlights25#Logging-SQL-statements - #default.logSql=true -} diff --git a/play-framework/routing-in-play/conf/logback.xml b/play-framework/routing-in-play/conf/logback.xml index 86ec12c0af..e8c982543f 100644 --- a/play-framework/routing-in-play/conf/logback.xml +++ b/play-framework/routing-in-play/conf/logback.xml @@ -27,12 +27,6 @@ - - - - - - diff --git a/play-framework/routing-in-play/conf/routes b/play-framework/routing-in-play/conf/routes index f72d8a1a14..43dc4c8733 100644 --- a/play-framework/routing-in-play/conf/routes +++ b/play-framework/routing-in-play/conf/routes @@ -1,7 +1,15 @@ -GET / controllers.HomeController.index(author="Baeldung",id:Int?=1) -GET /:author controllers.HomeController.index(author,id:Int?=1) -GET /greet/:name/:age controllers.HomeController.greet(name,age:Integer) -GET /square/$num<[0-9]+> controllers.HomeController.squareMe(num:Long) +# Routes +# This file defines all application routes (Higher priority routes first) +# ~~~~ + +# An example controller showing a sample home page +GET / controllers.HomeController.index +GET /writer controllers.HomeController.writer(author = "Baeldung", id: Int ?= 1) +GET /writer/:author controllers.HomeController.writer(author: String, id: Int ?= 1) +GET /baeldung/:id controllers.HomeController.viewUser(id: String) +GET /greet/:name/:age controllers.HomeController.greet(name: String, age: Integer) +GET /square/$num<[0-9]+> controllers.HomeController.squareMe(num: Long) +GET /*data controllers.HomeController.introduceMe(data) + # Map static resources from the /public folder to the /assets URL path -GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) -GET /*data controllers.HomeController.introduceMe(data) +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/play-framework/routing-in-play/libexec/activator-launch-1.3.10.jar b/play-framework/routing-in-play/libexec/activator-launch-1.3.10.jar deleted file mode 100644 index 69050e7dec..0000000000 Binary files a/play-framework/routing-in-play/libexec/activator-launch-1.3.10.jar and /dev/null differ diff --git a/play-framework/routing-in-play/project/build.properties b/play-framework/routing-in-play/project/build.properties index 6d22e3f2d1..c0bab04941 100644 --- a/play-framework/routing-in-play/project/build.properties +++ b/play-framework/routing-in-play/project/build.properties @@ -1,4 +1 @@ -#Activator-generated Properties -#Fri Sep 30 14:25:10 EAT 2016 -template.uuid=26c759a5-daf0-4e02-bcfa-ac69725267c0 -sbt.version=0.13.11 +sbt.version=1.2.8 diff --git a/play-framework/routing-in-play/project/plugins.sbt b/play-framework/routing-in-play/project/plugins.sbt index e8e7f602f7..1c8c62a0d5 100644 --- a/play-framework/routing-in-play/project/plugins.sbt +++ b/play-framework/routing-in-play/project/plugins.sbt @@ -1,21 +1,7 @@ // The Play plugin -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.8") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.3") -// Web plugins -addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4") -addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8") -addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1") -addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") -addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6") - -// Play enhancer - this automatically generates getters/setters for public fields -// and rewrites accessors of these fields to use the getters/setters. Remove this -// plugin if you prefer not to have this feature, or disable on a per project -// basis using disablePlugins(PlayEnhancer) in your build.sbt -addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") - -// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using -// enablePlugins(PlayEbean). -// addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2") +// Defines scaffolding (found under .g8 folder) +// http://www.foundweekends.org/giter8/scaffolding.html +// sbt "g8Scaffold form" +addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0") diff --git a/play-framework/routing-in-play/public/javascripts/hello.js b/play-framework/routing-in-play/public/javascripts/hello.js deleted file mode 100644 index 02ee13c7ca..0000000000 --- a/play-framework/routing-in-play/public/javascripts/hello.js +++ /dev/null @@ -1,3 +0,0 @@ -if (window.console) { - console.log("Welcome to your Play application's JavaScript!"); -} diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.css b/play-framework/routing-in-play/public/javascripts/main.js similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.css rename to play-framework/routing-in-play/public/javascripts/main.js diff --git a/play-framework/routing-in-play/test/ApplicationUnitTest.java b/play-framework/routing-in-play/test/ApplicationUnitTest.java deleted file mode 100644 index 572ce282bc..0000000000 --- a/play-framework/routing-in-play/test/ApplicationUnitTest.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.databind.JsonNode; -import org.junit.*; - -import play.mvc.*; -import play.test.*; -import play.data.DynamicForm; -import play.data.validation.ValidationError; -import play.data.validation.Constraints.RequiredValidator; -import play.i18n.Lang; -import play.libs.F; -import play.libs.F.*; -import play.twirl.api.Content; - -import static play.test.Helpers.*; -import static org.junit.Assert.*; - - -/** - * - * Simple (JUnit) tests that can call all parts of a play app. - * If you are interested in mocking a whole application, see the wiki for more details. - * - */ -public class ApplicationUnitTest { - - @Test - public void simpleCheck() { - int a = 1 + 1; - assertEquals(2, a); - } - - @Test - public void renderTemplate() { - Content html = views.html.index.render("Your new application is ready."); - assertEquals("text/html", html.contentType()); - assertTrue(html.body().contains("Your new application is ready.")); - } - - -} diff --git a/play-framework/routing-in-play/test/IntegrationTest.java b/play-framework/routing-in-play/test/IntegrationTest.java deleted file mode 100644 index c53c71e124..0000000000 --- a/play-framework/routing-in-play/test/IntegrationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -import org.junit.*; - -import play.mvc.*; -import play.test.*; - -import static play.test.Helpers.*; -import static org.junit.Assert.*; - -import static org.fluentlenium.core.filter.FilterConstructor.*; - -public class IntegrationTest { - - /** - * add your integration test here - * in this example we just check if the welcome page is being shown - */ - @Test - public void test() { - running(testServer(3333, fakeApplication(inMemoryDatabase())), HTMLUNIT, browser -> { - browser.goTo("http://localhost:3333"); - assertTrue(browser.pageSource().contains("Your new application is ready.")); - }); - } - -} diff --git a/play-framework/routing-in-play/test/controllers/HomeControllerUnitTest.java b/play-framework/routing-in-play/test/controllers/HomeControllerUnitTest.java new file mode 100644 index 0000000000..b911242ac7 --- /dev/null +++ b/play-framework/routing-in-play/test/controllers/HomeControllerUnitTest.java @@ -0,0 +1,36 @@ +package controllers; + +import org.junit.Test; +import play.Application; +import play.inject.guice.GuiceApplicationBuilder; +import play.mvc.Http; +import play.mvc.Result; +import play.test.WithApplication; +import play.twirl.api.Html; + +import java.util.Optional; +import java.util.concurrent.CompletionStage; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static play.mvc.Http.Status.*; +import static play.test.Helpers.GET; +import static play.test.Helpers.route; + +public class HomeControllerUnitTest extends WithApplication { + + @Override + protected Application provideApplication() { + return new GuiceApplicationBuilder().build(); + } + + @Test + public void givenRequest_whenRootPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } +} diff --git a/play-framework/routing-in-play/.gitignore b/play-framework/student-api/.gitignore similarity index 94% rename from play-framework/routing-in-play/.gitignore rename to play-framework/student-api/.gitignore index eb372fc719..e497f3fc67 100644 --- a/play-framework/routing-in-play/.gitignore +++ b/play-framework/student-api/.gitignore @@ -1,6 +1,7 @@ logs target /.idea +/.g8 /.idea_modules /.classpath /.project diff --git a/play-framework/student-api/app/controllers/StudentController.java b/play-framework/student-api/app/controllers/StudentController.java new file mode 100644 index 0000000000..5373511560 --- /dev/null +++ b/play-framework/student-api/app/controllers/StudentController.java @@ -0,0 +1,91 @@ +package controllers; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import model.Student; +import play.libs.Json; +import play.libs.concurrent.HttpExecutionContext; +import play.mvc.Controller; +import play.mvc.Http; +import play.mvc.Result; +import store.StudentStore; +import utils.Util; + +import javax.inject.Inject; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletionStage; + +import static java.util.concurrent.CompletableFuture.supplyAsync; + +public class StudentController extends Controller { + private HttpExecutionContext ec; + private StudentStore studentStore; + + @Inject + public StudentController(HttpExecutionContext ec, StudentStore studentStore) { + this.studentStore = studentStore; + this.ec = ec; + } + + public CompletionStage create(Http.Request request) { + JsonNode json = request.body().asJson(); + return supplyAsync(() -> { + if (json == null) { + return badRequest(Util.createResponse("Expecting Json data", false)); + } + + Optional studentOptional = studentStore.addStudent(Json.fromJson(json, Student.class)); + return studentOptional.map(student -> { + JsonNode jsonObject = Json.toJson(student); + return created(Util.createResponse(jsonObject, true)); + }).orElse(internalServerError(Util.createResponse("Could not create data.", false))); + }, ec.current()); + } + + public CompletionStage listStudents() { + return supplyAsync(() -> { + Set result = studentStore.getAllStudents(); + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonData = mapper.convertValue(result, JsonNode.class); + return ok(Util.createResponse(jsonData, true)); + }, ec.current()); + } + + public CompletionStage retrieve(int id) { + return supplyAsync(() -> { + final Optional studentOptional = studentStore.getStudent(id); + return studentOptional.map(student -> { + JsonNode jsonObjects = Json.toJson(student); + return ok(Util.createResponse(jsonObjects, true)); + }).orElse(notFound(Util.createResponse("Student with id:" + id + " not found", false))); + }, ec.current()); + } + + public CompletionStage update(Http.Request request) { + JsonNode json = request.body().asJson(); + return supplyAsync(() -> { + if (json == null) { + return badRequest(Util.createResponse("Expecting Json data", false)); + } + Optional studentOptional = studentStore.updateStudent(Json.fromJson(json, Student.class)); + return studentOptional.map(student -> { + if (student == null) { + return notFound(Util.createResponse("Student not found", false)); + } + JsonNode jsonObject = Json.toJson(student); + return ok(Util.createResponse(jsonObject, true)); + }).orElse(internalServerError(Util.createResponse("Could not create data.", false))); + }, ec.current()); + } + + public CompletionStage delete(int id) { + return supplyAsync(() -> { + boolean status = studentStore.deleteStudent(id); + if (!status) { + return notFound(Util.createResponse("Student with id:" + id + " not found", false)); + } + return ok(Util.createResponse("Student with id:" + id + " deleted", true)); + }, ec.current()); + } +} diff --git a/play-framework/introduction/app/models/Student.java b/play-framework/student-api/app/model/Student.java similarity index 84% rename from play-framework/introduction/app/models/Student.java rename to play-framework/student-api/app/model/Student.java index dc539767bd..39cbfe0040 100644 --- a/play-framework/introduction/app/models/Student.java +++ b/play-framework/student-api/app/model/Student.java @@ -1,15 +1,19 @@ -package models; +package model; + public class Student { private String firstName; private String lastName; private int age; private int id; - public Student(){} - public Student(String firstName, String lastName, int age) { - super(); + + public Student() { + } + + public Student(String firstName, String lastName, int age, int id) { this.firstName = firstName; this.lastName = lastName; this.age = age; + this.id = id; } public String getFirstName() { @@ -43,5 +47,4 @@ public class Student { public void setId(int id) { this.id = id; } - } diff --git a/play-framework/student-api/app/store/StudentStore.java b/play-framework/student-api/app/store/StudentStore.java new file mode 100644 index 0000000000..315db5b916 --- /dev/null +++ b/play-framework/student-api/app/store/StudentStore.java @@ -0,0 +1,37 @@ +package store; + +import model.Student; + +import java.util.*; + +public class StudentStore { + private Map students = new HashMap<>(); + + public Optional addStudent(Student student) { + int id = students.size(); + student.setId(id); + students.put(id, student); + return Optional.ofNullable(student); + } + + public Optional getStudent(int id) { + return Optional.ofNullable(students.get(id)); + } + + public Set getAllStudents() { + return new HashSet<>(students.values()); + } + + public Optional updateStudent(Student student) { + int id = student.getId(); + if (students.containsKey(id)) { + students.put(id, student); + return Optional.ofNullable(student); + } + return Optional.empty(); + } + + public boolean deleteStudent(int id) { + return students.remove(id) != null; + } +} diff --git a/play-framework/introduction/app/util/Util.java b/play-framework/student-api/app/utils/Util.java similarity index 60% rename from play-framework/introduction/app/util/Util.java rename to play-framework/student-api/app/utils/Util.java index a853a4cb43..3fb9833ada 100644 --- a/play-framework/introduction/app/util/Util.java +++ b/play-framework/student-api/app/utils/Util.java @@ -1,17 +1,17 @@ -package util; +package utils; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import play.libs.Json; public class Util { public static ObjectNode createResponse(Object response, boolean ok) { ObjectNode result = Json.newObject(); - result.put("isSuccessfull", ok); - if (response instanceof String) + result.put("isSuccessful", ok); + if (response instanceof String) { result.put("body", (String) response); - else result.put("body", (JsonNode) response); - + } else { + result.putPOJO("body", response); + } return result; } -} \ No newline at end of file +} diff --git a/play-framework/student-api/build.sbt b/play-framework/student-api/build.sbt new file mode 100644 index 0000000000..13d3fe96cd --- /dev/null +++ b/play-framework/student-api/build.sbt @@ -0,0 +1,10 @@ +name := """student-api""" +organization := "com.baeldung" + +version := "1.0-SNAPSHOT" + +lazy val root = (project in file(".")).enablePlugins(PlayJava) + +scalaVersion := "2.13.0" + +libraryDependencies += guice diff --git a/play-framework/student-api/conf/application.conf b/play-framework/student-api/conf/application.conf new file mode 100644 index 0000000000..85c184dcb1 --- /dev/null +++ b/play-framework/student-api/conf/application.conf @@ -0,0 +1,2 @@ +# This is the main configuration file for the application. +# https://www.playframework.com/documentation/latest/ConfigFile diff --git a/play-framework/student-api/conf/logback.xml b/play-framework/student-api/conf/logback.xml new file mode 100644 index 0000000000..e8c982543f --- /dev/null +++ b/play-framework/student-api/conf/logback.xml @@ -0,0 +1,35 @@ + + + + + + + ${application.home:-.}/logs/application.log + + %date [%level] from %logger in %thread - %message%n%xException + + + + + + %coloredLevel %logger{15} - %message%n%xException{10} + + + + + + + + + + + + + + + + + + + + diff --git a/play-framework/student-api/conf/routes b/play-framework/student-api/conf/routes new file mode 100644 index 0000000000..f89b866953 --- /dev/null +++ b/play-framework/student-api/conf/routes @@ -0,0 +1,12 @@ +# Routes +# This file defines all application routes (Higher priority routes first) +# ~~~~ + +GET / controllers.StudentController.listStudents() +GET /:id controllers.StudentController.retrieve(id:Int) +POST / controllers.StudentController.create(request: Request) +PUT / controllers.StudentController.update(request: Request) +DELETE /:id controllers.StudentController.delete(id:Int) + +# Map static resources from the /public folder to the /assets URL path +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/play-framework/student-api/project/build.properties b/play-framework/student-api/project/build.properties new file mode 100644 index 0000000000..c0bab04941 --- /dev/null +++ b/play-framework/student-api/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/play-framework/student-api/project/plugins.sbt b/play-framework/student-api/project/plugins.sbt new file mode 100644 index 0000000000..1c8c62a0d5 --- /dev/null +++ b/play-framework/student-api/project/plugins.sbt @@ -0,0 +1,7 @@ +// The Play plugin +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.3") + +// Defines scaffolding (found under .g8 folder) +// http://www.foundweekends.org/giter8/scaffolding.html +// sbt "g8Scaffold form" +addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0") diff --git a/play-framework/student-api/test/ApplicationLiveTest.java b/play-framework/student-api/test/ApplicationLiveTest.java deleted file mode 100644 index beeef1a602..0000000000 --- a/play-framework/student-api/test/ApplicationLiveTest.java +++ /dev/null @@ -1,172 +0,0 @@ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import model.Student; -import play.test.*; -import static play.test.Helpers.*; - -public class ApplicationLiveTest{ - private static final String BASE_URL = "http://localhost:9000"; - - @Test -public void testInServer() throws Exception { - TestServer server = testServer(3333); - running(server, () -> { - try { - WSClient ws = play.libs.ws.WS.newClient(3333); - CompletionStage completionStage = ws.url("/").get(); - WSResponse response = completionStage.toCompletableFuture().get(); - ws.close(); - assertEquals(OK, response.getStatus()); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - }); -} - @Test - public void whenCreatesRecord_thenCorrect() { - Student student = new Student("jody", "west", 50); - JSONObject obj = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))); - assertTrue(obj.getBoolean("isSuccessfull")); - JSONObject body = obj.getJSONObject("body"); - assertEquals(student.getAge(), body.getInt("age")); - assertEquals(student.getFirstName(), body.getString("firstName")); - assertEquals(student.getLastName(), body.getString("lastName")); - } - - @Test - public void whenDeletesCreatedRecord_thenCorrect() { - Student student = new Student("Usain", "Bolt", 25); - JSONObject ob1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - int id = ob1.getInt("id"); - JSONObject obj1 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertTrue(obj1.getBoolean("isSuccessfull")); - makeRequest(BASE_URL + "/" + id, "DELETE", null); - JSONObject obj2 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertFalse(obj2.getBoolean("isSuccessfull")); - } - - @Test - public void whenUpdatesCreatedRecord_thenCorrect() { - Student student = new Student("john", "doe", 50); - JSONObject body1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - assertEquals(student.getAge(), body1.getInt("age")); - int newAge = 60; - body1.put("age", newAge); - JSONObject body2 = new JSONObject(makeRequest(BASE_URL, "PUT", body1)).getJSONObject("body"); - assertFalse(student.getAge() == body2.getInt("age")); - assertTrue(newAge == body2.getInt("age")); - } - - @Test - public void whenGetsAllRecords_thenCorrect() { - Student student1 = new Student("jane", "daisy", 50); - Student student2 = new Student("john", "daniel", 60); - Student student3 = new Student("don", "mason", 55); - Student student4 = new Student("scarlet", "ohara", 90); - - makeRequest(BASE_URL, "POST", new JSONObject(student1)); - makeRequest(BASE_URL, "POST", new JSONObject(student2)); - makeRequest(BASE_URL, "POST", new JSONObject(student3)); - makeRequest(BASE_URL, "POST", new JSONObject(student4)); - - JSONObject objects = new JSONObject(makeRequest(BASE_URL, "GET", null)); - assertTrue(objects.getBoolean("isSuccessfull")); - JSONArray array = objects.getJSONArray("body"); - assertTrue(array.length() >= 4); - } - - public static String makeRequest(String myUrl, String httpMethod, JSONObject parameters) { - - URL url = null; - try { - url = new URL(myUrl); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - HttpURLConnection conn = null; - try { - - conn = (HttpURLConnection) url.openConnection(); - } catch (IOException e) { - e.printStackTrace(); - } - conn.setDoInput(true); - - conn.setReadTimeout(10000); - - conn.setRequestProperty("Content-Type", "application/json"); - DataOutputStream dos = null; - int respCode = 0; - String inputString = null; - try { - conn.setRequestMethod(httpMethod); - - if (Arrays.asList("POST", "PUT").contains(httpMethod)) { - String params = parameters.toString(); - - conn.setDoOutput(true); - - dos = new DataOutputStream(conn.getOutputStream()); - dos.writeBytes(params); - dos.flush(); - dos.close(); - } - respCode = conn.getResponseCode(); - if (respCode != 200 && respCode != 201) { - String error = inputStreamToString(conn.getErrorStream()); - return error; - } - inputString = inputStreamToString(conn.getInputStream()); - - } catch (IOException e) { - - e.printStackTrace(); - } - return inputString; - } - - public static String inputStreamToString(InputStream is) { - BufferedReader br = null; - StringBuilder sb = new StringBuilder(); - - String line; - try { - - br = new BufferedReader(new InputStreamReader(is)); - while ((line = br.readLine()) != null) { - sb.append(line); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - return sb.toString(); - - } -} diff --git a/play-framework/student-api/test/controllers/StudentControllerUnitTest.java b/play-framework/student-api/test/controllers/StudentControllerUnitTest.java new file mode 100644 index 0000000000..bf645b72f9 --- /dev/null +++ b/play-framework/student-api/test/controllers/StudentControllerUnitTest.java @@ -0,0 +1,95 @@ +package controllers; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.Test; +import play.Application; +import play.inject.guice.GuiceApplicationBuilder; +import play.libs.Json; +import play.mvc.Http; +import play.mvc.Result; +import play.test.WithApplication; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static play.mvc.Http.Status.OK; +import static play.test.Helpers.*; + +public class StudentControllerUnitTest extends WithApplication { + + @Override + protected Application provideApplication() { + return new GuiceApplicationBuilder().build(); + } + + @Test + public void givenStudentPostData_whenCreatingStudent_ThenShouldReturnCreatedStudent() { + final ObjectNode jsonNode = Json.newObject(); + jsonNode.put("firstName", "John"); + jsonNode.put("lastName", "Baeldung"); + jsonNode.put("age", 25); + + Http.RequestBuilder request = new Http.RequestBuilder() + .method(POST) + .bodyJson(jsonNode) + .uri("/"); + + Result result = route(app, request); + assertEquals(CREATED, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenUrlToListStudents_whenListingStudents_ThenShouldReturnStudentList() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenUrlToRetrieveSingleStudent_whenRetrievingStudent_ThenShouldReturn404NotFound() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/1"); + + Result result = route(app, request); + assertEquals(NOT_FOUND, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenUrlToUpdateStudent_whenaUpdatingStudent_ThenShouldFail() { + final ObjectNode jsonNode = Json.newObject(); + jsonNode.put("firstName", "John"); + jsonNode.put("lastName", "Baeldung"); + jsonNode.put("age", 25); + + Http.RequestBuilder request = new Http.RequestBuilder() + .method(PUT) + .bodyJson(jsonNode) + .uri("/"); + + Result result = route(app, request); + assertEquals(INTERNAL_SERVER_ERROR, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenIdToDeleteStudent_whenDeletingStudent_ThenShouldFail() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(DELETE) + .uri("/1"); + + Result result = route(app, request); + assertEquals(NOT_FOUND, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } +} diff --git a/pom.xml b/pom.xml index a83edd84bd..2b2db4b0cf 100644 --- a/pom.xml +++ b/pom.xml @@ -339,6 +339,8 @@ algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-miscellaneous-3 + algorithms-miscellaneous-4 + algorithms-miscellaneous-5 algorithms-sorting animal-sniffer-mvn-plugin annotations @@ -364,7 +366,6 @@ asciidoctor asm atomix - autovalue aws aws-lambda axon @@ -379,6 +380,7 @@ checker-plugin cloud-foundry-uaa/cf-uaa-oauth2-client cloud-foundry-uaa/cf-uaa-oauth2-resource-server + code-generation core-groovy core-groovy-2 core-groovy-collections @@ -387,25 +389,40 @@ core-java-modules/core-java-8 core-java-modules/core-java-8-2 + core-java-modules/core-java-annotations + core-java-modules/core-java-streams + core-java-modules/core-java-function + core-java-modules/core-java-lang-math + core-java-modules/core-java-datetime + core-java-modules/core-java-text core-java-modules/core-java-lambdas core-java-modules/core-java-arrays core-java-modules/core-java-arrays-2 core-java-modules/core-java-collections + core-java-modules/core-java-collections-2 + core-java-modules/core-java-collections-3 core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 + core-java-modules/core-java-collections-list-3 core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-set core-java-modules/core-java-concurrency-basic + core-java-modules/core-java-concurrency-basic-2 core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io + core-java-modules/core-java-io-files core-java-modules/core-java-nio core-java-modules/core-java-security + core-java-modules/core-java-exceptions core-java-modules/core-java-lang-syntax + core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang + core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 + core-java-modules/core-java-lang-oop-3 core-java-modules core-java-modules/core-java-networking core-java-modules/core-java-perf @@ -440,6 +457,7 @@ grpc gson guava + guava-io guava-collections guava-collections-set guava-modules @@ -513,6 +531,8 @@ libraries-data libraries-data-2 libraries-apache-commons + libraries-apache-commons-collections + libraries-apache-commons-io libraries-primitive libraries-testing libraries-security @@ -525,7 +545,11 @@ lucene mapstruct - maven + + maven-all/maven + maven-all/maven-war-plugin + maven-all/profiles + maven-all/versions-maven-plugin maven-archetype maven-polyglot/maven-polyglot-json-extension @@ -534,6 +558,7 @@ metrics microprofile + ml msf4j mustache @@ -579,7 +604,7 @@ spring-boot-nashorn java-blockchain - + @@ -651,7 +676,6 @@ spring-boot spring-boot-admin spring-boot-angular - spring-boot-angular-ecommerce spring-boot-autoconfiguration spring-boot-bootstrap spring-boot-camel @@ -741,6 +765,7 @@ spring-remoting spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -928,6 +953,7 @@ spring-remoting/remoting-rmi/remoting-rmi-server spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-simple spring-resttemplate @@ -1014,7 +1040,7 @@ core-kotlin-2 core-kotlin-io - jenkins/hello-world + jenkins/plugins jhipster jws @@ -1066,6 +1092,8 @@ algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-miscellaneous-3 + algorithms-miscellaneous-4 + algorithms-miscellaneous-5 algorithms-sorting animal-sniffer-mvn-plugin annotations @@ -1091,7 +1119,6 @@ asciidoctor asm atomix - autovalue aws aws-lambda axon @@ -1104,6 +1131,7 @@ checker-plugin cloud-foundry-uaa/cf-uaa-oauth2-client cloud-foundry-uaa/cf-uaa-oauth2-resource-server + code-generation core-groovy core-groovy-2 core-groovy-collections @@ -1111,24 +1139,39 @@ core-java-modules/core-java-8 core-java-modules/core-java-8-2 + core-java-modules/core-java-annotations + core-java-modules/core-java-streams + core-java-modules/core-java-function + core-java-modules/core-java-lang-math + core-java-modules/core-java-datetime + core-java-modules/core-java-text core-java-modules/core-java-arrays core-java-modules/core-java-arrays-2 core-java-modules/core-java-collections + core-java-modules/core-java-collections-2 + core-java-modules/core-java-collections-3 core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 + core-java-modules/core-java-collections-list-3 core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-set core-java-modules/core-java-concurrency-basic + core-java-modules/core-java-concurrency-basic-2 core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io + core-java-modules/core-java-io-files core-java-modules/core-java-nio core-java-modules/core-java-security + core-java-modules/core-java-exceptions core-java-modules/core-java-lang-syntax + core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang + core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 + core-java-modules/core-java-lang-oop-3 core-java-modules core-java-modules/core-java-networking core-java-modules/core-java-perf @@ -1160,6 +1203,7 @@ grpc gson guava + guava-io guava-collections guava-collections-set guava-modules @@ -1230,6 +1274,8 @@ libraries-data libraries-data-2 libraries-apache-commons + libraries-apache-commons-collections + libraries-apache-commons-io libraries-testing libraries-security libraries-server @@ -1240,7 +1286,11 @@ lucene mapstruct - maven + + maven-all/maven + maven-all/maven-war-plugin + maven-all/profiles + maven-all/versions-maven-plugin maven-archetype @@ -1250,6 +1300,7 @@ metrics microprofile + ml msf4j mustache @@ -1347,7 +1398,6 @@ spring-boot spring-boot-admin spring-boot-angular - spring-boot-angular-ecommerce spring-boot-autoconfiguration spring-boot-bootstrap spring-boot-camel @@ -1432,6 +1482,7 @@ spring-remoting spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -1541,7 +1592,7 @@ core-kotlin core-kotlin-2 - jenkins/hello-world + jenkins/plugins jhipster jws diff --git a/protobuffer/README.md b/protobuffer/README.md index 4dcdb3cf52..4302418a8b 100644 --- a/protobuffer/README.md +++ b/protobuffer/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Introduction to Google Protocol Buffer](http://www.baeldung.com/google-protocol-buffer) +- [Introduction to Google Protocol Buffer](https://www.baeldung.com/google-protocol-buffer) diff --git a/rabbitmq/README.md b/rabbitmq/README.md index 11300b047f..01e51bd784 100644 --- a/rabbitmq/README.md +++ b/rabbitmq/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Introduction to RabbitMQ](http://www.baeldung.com/rabbitmq) +- [Introduction to RabbitMQ](https://www.baeldung.com/rabbitmq) diff --git a/raml/README.MD b/raml/README.MD index 2a87b46021..fcf0b41a18 100644 --- a/raml/README.MD +++ b/raml/README.MD @@ -1,2 +1,2 @@ ###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +The "REST With Spring" Classes: https://bit.ly/restwithspring diff --git a/ratpack/README.md b/ratpack/README.md index 78e2f8ccfc..706fd0c8c3 100644 --- a/ratpack/README.md +++ b/ratpack/README.md @@ -1,9 +1,9 @@ ### Relevant articles -- [Introduction to Ratpack](http://www.baeldung.com/ratpack) -- [Ratpack Google Guice Integration](http://www.baeldung.com/ratpack-google-guice) +- [Introduction to Ratpack](https://www.baeldung.com/ratpack) +- [Ratpack Google Guice Integration](https://www.baeldung.com/ratpack-google-guice) - [Ratpack Integration with Spring Boot](http://www.baeldung.com/ratpack-spring-boot) -- [Ratpack with Hystrix](http://www.baeldung.com/ratpack-hystrix) +- [Ratpack with Hystrix](https://www.baeldung.com/ratpack-hystrix) - [Ratpack HTTP Client](https://www.baeldung.com/ratpack-http-client) - [Ratpack with RxJava](https://www.baeldung.com/ratpack-rxjava) - [Ratpack with Groovy](https://www.baeldung.com/ratpack-groovy) diff --git a/reactor-core/README.md b/reactor-core/README.md index 5f9d2d1bc2..ba5b355d02 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -1,5 +1,5 @@ ### Relevant articles -- [Intro To Reactor Core](http://www.baeldung.com/reactor-core) -- [Combining Publishers in Project Reactor](http://www.baeldung.com/reactor-combine-streams) +- [Intro To Reactor Core](https://www.baeldung.com/reactor-core) +- [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams) - [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor) diff --git a/resteasy/README.md b/resteasy/README.md index 83051037d2..3f3c833256 100644 --- a/resteasy/README.md +++ b/resteasy/README.md @@ -4,6 +4,6 @@ ### Relevant Articles: -- [A Guide to RESTEasy](http://www.baeldung.com/resteasy-tutorial) -- [RESTEasy Client API](http://www.baeldung.com/resteasy-client-tutorial) -- [CORS in JAX-RS](http://www.baeldung.com/cors-in-jax-rs) +- [A Guide to RESTEasy](https://www.baeldung.com/resteasy-tutorial) +- [RESTEasy Client API](https://www.baeldung.com/resteasy-client-tutorial) +- [CORS in JAX-RS](https://www.baeldung.com/cors-in-jax-rs) diff --git a/rule-engines/README.md b/rule-engines/README.md index 6d3c0e93b4..37d419daf5 100644 --- a/rule-engines/README.md +++ b/rule-engines/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [List of Rules Engines in Java](http://www.baeldung.com/java-rule-engines) +- [List of Rules Engines in Java](https://www.baeldung.com/java-rule-engines) diff --git a/rxjava-2/README.md b/rxjava-2/README.md index 4182f3fa00..43c1a9942b 100644 --- a/rxjava-2/README.md +++ b/rxjava-2/README.md @@ -1,9 +1,9 @@ ## Relevant articles: -- [RxJava and Error Handling](http://www.baeldung.com/rxjava-error-handling) -- [RxJava 2 – Flowable](http://www.baeldung.com/rxjava-2-flowable) -- [RxJava Maybe](http://www.baeldung.com/rxjava-maybe) -- [Introduction to RxRelay for RxJava](http://www.baeldung.com/rx-relay) +- [RxJava and Error Handling](https://www.baeldung.com/rxjava-error-handling) +- [RxJava 2 – Flowable](https://www.baeldung.com/rxjava-2-flowable) +- [RxJava Maybe](https://www.baeldung.com/rxjava-maybe) +- [Introduction to RxRelay for RxJava](https://www.baeldung.com/rx-relay) - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) - [Converting Synchronous and Asynchronous APIs to Observables using RxJava2](https://www.baeldung.com/rxjava-apis-to-observables) - [RxJava Hooks](https://www.baeldung.com/rxjava-hooks) diff --git a/rxjava/README.md b/rxjava/README.md index f8a4ca1dbe..f9b7e2ba0d 100644 --- a/rxjava/README.md +++ b/rxjava/README.md @@ -1,15 +1,15 @@ ## Relevant articles: -- [Dealing with Backpressure with RxJava](http://www.baeldung.com/rxjava-backpressure) -- [How to Test RxJava?](http://www.baeldung.com/rxjava-testing) -- [Implementing Custom Operators in RxJava](http://www.baeldung.com/rxjava-custom-operators) -- [Introduction to RxJava](http://www.baeldung.com/rx-java) -- [Observable Utility Operators in RxJava](http://www.baeldung.com/rxjava-observable-operators) -- [Introduction to rxjava-jdbc](http://www.baeldung.com/rxjava-jdbc) -- [Schedulers in RxJava](http://www.baeldung.com/rxjava-schedulers) -- [Mathematical and Aggregate Operators in RxJava](http://www.baeldung.com/rxjava-math) -- [Combining Observables in RxJava](http://www.baeldung.com/rxjava-combine-observables) -- [RxJava StringObservable](http://www.baeldung.com/rxjava-string) -- [Filtering Observables in RxJava](http://www.baeldung.com/rxjava-filtering) -- [RxJava One Observable, Multiple Subscribers](http://www.baeldung.com/rxjava-multiple-subscribers-observable) +- [Dealing with Backpressure with RxJava](https://www.baeldung.com/rxjava-backpressure) +- [How to Test RxJava?](https://www.baeldung.com/rxjava-testing) +- [Implementing Custom Operators in RxJava](https://www.baeldung.com/rxjava-custom-operators) +- [Introduction to RxJava](https://www.baeldung.com/rx-java) +- [Observable Utility Operators in RxJava](https://www.baeldung.com/rxjava-observable-operators) +- [Introduction to rxjava-jdbc](https://www.baeldung.com/rxjava-jdbc) +- [Schedulers in RxJava](https://www.baeldung.com/rxjava-schedulers) +- [Mathematical and Aggregate Operators in RxJava](https://www.baeldung.com/rxjava-math) +- [Combining Observables in RxJava](https://www.baeldung.com/rxjava-combine-observables) +- [RxJava StringObservable](https://www.baeldung.com/rxjava-string) +- [Filtering Observables in RxJava](https://www.baeldung.com/rxjava-filtering) +- [RxJava One Observable, Multiple Subscribers](https://www.baeldung.com/rxjava-multiple-subscribers-observable) - [Difference Between Flatmap and Switchmap in RxJava](https://www.baeldung.com/rxjava-flatmap-switchmap) diff --git a/saas/README.md b/saas/README.md index 4e0eeea974..4effb2afa9 100644 --- a/saas/README.md +++ b/saas/README.md @@ -1,3 +1,7 @@ +## SAAS + +This module contains articles about software as a service (SAAS) + ## Relevant articles: -- [JIRA REST API Integration](http://www.baeldung.com/jira-rest-api) +- [JIRA REST API Integration](https://www.baeldung.com/jira-rest-api) diff --git a/spark-java/README.md b/spark-java/README.md index 5abe78263c..b3ef62e631 100644 --- a/spark-java/README.md +++ b/spark-java/README.md @@ -1,6 +1,6 @@ -========= +## Spark Java -## Spark Java Framework Tutorial Sample Project +This module contains articles about Spark ### Relevant Articles -- [Building an API With the Spark Java Framework](http://www.baeldung.com/spark-framework-rest-api) +- [Building an API With the Spark Java Framework](https://www.baeldung.com/spark-framework-rest-api) diff --git a/spring-4/README.md b/spring-4/README.md index 584b93a3a3..46d9b71e5c 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -1,5 +1,9 @@ +## Spring 4 + +This module contains articles about Spring 4 + ### Relevant Articles: -- [A Guide to Flips for Spring](http://www.baeldung.com/flips-spring) +- [A Guide to Flips for Spring](https://www.baeldung.com/flips-spring) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) -- [Spring JSON-P with Jackson](http://www.baeldung.com/spring-jackson-jsonp) -- [What’s New in Spring 4.3?](http://www.baeldung.com/whats-new-in-spring-4-3) +- [Spring JSON-P with Jackson](https://www.baeldung.com/spring-jackson-jsonp) +- [What’s New in Spring 4.3?](https://www.baeldung.com/whats-new-in-spring-4-3) diff --git a/spring-4/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java b/spring-4/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java similarity index 89% rename from spring-4/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java rename to spring-4/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java index 0bd8637681..7f8736ae87 100644 --- a/spring-4/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java +++ b/spring-4/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-4/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java b/spring-4/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java similarity index 95% rename from spring-4/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java rename to spring-4/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java index 0cc876d5b1..e3ed608521 100644 --- a/spring-4/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java +++ b/spring-4/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import static org.junit.Assert.*; diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md index 4c2347dc77..683b493317 100644 --- a/spring-5-data-reactive/README.md +++ b/spring-5-data-reactive/README.md @@ -1,10 +1,12 @@ ## Spring Data Reactive Project +This module contains articles about reactive Spring 5 Data + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Reactive Flow with MongoDB, Kotlin, and Spring WebFlux](http://www.baeldung.com/kotlin-mongodb-spring-webflux) -- [Spring Data Reactive Repositories with MongoDB](http://www.baeldung.com/spring-data-mongodb-reactive) +- [Reactive Flow with MongoDB, Kotlin, and Spring WebFlux](https://www.baeldung.com/kotlin-mongodb-spring-webflux) +- [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive) - [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors) - [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index 5372803842..296da87529 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -14,6 +14,14 @@ + + io.projectreactor + reactor-core + + + org.springframework.boot + spring-boot-starter-data-couchbase-reactive + org.springframework.boot spring-boot-starter-data-mongodb-reactive @@ -105,6 +113,12 @@ httpclient ${httpclient.version} + + com.couchbase.mock + CouchbaseMock + ${couchbaseMock.version} + test + @@ -224,6 +238,7 @@ 0.8.0.M8 4.5.2 1.4.199 + 1.5.23 diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java new file mode 100644 index 0000000000..4e5bf9d5dc --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.couchbase; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; + +@SpringBootApplication(exclude = MongoAutoConfiguration.class) +public class ReactiveCouchbaseApplication { + + public static void main(String[] args) { + SpringApplication.run(ReactiveCouchbaseApplication.class, args); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java new file mode 100644 index 0000000000..81f19eebd6 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java @@ -0,0 +1,43 @@ +package com.baeldung.couchbase.configuration; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +import java.util.Collections; +import java.util.List; + +@Configuration +@PropertySource("classpath:couchbase.properties") +public class CouchbaseProperties { + + private final List bootstrapHosts; + private final String bucketName; + private final String bucketPassword; + private final int port; + + public CouchbaseProperties(@Value("${spring.couchbase.bootstrap-hosts}") final List bootstrapHosts, @Value("${spring.couchbase.bucket.name}") final String bucketName, @Value("${spring.couchbase.bucket.password}") final String bucketPassword, + @Value("${spring.couchbase.port}") final int port) { + this.bootstrapHosts = Collections.unmodifiableList(bootstrapHosts); + this.bucketName = bucketName; + this.bucketPassword = bucketPassword; + this.port = port; + } + + public List getBootstrapHosts() { + return bootstrapHosts; + } + + public String getBucketName() { + return bucketName; + } + + public String getBucketPassword() { + return bucketPassword; + } + + public int getPort() { + return port; + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java new file mode 100644 index 0000000000..059bd36cae --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.couchbase.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories; + +@Configuration +@EnableReactiveCouchbaseRepositories("com.baeldung.couchbase.domain.repository.n1ql") +@Primary +public class N1QLReactiveCouchbaseConfiguration extends ReactiveCouchbaseConfiguration { + + public N1QLReactiveCouchbaseConfiguration(CouchbaseProperties couchbaseProperties) { + super(couchbaseProperties); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java new file mode 100644 index 0000000000..a51b19ee22 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java @@ -0,0 +1,48 @@ +package com.baeldung.couchbase.configuration; + +import com.couchbase.client.java.env.CouchbaseEnvironment; +import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; + +import org.springframework.context.annotation.Bean; +import org.springframework.data.couchbase.config.AbstractReactiveCouchbaseConfiguration; +import org.springframework.data.couchbase.config.BeanNames; +import org.springframework.data.couchbase.repository.support.IndexManager; + +import java.util.List; + +public abstract class ReactiveCouchbaseConfiguration extends AbstractReactiveCouchbaseConfiguration { + + private CouchbaseProperties couchbaseProperties; + + public ReactiveCouchbaseConfiguration(final CouchbaseProperties couchbaseProperties) { + this.couchbaseProperties = couchbaseProperties; + } + + @Override + protected List getBootstrapHosts() { + return couchbaseProperties.getBootstrapHosts(); + } + + @Override + protected String getBucketName() { + return couchbaseProperties.getBucketName(); + } + + @Override + protected String getBucketPassword() { + return couchbaseProperties.getBucketPassword(); + } + + @Override + public CouchbaseEnvironment couchbaseEnvironment() { + return DefaultCouchbaseEnvironment + .builder() + .bootstrapHttpDirectPort(couchbaseProperties.getPort()) + .build(); + } + + @Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) + public IndexManager couchbaseIndexManager() { + return new IndexManager(true, true, false); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java new file mode 100644 index 0000000000..9b4d9b0319 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java @@ -0,0 +1,13 @@ +package com.baeldung.couchbase.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories; + +@Configuration +@EnableReactiveCouchbaseRepositories("com.baeldung.couchbase.domain.repository.view") +public class ViewReactiveCouchbaseConfiguration extends ReactiveCouchbaseConfiguration { + + public ViewReactiveCouchbaseConfiguration(CouchbaseProperties couchbaseProperties) { + super(couchbaseProperties); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java new file mode 100644 index 0000000000..285de34df8 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java @@ -0,0 +1,43 @@ +package com.baeldung.couchbase.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.couchbase.core.mapping.Document; + +import java.util.Objects; +import java.util.UUID; + +@Document +public class Person { + + @Id private UUID id; + private String firstName; + + public Person(final UUID id, final String firstName) { + this.id = id; + this.firstName = firstName; + } + + private Person() { + } + + public UUID getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return Objects.equals(id, person.id) && Objects.equals(firstName, person.firstName); + } + + @Override + public int hashCode() { + return Objects.hash(id, firstName); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java new file mode 100644 index 0000000000..6f73a77ceb --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java @@ -0,0 +1,16 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +import org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; + +import java.util.UUID; + +@Repository +@N1qlPrimaryIndexed +public interface N1QLPersonRepository extends ReactiveCrudRepository { + + Flux findAllByFirstName(final String firstName); +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java new file mode 100644 index 0000000000..57dd149425 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java @@ -0,0 +1,13 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +import org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed; +import org.springframework.data.repository.reactive.ReactiveSortingRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +@N1qlPrimaryIndexed +public interface N1QLSortingPersonRepository extends ReactiveSortingRepository { +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java new file mode 100644 index 0000000000..06c47c2393 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java @@ -0,0 +1,20 @@ +package com.baeldung.couchbase.domain.repository.view; + +import com.baeldung.couchbase.domain.Person; +import org.springframework.data.couchbase.core.query.View; +import org.springframework.data.couchbase.core.query.ViewIndexed; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; + +import java.util.UUID; + +@Repository +@ViewIndexed(designDoc = ViewPersonRepository.DESIGN_DOCUMENT) +public interface ViewPersonRepository extends ReactiveCrudRepository { + + String DESIGN_DOCUMENT = "person"; + + @View(designDocument = ViewPersonRepository.DESIGN_DOCUMENT) + Flux findByFirstName(String firstName); +} diff --git a/spring-5-data-reactive/src/main/resources/couchbase.properties b/spring-5-data-reactive/src/main/resources/couchbase.properties new file mode 100644 index 0000000000..53fad807fe --- /dev/null +++ b/spring-5-data-reactive/src/main/resources/couchbase.properties @@ -0,0 +1,4 @@ +spring.couchbase.bucket.name=default +spring.couchbase.bootstrap-hosts=localhost +spring.couchbase.port=8091 +spring.couchbase.bucket.password=123456 \ No newline at end of file diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java new file mode 100644 index 0000000000..2a09fce4b0 --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java @@ -0,0 +1,54 @@ +package com.baeldung.couchbase.domain.repository; + +import com.baeldung.couchbase.configuration.CouchbaseProperties; +import com.couchbase.mock.Bucket; +import com.couchbase.mock.BucketConfiguration; +import com.couchbase.mock.CouchbaseMock; +import org.springframework.boot.test.context.TestConfiguration; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Collections; + +@TestConfiguration +public class CouchbaseMockConfiguration { + + private CouchbaseMock couchbaseMock; + + public CouchbaseMockConfiguration(final CouchbaseProperties couchbaseProperties) { + final BucketConfiguration bucketConfiguration = new BucketConfiguration(); + bucketConfiguration.numNodes = 1; + bucketConfiguration.numReplicas = 1; + bucketConfiguration.numVBuckets = 1024; + bucketConfiguration.name = couchbaseProperties.getBucketName(); + bucketConfiguration.type = Bucket.BucketType.COUCHBASE; + bucketConfiguration.password = couchbaseProperties.getBucketPassword(); + + try { + couchbaseMock = new CouchbaseMock(couchbaseProperties.getPort(), Collections.singletonList(bucketConfiguration)); + } catch (final IOException ex) { + throw new UncheckedIOException(ex); + } + } + + @PostConstruct + public void postConstruct() { + try { + couchbaseMock.start(); + } catch (final IOException ex) { + throw new UncheckedIOException(ex); + } + try { + couchbaseMock.waitForStartup(); + } catch (final InterruptedException ex) { + throw new RuntimeException(ex); + } + } + + @PreDestroy + public void preDestroy() { + couchbaseMock.stop(); + } +} diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java new file mode 100644 index 0000000000..c8dbbf429e --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java @@ -0,0 +1,55 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +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 reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.util.UUID; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = {"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration"}) +public class N1QLPersonRepositoryLiveTest { + + @Autowired private N1QLPersonRepository personRepository; + + @Test + public void shouldFindAll_byLastName() { + //Given + final String firstName = "John"; + final Person matchingPerson = new Person(UUID.randomUUID(), firstName); + final Person nonMatchingPerson = new Person(UUID.randomUUID(), "NotJohn"); + wrap(() -> { + personRepository + .save(matchingPerson) + .subscribe(); + personRepository + .save(nonMatchingPerson) + .subscribe(); + //When + final Flux allByFirstName = personRepository.findAllByFirstName(firstName); + //Then + StepVerifier + .create(allByFirstName) + .expectNext(matchingPerson) + .verifyComplete(); + + }, matchingPerson, nonMatchingPerson); + } + + private void wrap(final Runnable runnable, final Person... people) { + try { + runnable.run(); + } finally { + for (final Person person : people) { + personRepository + .delete(person) + .subscribe(); + } + } + } +} \ No newline at end of file diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java new file mode 100644 index 0000000000..8c6ce137f1 --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java @@ -0,0 +1,60 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +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.data.domain.Sort; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.util.UUID; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = {"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration"}) +public class N1QLSortingPersonRepositoryLiveTest { + + @Autowired private N1QLSortingPersonRepository personRepository; + + @Test + public void shouldFindAll_sortedByFirstName() { + //Given + final Person firstPerson = new Person(UUID.randomUUID(), "John"); + final Person secondPerson = new Person(UUID.randomUUID(), "Mikki"); + wrap(() -> { + personRepository + .save(firstPerson) + .subscribe(); + personRepository + .save(secondPerson) + .subscribe(); + //When + final Flux allByFirstName = personRepository.findAll(Sort.by(Sort.Direction.DESC, "firstName")); + //Then + StepVerifier + .create(allByFirstName) + .expectNextMatches(person -> person + .getFirstName() + .equals(secondPerson.getFirstName())) + .expectNextMatches(person -> person + .getFirstName() + .equals(firstPerson.getFirstName())) + .verifyComplete(); + }, firstPerson, secondPerson); + } + + //workaround for deleteAll() + private void wrap(final Runnable runnable, final Person... people) { + try { + runnable.run(); + } finally { + for (final Person person : people) { + personRepository + .delete(person) + .subscribe(); + } + } + } +} \ No newline at end of file diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java new file mode 100644 index 0000000000..15688e1b80 --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java @@ -0,0 +1,81 @@ +package com.baeldung.couchbase.domain.repository.view; + +import com.baeldung.couchbase.configuration.CouchbaseProperties; +import com.baeldung.couchbase.configuration.ViewReactiveCouchbaseConfiguration; +import com.baeldung.couchbase.domain.Person; +import com.baeldung.couchbase.domain.repository.CouchbaseMockConfiguration; +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.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.util.UUID; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = { "spring.couchbase.port=10010", "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration" }, + classes = { CouchbaseMockConfiguration.class, ViewReactiveCouchbaseConfiguration.class, CouchbaseProperties.class }) +public class ViewPersonRepositoryIntegrationTest { + + @Autowired private ViewPersonRepository personRepository; + + @Test + public void shouldSavePerson_findById_thenDeleteIt() { + //Given + final UUID id = UUID.randomUUID(); + final Person person = new Person(id, "John"); + wrap(() -> { + personRepository + .save(person) + .subscribe(); + //When + final Mono byId = personRepository.findById(id); + //Then + StepVerifier + .create(byId) + .expectNextMatches(result -> result + .getId() + .equals(id)) + .expectComplete() + .verify(); + }, person); + } + + @Test + public void shouldFindAll_thenDeleteIt() { + //Given + final Person person = new Person(UUID.randomUUID(), "John"); + final Person secondPerson = new Person(UUID.randomUUID(), "Mikki"); + wrap(() -> { + personRepository + .save(person) + .subscribe(); + personRepository + .save(secondPerson) + .subscribe(); + //When + final Flux all = personRepository.findAll(); + //Then + StepVerifier + .create(all) + .expectNextCount(2) + .verifyComplete(); + }, person, secondPerson); + } + + private void wrap(final Runnable runnable, final Person... people) { + try { + runnable.run(); + } finally { + for (final Person person : people) { + personRepository + .delete(person) + .subscribe(); + } + } + } +} \ No newline at end of file diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md index 063945281f..e98012c047 100644 --- a/spring-5-mvc/README.md +++ b/spring-5-mvc/README.md @@ -1,3 +1,8 @@ +## Spring 5 MVC + +This module contains articles about Spring 5 model-view-controller (MVC) pattern + ### Relevant Articles: -- [Spring Boot and Kotlin](http://www.baeldung.com/spring-boot-kotlin) +- [Spring Boot and Kotlin](https://www.baeldung.com/spring-boot-kotlin) - [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams) +- [Interface Driven Controllers in Spring](https://www.baeldung.com/spring-interface-driven-controllers) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 7aec8f94bf..061c15b148 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -1,2 +1,12 @@ ## Spring 5 Reactive Project + +This module contains articles about reactive Spring 5 + - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) +- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) +- [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) +- [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) +- [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) +- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) +- [Spring WebClient Filters](https://www.baeldung.com/spring-webclient-filters) +- More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive-2/pom.xml b/spring-5-reactive-2/pom.xml index f1407ee1ad..37c9ad3579 100644 --- a/spring-5-reactive-2/pom.xml +++ b/spring-5-reactive-2/pom.xml @@ -23,22 +23,37 @@ org.springframework.boot - spring-boot-starter-test - test + spring-boot-starter-security + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + org.projectlombok lombok - ${lombok.version} provided + + org.springframework.boot + spring-boot-starter-test + test + + com.github.tomakehurst wiremock-jre8 ${wiremock.version} test + + io.projectreactor + reactor-test + test + @@ -55,6 +70,7 @@ + 1.0.1.RELEASE 2.24.0 diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java similarity index 97% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java index 486c5e77eb..3f01310006 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java @@ -28,6 +28,7 @@ public class ConsumerDebuggingApplication { http.authorizeExchange() .anyExchange() .permitAll(); + http.csrf().disable(); return http.build(); } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/Foo.java similarity index 89% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/Foo.java index ac5093c261..916ca93bfc 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/Foo.java @@ -2,10 +2,7 @@ package com.baeldung.debugging.consumer.model; import java.util.concurrent.ThreadLocalRandom; -import org.springframework.data.annotation.Id; - import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -16,7 +13,6 @@ import lombok.Setter; @AllArgsConstructor public class Foo { - @Id private Integer id; private String formattedName; private Integer quantity; diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooService.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooService.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/model/Foo.java similarity index 77% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/model/Foo.java index a60e468e7f..2d9491f3dd 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/model/Foo.java @@ -1,7 +1,5 @@ package com.baeldung.debugging.server.model; -import org.springframework.data.annotation.Id; - import lombok.AllArgsConstructor; import lombok.Data; @@ -9,7 +7,6 @@ import lombok.Data; @AllArgsConstructor public class Foo { - @Id private Long id; private String name; diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java b/spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java rename to spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java similarity index 95% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java index 2011679741..9fec15142e 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java @@ -1,7 +1,6 @@ package com.baeldung.validations.functional.handlers.impl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.validation.Validator; diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java diff --git a/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java index 751e3a9487..3c53a2c1d3 100644 --- a/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java @@ -2,10 +2,22 @@ package com.baeldung.webclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; @SpringBootApplication public class WebClientApplication { public static void main(String[] args) { SpringApplication.run(WebClientApplication.class, args); } + + @Bean + public SecurityWebFilterChain functionalValidationsSpringSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + http.csrf().disable(); + return http.build(); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java b/spring-5-reactive-2/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java rename to spring-5-reactive-2/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java diff --git a/spring-5-reactive/src/main/resources/application-assets-custom-location.properties b/spring-5-reactive-2/src/main/resources/application-assets-custom-location.properties similarity index 100% rename from spring-5-reactive/src/main/resources/application-assets-custom-location.properties rename to spring-5-reactive-2/src/main/resources/application-assets-custom-location.properties diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java rename to spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java similarity index 97% rename from spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java index 73968cdf05..92257f2850 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java +++ b/spring-5-reactive-2/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java @@ -11,7 +11,7 @@ import com.baeldung.validations.functional.model.CustomRequestEntity; import reactor.core.publisher.Mono; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class FunctionalEndpointValidationsLiveTest { private static final String BASE_URL = "http://localhost:8080"; diff --git a/spring-5-reactive/src/main/resources/public/index.html b/spring-5-reactive-2/src/test/resources/assets/index.html similarity index 100% rename from spring-5-reactive/src/main/resources/public/index.html rename to spring-5-reactive-2/src/test/resources/assets/index.html diff --git a/spring-5-reactive/src/main/resources/img/example-image.png b/spring-5-reactive-2/src/test/resources/img/example-image.png similarity index 100% rename from spring-5-reactive/src/main/resources/img/example-image.png rename to spring-5-reactive-2/src/test/resources/img/example-image.png diff --git a/spring-5-reactive/src/test/resources/logback-test.xml b/spring-5-reactive-2/src/test/resources/logback-test.xml similarity index 100% rename from spring-5-reactive/src/test/resources/logback-test.xml rename to spring-5-reactive-2/src/test/resources/logback-test.xml diff --git a/spring-5-reactive-2/src/test/resources/public/index.html b/spring-5-reactive-2/src/test/resources/public/index.html new file mode 100644 index 0000000000..7a3b9413cd --- /dev/null +++ b/spring-5-reactive-2/src/test/resources/public/index.html @@ -0,0 +1,10 @@ + + + + + Baeldung: Static Content in Spring WebFlux + + +Example HTML file + + \ No newline at end of file diff --git a/spring-5-reactive-client/README.md b/spring-5-reactive-client/README.md index 0df2bdd339..90d12cad1c 100644 --- a/spring-5-reactive-client/README.md +++ b/spring-5-reactive-client/README.md @@ -1,5 +1,7 @@ ## Spring REST Example Project +This module contains articles about reactive Spring 5 WebClient + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 1b71815eb4..994239fa9b 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -54,9 +54,20 @@ org.apache.commons commons-lang3 + + + com.squareup.okhttp3 + okhttp + 4.0.1 + + + com.squareup.okhttp3 + mockwebserver + 4.0.1 + test + - org.springframework.boot spring-boot-devtools @@ -77,6 +88,12 @@ spring-boot-starter-test test + + com.github.tomakehurst + wiremock + 2.24.1 + test + org.apache.commons @@ -89,6 +106,25 @@ org.projectlombok lombok + + org.mockito + mockito-junit-jupiter + 2.23.0 + test + + + io.projectreactor + reactor-test + 3.2.10.RELEASE + test + + + org.eclipse.jetty + jetty-reactive-httpclient + ${jetty-reactive-httpclient.version} + test + + @@ -101,6 +137,29 @@ JAR
+ + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-surefire-plugin + 2.22.0 + + + maven-surefire-plugin + 2.19.1 + + + org.junit.platform + junit-platform-surefire-provider + 1.0.1 + + +
@@ -110,6 +169,7 @@ 1.0 1.0 4.1 + 1.0.3 diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java new file mode 100644 index 0000000000..6b11f14734 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java @@ -0,0 +1,5 @@ +package com.baeldung.reactive.enums; + +public enum Role { + ENGINEER, SENIOR_ENGINEER, LEAD_ENGINEER +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java new file mode 100644 index 0000000000..6a8daaf6de --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java @@ -0,0 +1,64 @@ +package com.baeldung.reactive.model; + + +import com.baeldung.reactive.enums.Role; + +public class Employee { + private Integer employeeId; + private String firstName; + private String lastName; + private Integer age; + private Role role; + + public Employee() { + } + + public Employee(Integer employeeId, String firstName, String lastName, Integer age, Role role) { + this.employeeId = employeeId; + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.role = role; + } + + public Integer getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Integer employeeId) { + this.employeeId = employeeId; + } + + 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 Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Role getRole() { + return role; + } + + public void setRole(Role role) { + this.role = role; + } +} + diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java new file mode 100644 index 0000000000..b841dbfe3f --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java @@ -0,0 +1,55 @@ +package com.baeldung.reactive.service; +import com.baeldung.reactive.model.Employee; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +public class EmployeeService { + + private WebClient webClient; + public static String PATH_PARAM_BY_ID = "/employee/{id}"; + public static String ADD_EMPLOYEE = "/employee"; + + public EmployeeService(WebClient webClient) { + this.webClient = webClient; + } + + public EmployeeService(String baseUrl) { + this.webClient = WebClient.create(baseUrl); + } + + public Mono getEmployeeById(Integer employeeId) { + return webClient + .get() + .uri(PATH_PARAM_BY_ID, employeeId) + .retrieve() + .bodyToMono(Employee.class); + } + + public Mono addNewEmployee(Employee newEmployee) { + + return webClient + .post() + .uri(ADD_EMPLOYEE) + .syncBody(newEmployee) + .retrieve(). + bodyToMono(Employee.class); + } + + public Mono updateEmployee(Integer employeeId, Employee updateEmployee) { + + return webClient + .put() + .uri(PATH_PARAM_BY_ID,employeeId) + .syncBody(updateEmployee) + .retrieve() + .bodyToMono(Employee.class); + } + + public Mono deleteEmployeeById(Integer employeeId) { + return webClient + .delete() + .uri(PATH_PARAM_BY_ID,employeeId) + .retrieve() + .bodyToMono(String.class); + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java new file mode 100644 index 0000000000..9afe50af58 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java @@ -0,0 +1,68 @@ +package com.baeldung.reactive.webclient.simultaneous; + +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.core.publisher.Flux; +import reactor.core.scheduler.Schedulers; + +import java.util.List; +import java.util.logging.Logger; + +public class Client { + + private static final Logger LOG = Logger.getLogger(Client.class.getName()); + + private WebClient webClient; + + public Client(String uri) { + this.webClient = WebClient.create(uri); + } + + public Mono getUser(int id) { + LOG.info(String.format("Calling getUser(%d)", id)); + + return webClient.get() + .uri("/user/{id}", id) + .retrieve() + .bodyToMono(User.class); + } + + public Mono getItem(int id) { + return webClient.get() + .uri("/item/{id}", id) + .retrieve() + .bodyToMono(Item.class); + } + + public Mono getOtherUser(int id) { + return webClient.get() + .uri("/otheruser/{id}", id) + .retrieve() + .bodyToMono(User.class); + } + + public List fetchUsers(List userIds) { + return Flux.fromIterable(userIds) + .parallel() + .runOn(Schedulers.elastic()) + .flatMap(this::getUser) + .collectSortedList((u1, u2) -> u2.id() - u1.id()) + .block(); + } + + public List fetchUserAndOtherUser(int id) { + return Flux.merge(getUser(id), getOtherUser(id)) + .parallel() + .runOn(Schedulers.elastic()) + .collectSortedList((u1, u2) -> u2.id() - u1.id()) + .block(); + } + + public UserWithItem fetchUserAndItem(int userId, int itemId) { + Mono user = getUser(userId).subscribeOn(Schedulers.elastic()); + Mono item = getItem(itemId).subscribeOn(Schedulers.elastic()); + + return Mono.zip(user, item, UserWithItem::new) + .block(); + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Item.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Item.java new file mode 100644 index 0000000000..5b8260743b --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Item.java @@ -0,0 +1,17 @@ +package com.baeldung.reactive.webclient.simultaneous; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Item { + private int id; + + @JsonCreator + public Item(@JsonProperty("id") int id) { + this.id = id; + } + + public int id() { + return id; + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/User.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/User.java new file mode 100644 index 0000000000..0e1cc2cd76 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/User.java @@ -0,0 +1,17 @@ +package com.baeldung.reactive.webclient.simultaneous; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class User { + private int id; + + @JsonCreator + public User(@JsonProperty("id") int id) { + this.id = id; + } + + public int id() { + return id; + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/UserWithItem.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/UserWithItem.java new file mode 100644 index 0000000000..96dcfe994e --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/UserWithItem.java @@ -0,0 +1,19 @@ +package com.baeldung.reactive.webclient.simultaneous; + +public class UserWithItem { + private User user; + private Item item; + + public UserWithItem(User user, Item item) { + this.user = user; + this.item = item; + } + + public User user() { + return user; + } + + public Item item() { + return item; + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java new file mode 100644 index 0000000000..95c63f267f --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -0,0 +1,154 @@ +package com.baeldung.reactive.logging; + +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.Appender; +import com.baeldung.reactive.logging.filters.LogFilters; +import com.baeldung.reactive.logging.netty.CustomLogger; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.net.URI; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; +import org.springframework.http.client.reactive.JettyClientHttpConnector; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.netty.channel.BootstrapHandlers; +import reactor.netty.http.client.HttpClient; + +import static com.baeldung.reactive.logging.jetty.RequestLogEnhancer.enhance; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +public class WebClientLoggingIntegrationTest { + + @AllArgsConstructor + @Data + class Post { + private String title; + private String body; + private int userId; + } + + private Appender jettyAppender; + private Appender nettyAppender; + private Appender mockAppender; + private String sampleUrl = "https://jsonplaceholder.typicode.com/posts"; + + private Post post; + private String sampleResponseBody; + + @BeforeEach + private void setup() throws Exception { + + post = new Post("Learn WebClient logging with Baeldung!", "", 1); + sampleResponseBody = new ObjectMapper().writeValueAsString(post); + + ch.qos.logback.classic.Logger jetty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.reactive.logging.jetty"); + jettyAppender = mock(Appender.class); + when(jettyAppender.getName()).thenReturn("com.baeldung.reactive.logging.jetty"); + jetty.addAppender(jettyAppender); + + ch.qos.logback.classic.Logger netty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("reactor.netty.http.client"); + nettyAppender = mock(Appender.class); + when(nettyAppender.getName()).thenReturn("reactor.netty.http.client"); + netty.addAppender(nettyAppender); + + ch.qos.logback.classic.Logger test = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.reactive"); + mockAppender = mock(Appender.class); + when(mockAppender.getName()).thenReturn("com.baeldung.reactive"); + test.addAppender(mockAppender); + + } + + @Test + public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { + SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(); + org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(sslContextFactory) { + @Override + public Request newRequest(URI uri) { + Request request = super.newRequest(uri); + return enhance(request); + } + }; + + WebClient + .builder() + .clientConnector(new JettyClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verify(jettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @Test + public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .wiretap(true); + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300"))); + } + + @Test + public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .tcpConfiguration( + tc -> tc.bootstrap( + b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @Test + public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() { + WebClient + .builder() + .filters(exchangeFilterFunctions -> { + exchangeFilterFunctions.addAll(LogFilters.prepareFilters()); + }) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + + verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("domain=.typicode.com;"))); + } + + +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java new file mode 100644 index 0000000000..c1c3d3e895 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java @@ -0,0 +1,54 @@ +package com.baeldung.reactive.logging.filters; + +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import reactor.core.publisher.Mono; + +@Slf4j +public class LogFilters { + public static List prepareFilters() { + return Arrays.asList(logRequest(), logResponse()); + } + + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Request: \n") + .append(clientRequest.method()) + .append(" ") + .append(clientRequest.url()); + clientRequest + .headers() + .forEach((name, values) -> values.forEach(value -> sb + .append("\n") + .append(name) + .append(":") + .append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientRequest); + }); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Response: \n") + .append("Status: ") + .append(clientResponse.rawStatusCode()); + clientResponse + .headers() + .asHttpHeaders() + .forEach((key, value1) -> value1.forEach(value -> sb + .append("\n") + .append(key) + .append(":") + .append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientResponse); + }); + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java new file mode 100644 index 0000000000..43e3660743 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -0,0 +1,93 @@ +package com.baeldung.reactive.logging.jetty; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpHeader; + +@Slf4j +public class RequestLogEnhancer { + + public static Request enhance(Request request) { + StringBuilder group = new StringBuilder(); + request.onRequestBegin(theRequest -> group + .append("Request ") + .append(theRequest.getMethod()) + .append(" ") + .append(theRequest.getURI()) + .append("\n")); + request.onRequestHeaders(theRequest -> { + for (HttpField header : theRequest.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onRequestContent((theRequest, content) -> { + group.append(toString(content, getCharset(theRequest.getHeaders()))); + }); + request.onRequestSuccess(theRequest -> { + log.debug(group.toString()); + group.delete(0, group.length()); + }); + group.append("\n"); + request.onResponseBegin(theResponse -> { + group + .append("Response \n") + .append(theResponse.getVersion()) + .append(" ") + .append(theResponse.getStatus()); + if (theResponse.getReason() != null) { + group + .append(" ") + .append(theResponse.getReason()); + } + group.append("\n"); + }); + request.onResponseHeaders(theResponse -> { + for (HttpField header : theResponse.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onResponseContent((theResponse, content) -> { + group.append(toString(content, getCharset(theResponse.getHeaders()))); + }); + request.onResponseSuccess(theResponse -> { + log.debug(group.toString()); + }); + return request; + } + + private static String toString(ByteBuffer buffer, Charset charset) { + byte[] bytes; + if (buffer.hasArray()) { + bytes = new byte[buffer.capacity()]; + System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity()); + } else { + bytes = new byte[buffer.remaining()]; + buffer.get(bytes, 0, bytes.length); + } + return new String(bytes, charset); + } + + private static Charset getCharset(HttpFields headers) { + String contentType = headers.get(HttpHeader.CONTENT_TYPE); + if (contentType != null) { + String[] tokens = contentType + .toLowerCase(Locale.US) + .split("charset="); + if (tokens.length == 2) { + String encoding = tokens[1].replaceAll("[;\"]", ""); + return Charset.forName(encoding); + } + } + return StandardCharsets.UTF_8; + } + +} + diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java new file mode 100644 index 0000000000..9f2a4d127f --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -0,0 +1,42 @@ +package com.baeldung.reactive.logging.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.logging.LoggingHandler; +import java.nio.charset.Charset; + +import static io.netty.util.internal.PlatformDependent.allocateUninitializedArray; +import static java.lang.Math.max; +import static java.nio.charset.Charset.defaultCharset; + +public class CustomLogger extends LoggingHandler { + public CustomLogger(Class clazz) { + super(clazz); + } + + @Override + protected String format(ChannelHandlerContext ctx, String event, Object arg) { + if (arg instanceof ByteBuf) { + ByteBuf msg = (ByteBuf) arg; + return decode(msg, msg.readerIndex(), msg.readableBytes(), defaultCharset()); + } + return super.format(ctx, event, arg); + } + + private String decode(ByteBuf src, int readerIndex, int len, Charset charset) { + if (len != 0) { + byte[] array; + int offset; + if (src.hasArray()) { + array = src.array(); + offset = src.arrayOffset() + readerIndex; + } else { + array = allocateUninitializedArray(max(len, 1024)); + offset = 0; + src.getBytes(readerIndex, array, 0, len); + } + return new String(array, offset, len, charset); + } + return ""; + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java new file mode 100644 index 0000000000..f5d9529ada --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java @@ -0,0 +1,121 @@ +package com.baeldung.reactive.service; + +import com.baeldung.reactive.model.Employee; +import com.baeldung.reactive.enums.Role; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Rule; +import org.junit.jupiter.api.*; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class EmployeeServiceIntegrationTest { + + public static MockWebServer mockBackEnd; + private EmployeeService employeeService; + private ObjectMapper MAPPER = new ObjectMapper(); + + @BeforeAll + static void setUp() throws IOException { + mockBackEnd = new MockWebServer(); + mockBackEnd.start(); + } + + @AfterAll + static void tearDown() throws IOException { + mockBackEnd.shutdown(); + } + + @BeforeEach + void initialize() { + + String baseUrl = String.format("http://localhost:%s", mockBackEnd.getPort()); + employeeService = new EmployeeService(baseUrl); + } + + @Test + void getEmployeeById() throws Exception { + + Employee mockEmployee = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(mockEmployee)) + .addHeader("Content-Type", "application/json")); + + Mono employeeMono = employeeService.getEmployeeById(100); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getRole().equals(Role.LEAD_ENGINEER)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + } + + @Test + void addNewEmployee() throws Exception { + + Employee newEmployee = new Employee(null, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + Employee webClientResponse = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(webClientResponse)) + .addHeader("Content-Type", "application/json")); + + Mono employeeMono = employeeService.addNewEmployee(newEmployee); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getEmployeeId().equals(100)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + assertEquals("/employee", recordedRequest.getPath()); + } + + @Test + void updateEmployee() throws Exception { + + Integer newAge = 33; + String newLastName = "Sandler New"; + Employee updateEmployee = new Employee(100, "Adam", newLastName, newAge, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(updateEmployee)) + .addHeader("Content-Type", "application/json")); + + Mono updatedEmploye = employeeService.updateEmployee(100, updateEmployee); + + StepVerifier.create(updatedEmploye) + .expectNextMatches(employee -> employee.getLastName().equals(newLastName) && employee.getAge() == newAge) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("PUT", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + + } + + + @Test + void deleteEmployee() throws Exception { + + String responseMessage = "Employee Deleted SuccessFully"; + Integer employeeId = 100; + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(responseMessage)) + .addHeader("Content-Type", "application/json")); + + Mono deletedEmployee = employeeService.deleteEmployeeById(employeeId); + + StepVerifier.create(deletedEmployee) + .expectNext("\"Employee Deleted SuccessFully\"") + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("DELETE", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + } + +} \ No newline at end of file diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java new file mode 100644 index 0000000000..1d1a8fd2e4 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java @@ -0,0 +1,114 @@ +package com.baeldung.reactive.service; + + +import com.baeldung.reactive.model.Employee; +import com.baeldung.reactive.enums.Role; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.exceptions.base.MockitoException; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class EmployeeServiceUnitTest { + + EmployeeService employeeService; + @Mock + private WebClient webClientMock; + @Mock + private WebClient.RequestHeadersSpec requestHeadersMock; + @Mock + private WebClient.RequestHeadersUriSpec requestHeadersUriMock; + @Mock + private WebClient.RequestBodySpec requestBodyMock; + @Mock + private WebClient.RequestBodyUriSpec requestBodyUriMock; + @Mock + private WebClient.ResponseSpec responseMock; + + @BeforeEach + void setUp() { + employeeService = new EmployeeService(webClientMock); + } + + @Test + void givenEmployeeId_whenGetEmployeeById_thenReturnEmployee() { + + Integer employeeId = 100; + Employee mockEmployee = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + when(webClientMock.get()).thenReturn(requestHeadersUriMock); + when(requestHeadersUriMock.uri("/employee/{id}", employeeId)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(mockEmployee)); + + Mono employeeMono = employeeService.getEmployeeById(employeeId); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getRole().equals(Role.LEAD_ENGINEER)) + .verifyComplete(); + } + + @Test + void givenEmployee_whenAddEmployee_thenAddNewEmployee() { + + Employee newEmployee = new Employee(null, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + Employee webClientResponse = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + when(webClientMock.post()).thenReturn(requestBodyUriMock); + when(requestBodyUriMock.uri(EmployeeService.ADD_EMPLOYEE)).thenReturn(requestBodyMock); + when(requestBodyMock.syncBody(newEmployee)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(webClientResponse)); + + Mono employeeMono = employeeService.addNewEmployee(newEmployee); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getEmployeeId().equals(100)) + .verifyComplete(); + } + + @Test + void givenEmployee_whenupdateEmployee_thenUpdatedEmployee() { + + Integer newAge = 33; + String newLastName = "Sandler New"; + Employee updateEmployee = new Employee(100, "Adam", newLastName, newAge, Role.LEAD_ENGINEER); + when(webClientMock.put()).thenReturn(requestBodyUriMock); + when(requestBodyUriMock.uri(EmployeeService.PATH_PARAM_BY_ID, 100)).thenReturn(requestBodyMock); + when(requestBodyMock.syncBody(updateEmployee)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(updateEmployee)); + + Mono updatedEmployee = employeeService.updateEmployee(100, updateEmployee); + + StepVerifier.create(updatedEmployee) + .expectNextMatches(employee -> employee.getLastName().equals(newLastName) && employee.getAge() == newAge) + .verifyComplete(); + + } + + @Test + void givenEmployee_whenDeleteEmployeeById_thenDeleteSuccessful() { + + String responseMessage = "Employee Deleted SuccessFully"; + when(webClientMock.delete()).thenReturn(requestHeadersUriMock); + when(requestHeadersUriMock.uri(EmployeeService.PATH_PARAM_BY_ID, 100)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(String.class)).thenReturn(Mono.just(responseMessage)); + + Mono deletedEmployee = employeeService.deleteEmployeeById(100); + + StepVerifier.create(deletedEmployee) + .expectNext(responseMessage) + .verifyComplete(); + } +} \ No newline at end of file diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java new file mode 100644 index 0000000000..0acedf15b0 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java @@ -0,0 +1,68 @@ +package com.baeldung.reactive.webclient.simultaneous; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import com.github.tomakehurst.wiremock.WireMockServer; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ClientIntegrationTest { + + private WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(wireMockConfig().port(8089)); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + } + + @After + public void tearDown() { + wireMockServer.stop(); + } + + @Test + public void givenClient_whenFetchingUsers_thenExecutionTimeIsLessThanDouble() { + // Arrange + int requestsNumber = 5; + int singleRequestTime = 1000; + + for (int i = 1; i <= requestsNumber; i++) { + stubFor(get(urlEqualTo("/user/" + i)).willReturn(aResponse().withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(String.format("{ \"id\": %d }", i)))); + } + + List userIds = IntStream.rangeClosed(1, requestsNumber) + .boxed() + .collect(Collectors.toList()); + + Client client = new Client("http://localhost:8089"); + + // Act + long start = System.currentTimeMillis(); + List users = client.fetchUsers(userIds); + long end = System.currentTimeMillis(); + + // Assert + long totalExecutionTime = end - start; + + assertEquals("Unexpected number of users", requestsNumber, users.size()); + assertTrue("Execution time is too big", 2 * singleRequestTime > totalExecutionTime); + } +} diff --git a/spring-5-reactive-client/src/test/resources/logback-test.xml b/spring-5-reactive-client/src/test/resources/logback-test.xml index 7072369b8d..42cb0865c5 100644 --- a/spring-5-reactive-client/src/test/resources/logback-test.xml +++ b/spring-5-reactive-client/src/test/resources/logback-test.xml @@ -6,11 +6,15 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + + + + + - + \ No newline at end of file diff --git a/spring-5-reactive-oauth/README.md b/spring-5-reactive-oauth/README.md index ec5176670b..3fddbf4a36 100644 --- a/spring-5-reactive-oauth/README.md +++ b/spring-5-reactive-oauth/README.md @@ -1,3 +1,7 @@ +## Spring 5 Reactive OAuth + +This module contains articles about reactive Spring 5 OAuth + ### Relevant Articles: - [Spring Security OAuth Login with WebFlux](https://www.baeldung.com/spring-oauth-login-webflux) diff --git a/spring-5-reactive-security/README.md b/spring-5-reactive-security/README.md index 845d07cd7f..4ea6fb644f 100644 --- a/spring-5-reactive-security/README.md +++ b/spring-5-reactive-security/README.md @@ -1,11 +1,13 @@ ## Spring 5 Reactive Security Examples +This module contains articles about reactive Spring Security 5 + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Spring Boot Actuator](http://www.baeldung.com/spring-boot-actuators) -- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) -- [Guide to Spring 5 WebFlux](http://www.baeldung.com/spring-webflux) +- [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) +- [Spring Security 5 for Reactive Applications](https://www.baeldung.com/spring-security-5-reactive) +- [Guide to Spring 5 WebFlux](https://www.baeldung.com/spring-webflux) - [Introduction to the Functional Web Framework in Spring 5](https://www.baeldung.com/spring-5-functional-web) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 538a15c879..41d831632a 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -1,22 +1,20 @@ ## Spring 5 Reactive Project +This module contains articles about reactive Spring 5 + ### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +The "REST With Spring" Classes: https://bit.ly/restwithspring ### Relevant Articles -- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) -- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) -- [Exploring the Spring 5 WebFlux URL Matching](http://www.baeldung.com/spring-5-mvc-url-matching) -- [Reactive WebSockets with Spring 5](http://www.baeldung.com/spring-5-reactive-websockets) -- [Spring Webflux Filters](http://www.baeldung.com/spring-webflux-filters) -- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header) -- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors) -- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors) +- [Introduction to the Functional Web Framework in Spring 5](https://www.baeldung.com/spring-5-functional-web) +- [Spring 5 WebClient](https://www.baeldung.com/spring-5-webclient) +- [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) +- [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) +- [Spring Webflux Filters](https://www.baeldung.com/spring-webflux-filters) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) +- [Spring Webflux and CORS](https://www.baeldung.com/spring-webflux-cors) +- [Handling Errors in Spring WebFlux](https://www.baeldung.com/spring-webflux-errors) - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) -- [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) -- [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) -- [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) -- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) +- More articles: [[next -->]](/spring-5-reactive-2) diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index 99cdd11f24..e6690baf54 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -29,11 +29,6 @@ org.springframework.boot spring-boot-starter-webflux - - org.projectreactor - reactor-spring - ${reactor-spring.version} - javax.json.bind javax.json.bind-api @@ -112,18 +107,10 @@ io.reactivex.rxjava2 rxjava - ${rxjava-version} - - - io.projectreactor - reactor-test - ${project-reactor-test} - test org.apache.httpcomponents httpclient - ${httpclient.version} @@ -165,13 +152,10 @@ 1.0.1.RELEASE - 2.1.12 1.1.3 1.0 1.0 4.1 - 3.2.3.RELEASE - 4.5.8 diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java index 42da90ecd5..3bbbed0d77 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java @@ -12,11 +12,13 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@DirtiesContext @WithMockUser @AutoConfigureWebTestClient(timeout = "10000") public class ErrorHandlingIntegrationTest { diff --git a/spring-5-security-cognito/README.md b/spring-5-security-cognito/README.md index 0825882c05..ff2784f410 100644 --- a/spring-5-security-cognito/README.md +++ b/spring-5-security-cognito/README.md @@ -1,3 +1,7 @@ +## Spring 5 Security Cognito + +This module contains articles about Spring 5 with Amazon Cognito + ## Relevant articles: - [Authenticating with Amazon Cognito Using Spring Security](https://www.baeldung.com/spring-security-oauth-cognito) diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md index a5cec370c7..43cab33598 100644 --- a/spring-5-security-oauth/README.md +++ b/spring-5-security-oauth/README.md @@ -1,5 +1,9 @@ +## Spring 5 Security OAuth + +This module contains articles about Spring 5 OAuth Security + ## Relevant articles: -- [Spring Security 5 – OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) +- [Spring Security 5 – OAuth2 Login](https://www.baeldung.com/spring-security-5-oauth2-login) - [Extracting Principal and Authorities using Spring Security OAuth](https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor) - [Customizing Authorization and Token Requests with Spring Security 5.1 Client](https://www.baeldung.com/spring-security-custom-oauth-requests) diff --git a/spring-5-security/README.md b/spring-5-security/README.md index 37dc8b0f28..4cace0db8d 100644 --- a/spring-5-security/README.md +++ b/spring-5-security/README.md @@ -1,7 +1,11 @@ +## Spring 5 Security + +This module contains articles about Spring Security 5 + ## Relevant articles: -- [Extra Login Fields with Spring Security](http://www.baeldung.com/spring-security-extra-login-fields) -- [A Custom Spring SecurityConfigurer](http://www.baeldung.com/spring-security-custom-configurer) -- [New Password Storage In Spring Security 5](http://www.baeldung.com/spring-security-5-password-storage) +- [Extra Login Fields with Spring Security](https://www.baeldung.com/spring-security-extra-login-fields) +- [A Custom Spring SecurityConfigurer](https://www.baeldung.com/spring-security-custom-configurer) +- [New Password Storage In Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage) - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder) diff --git a/spring-5-webflux/README.md b/spring-5-webflux/README.md index 87d9ae0dd3..55ab0b8af4 100644 --- a/spring-5-webflux/README.md +++ b/spring-5-webflux/README.md @@ -1,3 +1,7 @@ +## Spring 5 WebFlux + +This module contains articles about Spring 5 WebFlux + ## Relevant articles: - [Spring Boot Reactor Netty Configuration](https://www.baeldung.com/spring-boot-reactor-netty) diff --git a/spring-5/README.md b/spring-5/README.md index d3c1decbc7..7588d23304 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -1,16 +1,18 @@ -## Spring REST Example Project +## Spring 5 + +This module contains articles about Spring 5 ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) -- [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) -- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) -- [Spring 5 Testing with @EnabledIf Annotation](http://www.baeldung.com/spring-5-enabledIf) -- [Introduction to Spring REST Docs](http://www.baeldung.com/spring-rest-docs) -- [Spring ResponseStatusException](http://www.baeldung.com/spring-response-status-exception) -- [Spring Assert Statements](http://www.baeldung.com/spring-assert) +- [Concurrent Test Execution in Spring 5](https://www.baeldung.com/spring-5-concurrent-tests) +- [Spring 5 Functional Bean Registration](https://www.baeldung.com/spring-5-functional-beans) +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](https://www.baeldung.com/spring-5-junit-config) +- [Spring 5 Testing with @EnabledIf Annotation](https://www.baeldung.com/spring-5-enabledIf) +- [Introduction to Spring REST Docs](https://www.baeldung.com/spring-rest-docs) +- [Spring ResponseStatusException](https://www.baeldung.com/spring-response-status-exception) +- [Spring Assert Statements](https://www.baeldung.com/spring-assert) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) diff --git a/spring-5/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java b/spring-5/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java similarity index 89% rename from spring-5/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java rename to spring-5/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java index 0bd8637681..7f8736ae87 100644 --- a/spring-5/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java +++ b/spring-5/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-5/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java b/spring-5/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java similarity index 94% rename from spring-5/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java rename to spring-5/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java index d91cca85ee..0c4b91bd8a 100644 --- a/spring-5/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import static org.junit.Assert.*; diff --git a/spring-activiti/README.md b/spring-activiti/README.md index 703dfeec52..f4e788492b 100644 --- a/spring-activiti/README.md +++ b/spring-activiti/README.md @@ -1,6 +1,10 @@ +## Spring Activiti + +This module contains articles about Spring with Activiti + ### Relevant articles -- [A Guide to Activiti with Java](http://www.baeldung.com/java-activiti) -- [Introduction to Activiti with Spring](http://www.baeldung.com/spring-activiti) -- [Activiti with Spring Security](http://www.baeldung.com/activiti-spring-security) -- [ProcessEngine Configuration in Activiti](http://www.baeldung.com/activiti-process-engine) +- [A Guide to Activiti with Java](https://www.baeldung.com/java-activiti) +- [Introduction to Activiti with Spring](https://www.baeldung.com/spring-activiti) +- [Activiti with Spring Security](https://www.baeldung.com/activiti-spring-security) +- [ProcessEngine Configuration in Activiti](https://www.baeldung.com/activiti-process-engine) diff --git a/spring-akka/README.md b/spring-akka/README.md index 0f1c013214..c7db5d5c01 100644 --- a/spring-akka/README.md +++ b/spring-akka/README.md @@ -1,2 +1,6 @@ +## Spring Akka + +This module contains articles about Spring with Akka + ### Relevant Articles: -- [Introduction to Spring with Akka](http://www.baeldung.com/akka-with-spring) +- [Introduction to Spring with Akka](https://www.baeldung.com/akka-with-spring) diff --git a/spring-all/src/main/java/org/baeldung/scopes/ScopesConfig.java b/spring-all/src/main/java/org/baeldung/scopes/ScopesConfig.java new file mode 100644 index 0000000000..11d3806b6e --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/scopes/ScopesConfig.java @@ -0,0 +1,61 @@ +package org.baeldung.scopes; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.web.servlet.view.UrlBasedViewResolver; + +@Configuration +@ComponentScan("org.baeldung.scopes") +@EnableWebMvc +public class ScopesConfig { + @Bean + public UrlBasedViewResolver setupViewResolver() { + final UrlBasedViewResolver resolver = new UrlBasedViewResolver(); + resolver.setPrefix("/WEB-INF/view/"); + resolver.setSuffix(".jsp"); + resolver.setViewClass(JstlView.class); + return resolver; + } + + @Bean + @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) + public HelloMessageGenerator requestScopedBean() { + return new HelloMessageGenerator(); + } + + @Bean + @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) + public HelloMessageGenerator sessionScopedBean() { + return new HelloMessageGenerator(); + } + + @Bean + @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) + public HelloMessageGenerator applicationScopedBean() { + return new HelloMessageGenerator(); + } + + @Bean + @Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS) + public HelloMessageGenerator websocketScopedBean() { + return new HelloMessageGenerator(); + } + + @Bean + @Scope("prototype") + public Person personPrototype() { + return new Person(); + } + + @Bean + @Scope("singleton") + public Person personSingleton() { + return new Person(); + } +} diff --git a/spring-amqp/README.md b/spring-amqp/README.md index 5e29011995..0ae4eda12e 100644 --- a/spring-amqp/README.md +++ b/spring-amqp/README.md @@ -1,3 +1,7 @@ +## Spring AMQP + +This module contains articles about Spring with the AMQP messaging system + ## Relevant articles: - [Messaging With Spring AMQP](https://www.baeldung.com/spring-amqp) diff --git a/spring-aop/README.md b/spring-aop/README.md index af8ab71da0..061e736d31 100644 --- a/spring-aop/README.md +++ b/spring-aop/README.md @@ -1,6 +1,10 @@ +## Spring AOP + +This module contains articles about Spring aspect oriented programming (AOP) + ### Relevant articles -- [Implementing a Custom Spring AOP Annotation](http://www.baeldung.com/spring-aop-annotation) -- [Intro to AspectJ](http://www.baeldung.com/aspectj) -- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) -- [Introduction to Spring AOP](http://www.baeldung.com/spring-aop) +- [Implementing a Custom Spring AOP Annotation](https://www.baeldung.com/spring-aop-annotation) +- [Intro to AspectJ](https://www.baeldung.com/aspectj) +- [Spring Performance Logging](https://www.baeldung.com/spring-performance-logging) +- [Introduction to Spring AOP](https://www.baeldung.com/spring-aop) diff --git a/spring-apache-camel/README.md b/spring-apache-camel/README.md index e72e18b198..e89eb4fe6c 100644 --- a/spring-apache-camel/README.md +++ b/spring-apache-camel/README.md @@ -1,35 +1,26 @@ +## Spring Apache Camel -

Configure and Use Apache Camel with Spring

+This module contains articles about Spring with Apache Camel -This article will demonstrate how to configure and use Apache Camel with Spring Framework. +### Relevant Articles -

Relevant Articles

+- [Apache Camel](http://camel.apache.org/) +- [Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html) +- [Introduction To Apache Camel](http://www.baeldung.com/apache-camel-intro) +- [Integration Patterns With Apache Camel](http://www.baeldung.com/camel-integration-patterns) +- [Using Apache Camel with Spring](http://www.baeldung.com/spring-apache-camel-tutorial) - +### Framework Versions: -

Framework Versions:

+- Spring 4.2.4 +- Apache Camel 2.16.1 -
    -
  • Spring 4.2.4
  • -
  • Apache Camel 2.16.1
  • -
+### Build and Run Application -

Build and Run Application

+To build this application execute: -To build this application execute following maven command in ApacheCamelFileProcessor directory. - -mvn clean install +`mvn clean install` To run this application you can either run our main class App from your IDE or you can execute following maven command: -mvn exec:java -Dexec.mainClass="App" - -

Relevant Articles on Baeldung

- +`mvn exec:java -Dexec.mainClass="com.baeldung.camel.main.App"` \ No newline at end of file diff --git a/spring-batch/README.md b/spring-batch/README.md index ddd830cd47..95abbaf931 100644 --- a/spring-batch/README.md +++ b/spring-batch/README.md @@ -1,10 +1,9 @@ -========= - ## Spring Batch +This module contains articles about Spring Batch ### Relevant Articles: -- [Introduction to Spring Batch](http://www.baeldung.com/introduction-to-spring-batch) -- [Spring Batch using Partitioner](http://www.baeldung.com/spring-batch-partitioner) -- [Spring Batch – Tasklets vs Chunks](http://www.baeldung.com/spring-batch-tasklet-chunk) -- [How to Trigger and Stop a Scheduled Spring Batch Job](http://www.baeldung.com/spring-batch-start-stop-job) +- [Introduction to Spring Batch](https://www.baeldung.com/introduction-to-spring-batch) +- [Spring Batch using Partitioner](https://www.baeldung.com/spring-batch-partitioner) +- [Spring Batch – Tasklets vs Chunks](https://www.baeldung.com/spring-batch-tasklet-chunk) +- [How to Trigger and Stop a Scheduled Spring Batch Job](https://www.baeldung.com/spring-batch-start-stop-job) diff --git a/spring-bom/README.md b/spring-bom/README.md index d056216a2e..0866582fb2 100644 --- a/spring-bom/README.md +++ b/spring-bom/README.md @@ -1,3 +1,6 @@ +## Spring BOM + +This module contains articles about Spring with Maven BOM (Bill Of Materials) ### Relevant Articles: -- [Spring with Maven BOM](http://www.baeldung.com/spring-maven-bom) +- [Spring with Maven BOM](https://www.baeldung.com/spring-maven-bom) diff --git a/spring-boot-admin/README.md b/spring-boot-admin/README.md index 73ce857059..ac4d781d0e 100644 --- a/spring-boot-admin/README.md +++ b/spring-boot-admin/README.md @@ -1,3 +1,7 @@ +## Spring Boot Admin + +This module contains articles about Spring Boot Admin + ## 1. Spring Boot Admin Server * mvn clean install @@ -19,4 +23,4 @@ and the mail configuration from application.properties ### Relevant Articles: -- [A Guide to Spring Boot Admin](http://www.baeldung.com/spring-boot-admin) +- [A Guide to Spring Boot Admin](https://www.baeldung.com/spring-boot-admin) diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml index 23852dee57..1c933723e7 100644 --- a/spring-boot-admin/pom.xml +++ b/spring-boot-admin/pom.xml @@ -30,7 +30,7 @@ - 1.5.8.RELEASE + 2.1.8.RELEASE \ No newline at end of file diff --git a/spring-boot-admin/spring-boot-admin-client/pom.xml b/spring-boot-admin/spring-boot-admin-client/pom.xml index 7563a01172..aa2daf8d45 100644 --- a/spring-boot-admin/spring-boot-admin-client/pom.xml +++ b/spring-boot-admin/spring-boot-admin-client/pom.xml @@ -18,7 +18,7 @@ org.springframework.boot - spring-boot-starter + spring-boot-starter-web org.springframework.boot @@ -59,7 +59,7 @@
- 1.5.4 + 2.1.6 2.0.4.RELEASE diff --git a/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties b/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties index 58c178ecd9..ff4b1e3255 100644 --- a/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties +++ b/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties @@ -1,16 +1,20 @@ #basic auth creddentials -security.user.name=client -security.user.password=client +spring.security.user.name=client +spring.security.user.password=client #configs to connect to a secured server -spring.boot.admin.url=http://localhost:8080 -spring.boot.admin.username=admin -spring.boot.admin.password=admin +spring.boot.admin.client.url=http://localhost:8080 +#spring.boot.admin.client.instance.service-base-url=http://localhost:8081 +spring.boot.admin.client.username=admin +spring.boot.admin.client.password=admin #configs to give secured server info -spring.boot.admin.client.metadata.user.name=${security.user.name} -spring.boot.admin.client.metadata.user.password=${security.user.password} +spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} +spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password} #app config spring.application.name=spring-boot-admin-client -server.port=8081 \ No newline at end of file +server.port=8081 + +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always \ No newline at end of file diff --git a/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java b/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java index 0201deabca..f9e969c06a 100644 --- a/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.assertEquals; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT) @@ -36,20 +36,20 @@ public class SpringBootAdminClientApplicationIntegrationTest { @Test public void whenEnvironmentAvailable_ThenAdminServerPropertiesExist() { - assertEquals(environment.getProperty("spring.boot.admin.url"), "http://localhost:8080"); - assertEquals(environment.getProperty("spring.boot.admin.username"), "admin"); - assertEquals(environment.getProperty("spring.boot.admin.password"), "admin"); + assertEquals(environment.getProperty("spring.boot.admin.client.url"), "http://localhost:8080"); + assertEquals(environment.getProperty("spring.boot.admin.client.username"), "admin"); + assertEquals(environment.getProperty("spring.boot.admin.client.password"), "admin"); } @Test public void whenHttpBasicAttempted_ThenSuccess() throws Exception { - mockMvc.perform(get("/env").with(httpBasic("client", "client"))); + mockMvc.perform(get("/actuator/env").with(httpBasic("client", "client"))); } @Test public void whenInvalidHttpBasicAttempted_ThenUnauthorized() throws Exception { mockMvc - .perform(get("/env").with(httpBasic("client", "invalid"))) - .andExpect(status().isUnauthorized()); + .perform(get("/actuator/env").with(httpBasic("client", "invalid"))) + .andExpect(unauthenticated()); } } diff --git a/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-admin/spring-boot-admin-server/pom.xml index d429d9289f..5ef99976c8 100644 --- a/spring-boot-admin/spring-boot-admin-server/pom.xml +++ b/spring-boot-admin/spring-boot-admin-server/pom.xml @@ -18,18 +18,14 @@ org.springframework.boot - spring-boot-starter + spring-boot-starter-web + de.codecentric - spring-boot-admin-server - ${spring-boot-admin-server.version} - - - de.codecentric - spring-boot-admin-server-ui + spring-boot-admin-starter-server ${spring-boot-admin-server.version} @@ -37,7 +33,7 @@ de.codecentric spring-boot-admin-server-ui-login - ${spring-boot-admin-server.version} + ${spring-boot-admin-server-ui-login.version} org.springframework.boot @@ -47,6 +43,7 @@ com.hazelcast hazelcast + de.codecentric @@ -54,10 +51,12 @@ ${spring-boot-admin-starter-client.version} - - - - + + + org.springframework.boot + spring-boot-starter-mail + + org.springframework.boot spring-boot-starter-test @@ -82,8 +81,9 @@
- 1.5.4 - 1.5.4 + 2.1.6 + 2.1.6 + 1.5.7 2.0.4.RELEASE diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java index d1fb4e769b..e934086cf4 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java @@ -1,6 +1,6 @@ package com.baeldung.springbootadminserver; -import de.codecentric.boot.admin.config.EnableAdminServer; +import de.codecentric.boot.admin.server.config.EnableAdminServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java index b19b7820af..d38b0e933c 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java @@ -2,8 +2,14 @@ package com.baeldung.springbootadminserver.configs; import com.hazelcast.config.Config; import com.hazelcast.config.EvictionPolicy; -import com.hazelcast.config.ListConfig; +import com.hazelcast.config.InMemoryFormat; import com.hazelcast.config.MapConfig; +import com.hazelcast.config.MergePolicyConfig; +import com.hazelcast.config.TcpIpConfig; +import com.hazelcast.map.merge.PutIfAbsentMapMergePolicy; + +import java.util.Collections; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -12,13 +18,30 @@ public class HazelcastConfig { @Bean public Config hazelcast() { - return new Config() - .setProperty("hazelcast.jmx", "true") - .addMapConfig(new MapConfig("spring-boot-admin-application-store") + MapConfig eventStoreMap = new MapConfig("spring-boot-admin-event-store").setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) - .setEvictionPolicy(EvictionPolicy.NONE)) - .addListConfig(new ListConfig("spring-boot-admin-event-store") + .setEvictionPolicy(EvictionPolicy.NONE) + .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100)); + + MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store").setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) - .setMaxSize(1000)); + .setEvictionPolicy(EvictionPolicy.LRU) + .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100)); + + Config config = new Config(); + config.addMapConfig(eventStoreMap); + config.addMapConfig(sentNotificationsMap); + config.setProperty("hazelcast.jmx", "true"); + + config.getNetworkConfig() + .getJoin() + .getMulticastConfig() + .setEnabled(false); + TcpIpConfig tcpIpConfig = config.getNetworkConfig() + .getJoin() + .getTcpIpConfig(); + tcpIpConfig.setEnabled(true); + tcpIpConfig.setMembers(Collections.singletonList("127.0.0.1")); + return config; } } diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java index 10a31464ab..f9abee11b7 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java @@ -1,42 +1,48 @@ package com.baeldung.springbootadminserver.configs; -import de.codecentric.boot.admin.notify.LoggingNotifier; -import de.codecentric.boot.admin.notify.RemindingNotifier; -import de.codecentric.boot.admin.notify.filter.FilteringNotifier; +import java.time.Duration; +import java.util.Collections; +import java.util.List; + +import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; -import java.util.concurrent.TimeUnit; +import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.notify.CompositeNotifier; +import de.codecentric.boot.admin.server.notify.LoggingNotifier; +import de.codecentric.boot.admin.server.notify.Notifier; +import de.codecentric.boot.admin.server.notify.RemindingNotifier; +import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; @Configuration -@EnableScheduling public class NotifierConfiguration { + private final InstanceRepository repository; + private final ObjectProvider> otherNotifiers; - // @Autowired private Notifier notifier; - - @Bean - public LoggingNotifier notifier() { - return new LoggingNotifier(); + public NotifierConfiguration(InstanceRepository repository, ObjectProvider> otherNotifiers) { + this.repository = repository; + this.otherNotifiers = otherNotifiers; } @Bean public FilteringNotifier filteringNotifier() { - return new FilteringNotifier(notifier()); + CompositeNotifier delegate = new CompositeNotifier(this.otherNotifiers.getIfAvailable(Collections::emptyList)); + return new FilteringNotifier(delegate, this.repository); } @Bean - @Primary - public RemindingNotifier remindingNotifier() { - RemindingNotifier remindingNotifier = new RemindingNotifier(filteringNotifier()); - remindingNotifier.setReminderPeriod(TimeUnit.MINUTES.toMillis(5)); - return remindingNotifier; + public LoggingNotifier notifier() { + return new LoggingNotifier(repository); } - @Scheduled(fixedRate = 60_000L) - public void remind() { - remindingNotifier().sendReminders(); + @Primary + @Bean(initMethod = "start", destroyMethod = "stop") + public RemindingNotifier remindingNotifier() { + RemindingNotifier remindingNotifier = new RemindingNotifier(filteringNotifier(), repository); + remindingNotifier.setReminderPeriod(Duration.ofMinutes(5)); + remindingNotifier.setCheckReminderInverval(Duration.ofSeconds(60)); + return remindingNotifier; } } diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java index 4a7c8330b7..1943c61ff4 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java @@ -1,33 +1,58 @@ package com.baeldung.springbootadminserver.configs; +import java.util.UUID; + import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import de.codecentric.boot.admin.server.config.AdminServerProperties; @Configuration +@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + private final AdminServerProperties adminServer; + + public WebSecurityConfig(AdminServerProperties adminServer) { + this.adminServer = adminServer; + } @Override protected void configure(HttpSecurity http) throws Exception { - http - .formLogin() - .loginPage("/login.html") - .loginProcessingUrl("/login") - .permitAll(); - http - .logout() - .logoutUrl("/logout"); - http - .csrf() - .disable(); - http - .authorizeRequests() - .antMatchers("/login.html", "/**/*.css", "/img/**", "/third-party/**") - .permitAll(); - http - .authorizeRequests() - .antMatchers("/**") - .authenticated(); - http.httpBasic(); + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(this.adminServer.getContextPath() + "/"); + + http.authorizeRequests() + .antMatchers(this.adminServer.getContextPath() + "/assets/**") + .permitAll() + .antMatchers(this.adminServer.getContextPath() + "/login") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage(this.adminServer.getContextPath() + "/login") + .successHandler(successHandler) + .and() + .logout() + .logoutUrl(this.adminServer.getContextPath() + "/logout") + .and() + .httpBasic() + .and() + .csrf() + .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) + .ignoringRequestMatchers(new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances", HttpMethod.POST.toString()), new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances/*", HttpMethod.DELETE.toString()), + new AntPathRequestMatcher(this.adminServer.getContextPath() + "/actuator/**")) + .and() + .rememberMe() + .key(UUID.randomUUID() + .toString()) + .tokenValiditySeconds(1209600); } } diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties b/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties index 362f6428e8..273c11468c 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties +++ b/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties @@ -1,26 +1,29 @@ spring.application.name=spring-boot-admin-server -security.user.name=admin -security.user.password=admin +spring.security.user.name=admin +spring.security.user.password=admin #configs to connect to self register the admin server as a client -spring.boot.admin.url=http://localhost:8080 -spring.boot.admin.username=${security.user.name} -spring.boot.admin.password=${security.user.password} +spring.boot.admin.client.url=http://localhost:8080 +spring.boot.admin.client.username=${spring.security.user.name} +spring.boot.admin.client.password=${spring.security.user.password} #configs to give secured server info -spring.boot.admin.client.metadata.user.name=${security.user.name} -spring.boot.admin.client.metadata.user.password=${security.user.password} +spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} +spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password} + +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always #mail notifications -#spring.mail.host=smtp.gmail.com -#spring.mail.username=test@gmail.com -#spring.mail.password=password -#spring.mail.port=587 -#spring.mail.properties.mail.smtp.auth=true -#spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.host= +spring.mail.username= +spring.mail.password= +spring.mail.port= +spring.mail.properties.mail.smtp.auth= +spring.mail.properties.mail.smtp.starttls.enable= -#spring.boot.admin.notify.mail.to=test@gmail.com +spring.boot.admin.notify.mail.to= #hipchat notifications #spring.boot.admin.notify.hipchat.auth-token= diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java index 465d079ac3..eca83b6f6c 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java @@ -1,9 +1,8 @@ package com.baeldung.springbootadminserver; -import com.baeldung.springbootadminserver.configs.NotifierConfiguration; -import de.codecentric.boot.admin.notify.Notifier; -import de.codecentric.boot.admin.notify.RemindingNotifier; -import de.codecentric.boot.admin.notify.filter.FilteringNotifier; +import static org.junit.Assert.assertNotEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -11,11 +10,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner; -import static org.junit.Assert.assertNotEquals; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; +import com.baeldung.springbootadminserver.configs.NotifierConfiguration; + +import de.codecentric.boot.admin.server.notify.Notifier; +import de.codecentric.boot.admin.server.notify.RemindingNotifier; +import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; @RunWith(SpringRunner.class) -@SpringBootTest(classes = { NotifierConfiguration.class }, webEnvironment = NONE) +@SpringBootTest(classes = { NotifierConfiguration.class, SpringBootAdminServerApplication.class }, webEnvironment = NONE) public class NotifierConfigurationIntegrationTest { @Autowired private ApplicationContext applicationContext; diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java index 0c0695e6c2..e5018f5f5f 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java @@ -14,6 +14,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -51,21 +52,21 @@ public class WebSecurityConfigIntegrationTest { .password("admin")); mockMvc - .perform(get("/api/applications/")) + .perform(get("/applications/")) .andExpect(status().is2xxSuccessful()); } @Test public void whenHttpBasicAttempted_ThenSuccess() throws Exception { - mockMvc.perform(get("/env").with(httpBasic("admin", "admin"))); + mockMvc.perform(get("/actuator/env").with(httpBasic("admin", "admin"))); } @Test public void whenInvalidHttpBasicAttempted_ThenUnauthorized() throws Exception { mockMvc - .perform(get("/env").with(httpBasic("admin", "invalid"))) - .andExpect(status().isUnauthorized()); + .perform(get("/actuator/env").with(httpBasic("admin", "invalid"))) + .andExpect(unauthenticated()); } } diff --git a/spring-boot-angular-ecommerce/README.md b/spring-boot-angular-ecommerce/README.md deleted file mode 100644 index c6564643e2..0000000000 --- a/spring-boot-angular-ecommerce/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [A Simple E-Commerce Implementation with Spring](https://www.baeldung.com/spring-angular-ecommerce) diff --git a/spring-boot-angular-ecommerce/pom.xml b/spring-boot-angular-ecommerce/pom.xml deleted file mode 100644 index 510e6c6ec3..0000000000 --- a/spring-boot-angular-ecommerce/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - 4.0.0 - spring-boot-angular-ecommerce - 0.0.1-SNAPSHOT - spring-boot-angular-ecommerce - jar - Spring Boot Angular E-commerce Appliciation - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring.boot.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring.boot.version} - - - org.springframework.boot - spring-boot-devtools - ${spring.boot.version} - runtime - - - com.h2database - h2 - 1.4.197 - runtime - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - 2.9.6 - - - org.springframework.boot - spring-boot-starter-test - ${spring.boot.version} - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot-maven-plugin.version} - - - - - - UTF-8 - UTF-8 - 2.0.3.RELEASE - 2.0.4.RELEASE - - diff --git a/spring-boot-angular/README.md b/spring-boot-angular/README.md index cfc1ea69f4..027b23202e 100644 --- a/spring-boot-angular/README.md +++ b/spring-boot-angular/README.md @@ -1,3 +1,8 @@ -### Relevant Articles: -- [Building a Web Application with Spring Boot and Angular](https://www.baeldung.com/spring-boot-angular-web) +## Spring Boot Angular +This module contains articles about Spring Boot with Angular + +### Relevant Articles: + +- [Building a Web Application with Spring Boot and Angular](https://www.baeldung.com/spring-boot-angular-web) +- [A Simple E-Commerce Implementation with Spring](https://www.baeldung.com/spring-angular-ecommerce) diff --git a/spring-boot-angular/pom.xml b/spring-boot-angular/pom.xml index 71c46cb7f5..8c26668752 100644 --- a/spring-boot-angular/pom.xml +++ b/spring-boot-angular/pom.xml @@ -7,11 +7,12 @@ 1.0 jar + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../parent-boot-2 diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/OrderController.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/OrderController.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/ProductController.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/ProductController.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Order.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Order.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Product.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Product.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderService.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderService.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductService.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductService.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java diff --git a/spring-boot-angular/angularclient/.angular-cli.json b/spring-boot-angular/src/main/js/application/.angular-cli.json similarity index 100% rename from spring-boot-angular/angularclient/.angular-cli.json rename to spring-boot-angular/src/main/js/application/.angular-cli.json diff --git a/spring-boot-angular/angularclient/.editorconfig b/spring-boot-angular/src/main/js/application/.editorconfig similarity index 100% rename from spring-boot-angular/angularclient/.editorconfig rename to spring-boot-angular/src/main/js/application/.editorconfig diff --git a/spring-boot-angular/angularclient/.gitignore b/spring-boot-angular/src/main/js/application/.gitignore similarity index 82% rename from spring-boot-angular/angularclient/.gitignore rename to spring-boot-angular/src/main/js/application/.gitignore index eabf65e51a..0537fca516 100644 --- a/spring-boot-angular/angularclient/.gitignore +++ b/spring-boot-angular/src/main/js/application/.gitignore @@ -36,8 +36,8 @@ testem.log /typings # e2e -/e2e/*.js -/e2e/*.map +/spring-boot-angular/src/main/js/application/e2e/*.js +/spring-boot-angular/src/main/js/application/e2e/*.map # System Files .DS_Store diff --git a/spring-boot-angular/angularclient/README.md b/spring-boot-angular/src/main/js/application/README.md similarity index 100% rename from spring-boot-angular/angularclient/README.md rename to spring-boot-angular/src/main/js/application/README.md diff --git a/spring-boot-angular/angularclient/e2e/app.e2e-spec.ts b/spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts similarity index 100% rename from spring-boot-angular/angularclient/e2e/app.e2e-spec.ts rename to spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.po.ts b/spring-boot-angular/src/main/js/application/e2e/app.po.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.po.ts rename to spring-boot-angular/src/main/js/application/e2e/app.po.ts diff --git a/spring-boot-angular/angularclient/e2e/tsconfig.e2e.json b/spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json similarity index 100% rename from spring-boot-angular/angularclient/e2e/tsconfig.e2e.json rename to spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json diff --git a/spring-boot-angular/angularclient/karma.conf.js b/spring-boot-angular/src/main/js/application/karma.conf.js similarity index 100% rename from spring-boot-angular/angularclient/karma.conf.js rename to spring-boot-angular/src/main/js/application/karma.conf.js diff --git a/spring-boot-angular/angularclient/package-lock.json b/spring-boot-angular/src/main/js/application/package-lock.json similarity index 100% rename from spring-boot-angular/angularclient/package-lock.json rename to spring-boot-angular/src/main/js/application/package-lock.json diff --git a/spring-boot-angular/angularclient/package.json b/spring-boot-angular/src/main/js/application/package.json similarity index 100% rename from spring-boot-angular/angularclient/package.json rename to spring-boot-angular/src/main/js/application/package.json diff --git a/spring-boot-angular/angularclient/protractor.conf.js b/spring-boot-angular/src/main/js/application/protractor.conf.js similarity index 100% rename from spring-boot-angular/angularclient/protractor.conf.js rename to spring-boot-angular/src/main/js/application/protractor.conf.js diff --git a/spring-boot-angular/angularclient/src/app/app-routing.module.ts b/spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app-routing.module.ts rename to spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts diff --git a/spring-boot-angular/angularclient/src/app/app.component.css b/spring-boot-angular/src/main/js/application/src/app/app.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.css rename to spring-boot-angular/src/main/js/application/src/app/app.component.css diff --git a/spring-boot-angular/angularclient/src/app/app.component.html b/spring-boot-angular/src/main/js/application/src/app/app.component.html similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.html rename to spring-boot-angular/src/main/js/application/src/app/app.component.html diff --git a/spring-boot-angular/angularclient/src/app/app.component.spec.ts b/spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/app.component.ts b/spring-boot-angular/src/main/js/application/src/app/app.component.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.ts rename to spring-boot-angular/src/main/js/application/src/app/app.component.ts diff --git a/spring-boot-angular/angularclient/src/app/app.module.ts b/spring-boot-angular/src/main/js/application/src/app/app.module.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.module.ts rename to spring-boot-angular/src/main/js/application/src/app/app.module.ts diff --git a/spring-boot-angular/angularclient/src/app/model/user.ts b/spring-boot-angular/src/main/js/application/src/app/model/user.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/model/user.ts rename to spring-boot-angular/src/main/js/application/src/app/model/user.ts diff --git a/spring-boot-angular/angularclient/src/app/service/user.service.spec.ts b/spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/service/user.service.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/service/user.service.ts b/spring-boot-angular/src/main/js/application/src/app/service/user.service.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/service/user.service.ts rename to spring-boot-angular/src/main/js/application/src/app/service/user.service.ts diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.css b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.css rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.html b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.html rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.spec.ts b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.ts b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.ts rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.css b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.css rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.html b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.html rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.spec.ts b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.ts b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.ts rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/assets/.gitkeep b/spring-boot-angular/src/main/js/application/src/assets/.gitkeep similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/assets/.gitkeep rename to spring-boot-angular/src/main/js/application/src/assets/.gitkeep diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.prod.ts b/spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.prod.ts rename to spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts diff --git a/spring-boot-angular/angularclient/src/environments/environment.ts b/spring-boot-angular/src/main/js/application/src/environments/environment.ts similarity index 100% rename from spring-boot-angular/angularclient/src/environments/environment.ts rename to spring-boot-angular/src/main/js/application/src/environments/environment.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/favicon.ico b/spring-boot-angular/src/main/js/application/src/favicon.ico similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/favicon.ico rename to spring-boot-angular/src/main/js/application/src/favicon.ico diff --git a/spring-boot-angular/angularclient/src/index.html b/spring-boot-angular/src/main/js/application/src/index.html similarity index 100% rename from spring-boot-angular/angularclient/src/index.html rename to spring-boot-angular/src/main/js/application/src/index.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/main.ts b/spring-boot-angular/src/main/js/application/src/main.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/main.ts rename to spring-boot-angular/src/main/js/application/src/main.ts diff --git a/spring-boot-angular/angularclient/src/polyfills.ts b/spring-boot-angular/src/main/js/application/src/polyfills.ts similarity index 100% rename from spring-boot-angular/angularclient/src/polyfills.ts rename to spring-boot-angular/src/main/js/application/src/polyfills.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/styles.css b/spring-boot-angular/src/main/js/application/src/styles.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/styles.css rename to spring-boot-angular/src/main/js/application/src/styles.css diff --git a/spring-boot-angular/angularclient/src/tsconfig.app.json b/spring-boot-angular/src/main/js/application/src/tsconfig.app.json similarity index 100% rename from spring-boot-angular/angularclient/src/tsconfig.app.json rename to spring-boot-angular/src/main/js/application/src/tsconfig.app.json diff --git a/spring-boot-angular/angularclient/src/tsconfig.spec.json b/spring-boot-angular/src/main/js/application/src/tsconfig.spec.json similarity index 100% rename from spring-boot-angular/angularclient/src/tsconfig.spec.json rename to spring-boot-angular/src/main/js/application/src/tsconfig.spec.json diff --git a/spring-boot-angular/angularclient/src/typings.d.ts b/spring-boot-angular/src/main/js/application/src/typings.d.ts similarity index 100% rename from spring-boot-angular/angularclient/src/typings.d.ts rename to spring-boot-angular/src/main/js/application/src/typings.d.ts diff --git a/spring-boot-angular/angularclient/tsconfig.json b/spring-boot-angular/src/main/js/application/tsconfig.json similarity index 100% rename from spring-boot-angular/angularclient/tsconfig.json rename to spring-boot-angular/src/main/js/application/tsconfig.json diff --git a/spring-boot-angular/angularclient/tslint.json b/spring-boot-angular/src/main/js/application/tslint.json similarity index 100% rename from spring-boot-angular/angularclient/tslint.json rename to spring-boot-angular/src/main/js/application/tslint.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/.editorconfig b/spring-boot-angular/src/main/js/ecommerce/.editorconfig similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/.editorconfig rename to spring-boot-angular/src/main/js/ecommerce/.editorconfig diff --git a/spring-boot-angular-ecommerce/src/main/frontend/README.md b/spring-boot-angular/src/main/js/ecommerce/README.md similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/README.md rename to spring-boot-angular/src/main/js/ecommerce/README.md diff --git a/spring-boot-angular-ecommerce/src/main/frontend/angular.json b/spring-boot-angular/src/main/js/ecommerce/angular.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/angular.json rename to spring-boot-angular/src/main/js/ecommerce/angular.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/protractor.conf.js b/spring-boot-angular/src/main/js/ecommerce/e2e/protractor.conf.js similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/protractor.conf.js rename to spring-boot-angular/src/main/js/ecommerce/e2e/protractor.conf.js diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.e2e-spec.ts b/spring-boot-angular/src/main/js/ecommerce/e2e/src/app.e2e-spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.e2e-spec.ts rename to spring-boot-angular/src/main/js/ecommerce/e2e/src/app.e2e-spec.ts diff --git a/spring-boot-angular/angularclient/e2e/app.po.ts b/spring-boot-angular/src/main/js/ecommerce/e2e/src/app.po.ts similarity index 100% rename from spring-boot-angular/angularclient/e2e/app.po.ts rename to spring-boot-angular/src/main/js/ecommerce/e2e/src/app.po.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/tsconfig.e2e.json b/spring-boot-angular/src/main/js/ecommerce/e2e/tsconfig.e2e.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/tsconfig.e2e.json rename to spring-boot-angular/src/main/js/ecommerce/e2e/tsconfig.e2e.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/package-lock.json b/spring-boot-angular/src/main/js/ecommerce/package-lock.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/package-lock.json rename to spring-boot-angular/src/main/js/ecommerce/package-lock.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/package.json b/spring-boot-angular/src/main/js/ecommerce/package.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/package.json rename to spring-boot-angular/src/main/js/ecommerce/package.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/proxy-conf.json b/spring-boot-angular/src/main/js/ecommerce/proxy-conf.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/proxy-conf.json rename to spring-boot-angular/src/main/js/ecommerce/proxy-conf.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.module.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/app.module.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.module.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.module.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-order.model.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-order.model.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-order.model.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-order.model.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-orders.model.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-orders.model.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-orders.model.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-orders.model.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product.model.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product.model.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product.model.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product.model.ts diff --git a/spring-boot-angular/angularclient/src/assets/.gitkeep b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/assets/.gitkeep rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/services/EcommerceService.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/services/EcommerceService.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/services/EcommerceService.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/services/EcommerceService.ts diff --git a/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.ts diff --git a/spring-boot-angular/src/main/js/ecommerce/src/assets/.gitkeep b/spring-boot-angular/src/main/js/ecommerce/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/browserslist b/spring-boot-angular/src/main/js/ecommerce/src/browserslist similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/browserslist rename to spring-boot-angular/src/main/js/ecommerce/src/browserslist diff --git a/spring-boot-angular/angularclient/src/environments/environment.prod.ts b/spring-boot-angular/src/main/js/ecommerce/src/environments/environment.prod.ts similarity index 100% rename from spring-boot-angular/angularclient/src/environments/environment.prod.ts rename to spring-boot-angular/src/main/js/ecommerce/src/environments/environment.prod.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.ts b/spring-boot-angular/src/main/js/ecommerce/src/environments/environment.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.ts rename to spring-boot-angular/src/main/js/ecommerce/src/environments/environment.ts diff --git a/spring-boot-angular/angularclient/src/favicon.ico b/spring-boot-angular/src/main/js/ecommerce/src/favicon.ico similarity index 100% rename from spring-boot-angular/angularclient/src/favicon.ico rename to spring-boot-angular/src/main/js/ecommerce/src/favicon.ico diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/index.html b/spring-boot-angular/src/main/js/ecommerce/src/index.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/index.html rename to spring-boot-angular/src/main/js/ecommerce/src/index.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/karma.conf.js b/spring-boot-angular/src/main/js/ecommerce/src/karma.conf.js similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/karma.conf.js rename to spring-boot-angular/src/main/js/ecommerce/src/karma.conf.js diff --git a/spring-boot-angular/angularclient/src/main.ts b/spring-boot-angular/src/main/js/ecommerce/src/main.ts similarity index 100% rename from spring-boot-angular/angularclient/src/main.ts rename to spring-boot-angular/src/main/js/ecommerce/src/main.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/polyfills.ts b/spring-boot-angular/src/main/js/ecommerce/src/polyfills.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/polyfills.ts rename to spring-boot-angular/src/main/js/ecommerce/src/polyfills.ts diff --git a/spring-boot-angular/angularclient/src/styles.css b/spring-boot-angular/src/main/js/ecommerce/src/styles.css similarity index 100% rename from spring-boot-angular/angularclient/src/styles.css rename to spring-boot-angular/src/main/js/ecommerce/src/styles.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/test.ts b/spring-boot-angular/src/main/js/ecommerce/src/test.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/test.ts rename to spring-boot-angular/src/main/js/ecommerce/src/test.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.app.json b/spring-boot-angular/src/main/js/ecommerce/src/tsconfig.app.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.app.json rename to spring-boot-angular/src/main/js/ecommerce/src/tsconfig.app.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.spec.json b/spring-boot-angular/src/main/js/ecommerce/src/tsconfig.spec.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.spec.json rename to spring-boot-angular/src/main/js/ecommerce/src/tsconfig.spec.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/tslint.json b/spring-boot-angular/src/main/js/ecommerce/src/tslint.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/tslint.json rename to spring-boot-angular/src/main/js/ecommerce/src/tslint.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/tsconfig.json b/spring-boot-angular/src/main/js/ecommerce/tsconfig.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/tsconfig.json rename to spring-boot-angular/src/main/js/ecommerce/tsconfig.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/tslint.json b/spring-boot-angular/src/main/js/ecommerce/tslint.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/tslint.json rename to spring-boot-angular/src/main/js/ecommerce/tslint.json diff --git a/spring-boot-angular-ecommerce/src/main/resources/application.properties b/spring-boot-angular/src/main/resources/application.properties similarity index 100% rename from spring-boot-angular-ecommerce/src/main/resources/application.properties rename to spring-boot-angular/src/main/resources/application.properties diff --git a/spring-boot-angular/src/main/resources/logback.xml b/spring-boot-angular/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-boot-angular/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/spring-boot-angular-ecommerce/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java b/spring-boot-angular/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java similarity index 100% rename from spring-boot-angular-ecommerce/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java rename to spring-boot-angular/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java diff --git a/spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-boot-angular/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-boot-angular/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextTest.java rename to spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-boot-autoconfiguration/README.MD b/spring-boot-autoconfiguration/README.MD deleted file mode 100644 index dc9cad539a..0000000000 --- a/spring-boot-autoconfiguration/README.MD +++ /dev/null @@ -1,7 +0,0 @@ -### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant Articles: - -- [Create a Custom Auto-Configuration with Spring Boot](http://www.baeldung.com/spring-boot-custom-auto-configuration) -- [Guide to ApplicationContextRunner in Spring Boot](https://www.baeldung.com/spring-boot-context-runner) diff --git a/spring-boot-autoconfiguration/README.md b/spring-boot-autoconfiguration/README.md new file mode 100644 index 0000000000..67311eed50 --- /dev/null +++ b/spring-boot-autoconfiguration/README.md @@ -0,0 +1,11 @@ +## Spring Boot Auto Configuration + +This module contains articles about Spring Boot Auto Configuration + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [Create a Custom Auto-Configuration with Spring Boot](https://www.baeldung.com/spring-boot-custom-auto-configuration) +- [Guide to ApplicationContextRunner in Spring Boot](https://www.baeldung.com/spring-boot-context-runner) diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md index 6a88f25bd7..5fb8fd4a84 100644 --- a/spring-boot-bootstrap/README.md +++ b/spring-boot-bootstrap/README.md @@ -1,7 +1,12 @@ +## Spring Boot Bootstrap + +This module contains articles about bootstrapping Spring Boot applications. + ### Relevant Articles: -- [Spring Boot Tutorial – Bootstrap a Simple Application](http://www.baeldung.com/spring-boot-start) -- [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar) +- [Spring Boot Tutorial – Bootstrap a Simple Application](https://www.baeldung.com/spring-boot-start) +- [Thin JARs with Spring Boot](https://www.baeldung.com/spring-boot-thin-jar) - [Deploying a Spring Boot Application to Cloud Foundry](https://www.baeldung.com/spring-boot-app-deploy-to-cloud-foundry) - [Deploy a Spring Boot Application to Google App Engine](https://www.baeldung.com/spring-boot-google-app-engine) - [Deploy a Spring Boot Application to OpenShift](https://www.baeldung.com/spring-boot-deploy-openshift) - [Deploy a Spring Boot Application to AWS Beanstalk](https://www.baeldung.com/spring-boot-deploy-aws-beanstalk) +- [Guide to @SpringBootConfiguration in Spring Boot](https://www.baeldung.com/springbootconfiguration-annotation) diff --git a/spring-boot-camel/README.md b/spring-boot-camel/README.md index 0e85db4a7f..f9594a95a6 100644 --- a/spring-boot-camel/README.md +++ b/spring-boot-camel/README.md @@ -1,19 +1,27 @@ -Example for the Article on Camel API with SpringBoot +## Spring Boot Camel -to start up, run: - mvn spring-boot:run +This module contains articles about Spring Boot with Apache Camel + +### Example for the Article on Camel API with SpringBoot + +To start, run: + +`mvn spring-boot:run` -them, do a POST http request to: - http://localhost:8080/camel/api/bean +Then, make a POST http request to: -with the HEADER: Content-Type: application/json, +`http://localhost:8080/camel/api/bean` -and a BODY Payload like {"id": 1,"name": "World"} +Include the HEADER: Content-Type: application/json, -and we will get a return code of 201 and the response: Hello, World - if the transform() method from Application class is uncommented and the process() method is commented +and a BODY Payload like: -or return code of 201 and the response: {"id": 10,"name": "Hello, World"} - if the transform() method from Application class is commented and the process() method is uncommented +`{"id": 1,"name": "World"}` + +We will get a return code of 201 and the response: `Hello, World` - if the transform() method from Application class is uncommented and the process() method is commented + +or return code of 201 and the response: `{"id": 10,"name": "Hello, World"}` - if the transform() method from Application class is commented and the process() method is uncommented ## Relevant articles: -- [Apache Camel with Spring Boot](http://www.baeldung.com/apache-camel-spring-boot) +- [Apache Camel with Spring Boot](https://www.baeldung.com/apache-camel-spring-boot) diff --git a/spring-boot-cli/README.md b/spring-boot-cli/README.md index 85323da9b4..79e259c855 100644 --- a/spring-boot-cli/README.md +++ b/spring-boot-cli/README.md @@ -1,6 +1,6 @@ -========= - ## Spring Boot CLI +This module contains articles about Spring Boot CLI + ### Relevant Articles: -- [Introduction to Spring Boot CLI](http://www.baeldung.com/spring-boot-cli) +- [Introduction to Spring Boot CLI](https://www.baeldung.com/spring-boot-cli) diff --git a/spring-boot-client/README.MD b/spring-boot-client/README.MD index 8db48089a5..b5a4c78446 100644 --- a/spring-boot-client/README.MD +++ b/spring-boot-client/README.MD @@ -1,7 +1,11 @@ +## Spring Boot Client + +This module contains articles about Spring Boot Clients + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Quick Guide to @RestClientTest in Spring Boot](http://www.baeldung.com/restclienttest-in-spring-boot) -- [A Java Client for a WebSockets API](http://www.baeldung.com/websockets-api-java-spring-client) \ No newline at end of file +- [Quick Guide to @RestClientTest in Spring Boot](https://www.baeldung.com/restclienttest-in-spring-boot) +- [A Java Client for a WebSockets API](https://www.baeldung.com/websockets-api-java-spring-client) diff --git a/spring-boot-crud/README.md b/spring-boot-crud/README.md index ab2cbe1e3a..6b0032deb3 100644 --- a/spring-boot-crud/README.md +++ b/spring-boot-crud/README.md @@ -1,3 +1,7 @@ +## Spring boot CRUD + +This module contains articles about Spring Boot CRUD Operations + ### Relevant Articles: - [Spring Boot CRUD Application with Thymeleaf](https://www.baeldung.com/spring-boot-crud-thymeleaf) - [Using a Spring Boot Application as a Dependency](https://www.baeldung.com/spring-boot-dependency) diff --git a/spring-boot-ctx-fluent/README.md b/spring-boot-ctx-fluent/README.md index 0b4b9c1271..2d7ba7f2c0 100644 --- a/spring-boot-ctx-fluent/README.md +++ b/spring-boot-ctx-fluent/README.md @@ -1,4 +1,7 @@ +## Spring Boot Context Fluent + +This module contains articles about Spring Boot Fluent Builder ### Relevant Articles: -- [Context Hierarchy with the Spring Boot Fluent Builder API](http://www.baeldung.com/spring-boot-context-hierarchy) +- [Context Hierarchy with the Spring Boot Fluent Builder API](https://www.baeldung.com/spring-boot-context-hierarchy) diff --git a/spring-boot-custom-starter/README.md b/spring-boot-custom-starter/README.md index f983441ca0..c22aab7a2b 100644 --- a/spring-boot-custom-starter/README.md +++ b/spring-boot-custom-starter/README.md @@ -1,5 +1,9 @@ +## Spring Boot Custom Starter + +This module contains articles about writing Spring Boot [starters](https://www.baeldung.com/spring-boot-starters). + ### Relevant Articles: -- [Creating a Custom Starter with Spring Boot](http://www.baeldung.com/spring-boot-custom-starter) +- [Creating a Custom Starter with Spring Boot](https://www.baeldung.com/spring-boot-custom-starter) - **greeter-library**: The sample library that we're creating the starter for. @@ -9,4 +13,4 @@ - **greeter-spring-boot-sample-app**: The sample project that uses the custom starter. -- [Multi-Module Project With Spring Boot](http://www.baeldung.com/spring-boot-multiple-modules) +- [Multi-Module Project With Spring Boot](https://www.baeldung.com/spring-boot-multiple-modules) diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml index 1e4ee698c6..74e786be99 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml @@ -44,7 +44,7 @@ org.springframework.boot spring-boot-starter-test - 1.5.10.RELEASE + ${spring-boot.version} test diff --git a/spring-boot-data/README.md b/spring-boot-data/README.md index 6f0b8c8123..513c5fed18 100644 --- a/spring-boot-data/README.md +++ b/spring-boot-data/README.md @@ -1,3 +1,7 @@ +## Spring Boot Data + +This module contains articles about Spring Boot with Spring Data + ## Relevant Articles: - [Formatting JSON Dates in Spring Boot](https://www.baeldung.com/spring-boot-formatting-json-dates) diff --git a/spring-boot-data/pom.xml b/spring-boot-data/pom.xml index 9c11e09f4a..dc33d9f6ae 100644 --- a/spring-boot-data/pom.xml +++ b/spring-boot-data/pom.xml @@ -6,44 +6,39 @@ war spring-boot-data Spring Boot Data Module - parent-boot-2 com.baeldung 0.0.1-SNAPSHOT ../parent-boot-2 - org.springframework.boot spring-boot-starter-data-redis - 2.1.6.RELEASE - + + org.javers + javers-spring-boot-starter-sql + ${javers.version} + org.springframework.boot spring-boot-starter-data-mongodb - 2.1.6.RELEASE - org.springframework.boot spring-boot-starter-data-jpa - 2.1.6.RELEASE - com.h2database h2 - 1.4.197 + ${h2.version} - org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-tomcat @@ -54,8 +49,8 @@ spring-boot-starter-test test - + spring-boot @@ -98,6 +93,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + @@ -106,6 +109,22 @@ autoconfiguration + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.javers.SpringBootJaVersApplication + JAR + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + org.apache.maven.plugins maven-surefire-plugin @@ -133,14 +152,21 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + - com.baeldung.SpringBootDataApplication + 5.6.3 2.2.4 - diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java b/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java new file mode 100644 index 0000000000..91c9b11af5 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java @@ -0,0 +1,31 @@ +package com.baeldung.javers; + +import com.baeldung.javers.domain.Address; +import com.baeldung.javers.domain.Product; +import com.baeldung.javers.domain.Store; +import com.baeldung.javers.repo.StoreRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; + +@SpringBootApplication +public class SpringBootJaVersApplication { + @Autowired + StoreRepository storeRepository; + + public static void main(String[] args) { + SpringApplication.run(SpringBootJaVersApplication.class, args); + } + + @EventListener + public void appReady(ApplicationReadyEvent event) { + Store store = new Store("Baeldung store", new Address("Some street", 22222)); + for (int i = 1; i < 3; i++) { + Product product = new Product("Product #" + i, 100 * i); + store.addProduct(product); + } + storeRepository.save(store); + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java b/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java new file mode 100644 index 0000000000..b230dcec1d --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java @@ -0,0 +1,20 @@ +package com.baeldung.javers.config; + +import org.javers.spring.auditable.AuthorProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JaversConfiguration { + @Bean + public AuthorProvider provideJaversAuthor() { + return new SimpleAuthorProvider(); + } + + private static class SimpleAuthorProvider implements AuthorProvider { + @Override + public String provide() { + return "Baeldung Author"; + } + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java new file mode 100644 index 0000000000..930276b3ee --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java @@ -0,0 +1,33 @@ +package com.baeldung.javers.domain; + +import javax.persistence.Embeddable; + +@Embeddable +public class Address { + private String address; + private Integer zipCode; + + public Address(String address, Integer zipCode) { + this.address = address; + this.zipCode = zipCode; + } + + public Address() { + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Integer getZipCode() { + return zipCode; + } + + public void setZipCode(Integer zipCode) { + this.zipCode = zipCode; + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java new file mode 100644 index 0000000000..61a2993bb9 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java @@ -0,0 +1,61 @@ +package com.baeldung.javers.domain; + +import javax.persistence.*; + +@Entity +public class Product { + @Id + @GeneratedValue + private int id; + + private String name; + private double price; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "store_id") + private Store store; + + public Product(String name, double price) { + this.name = name; + this.price = price; + } + + public Product() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Store getStore() { + return store; + } + + public void setStore(Store store) { + this.store = store; + } + + public void setNamePrefix(String prefix) { + this.name = prefix + this.name; + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java new file mode 100644 index 0000000000..5aa6686261 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java @@ -0,0 +1,62 @@ +package com.baeldung.javers.domain; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class Store { + @Id + @GeneratedValue + private int id; + private String name; + @Embedded + private Address address; + @OneToMany( + mappedBy = "store", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List products = new ArrayList<>(); + + public Store(String name, Address address) { + this.name = name; + this.address = address; + } + + public Store() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public void addProduct(Product product) { + product.setStore(this); + this.products.add(product); + } + + public List getProducts() { + return this.products; + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java b/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java new file mode 100644 index 0000000000..090ebe6742 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.javers.repo; + +import com.baeldung.javers.domain.Product; +import org.javers.spring.annotation.JaversAuditable; +import org.springframework.data.repository.CrudRepository; + +public interface ProductRepository extends CrudRepository { + @Override + @JaversAuditable + S save(S s); +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java b/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java new file mode 100644 index 0000000000..aa9d07c4c8 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.javers.repo; + +import com.baeldung.javers.domain.Store; +import org.javers.spring.annotation.JaversSpringDataAuditable; +import org.springframework.data.repository.CrudRepository; + +@JaversSpringDataAuditable +public interface StoreRepository extends CrudRepository { +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java b/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java new file mode 100644 index 0000000000..2977f715cb --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java @@ -0,0 +1,59 @@ +package com.baeldung.javers.service; + + +import com.baeldung.javers.domain.Product; +import com.baeldung.javers.domain.Store; +import com.baeldung.javers.repo.ProductRepository; +import com.baeldung.javers.repo.StoreRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.Random; + +@Service +public class StoreService { + private final ProductRepository productRepository; + private final StoreRepository storeRepository; + + public StoreService(ProductRepository productRepository, StoreRepository storeRepository) { + this.productRepository = productRepository; + this.storeRepository = storeRepository; + } + + public void updateProductPrice(Integer productId, Double price) { + Optional productOpt = productRepository.findById(productId); + productOpt.ifPresent(product -> { + product.setPrice(price); + productRepository.save(product); + }); + } + + public void rebrandStore(int storeId, String updatedName) { + Optional storeOpt = storeRepository.findById(storeId); + storeOpt.ifPresent(store -> { + store.setName(updatedName); + store.getProducts().forEach(product -> { + product.setNamePrefix(updatedName); + }); + storeRepository.save(store); + }); + } + + public void createRandomProduct(Integer storeId) { + Optional storeOpt = this.storeRepository.findById(storeId); + storeOpt.ifPresent(store -> { + Random random = new Random(); + Product product = new Product("Product#" + random.nextInt(), random.nextDouble() * 100); + store.addProduct(product); + storeRepository.save(store); + }); + } + + public Store findStoreById(int storeId) { + return storeRepository.findById(storeId).get(); + } + + public Product findProductById(int id) { + return this.productRepository.findById(id).get(); + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java b/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java new file mode 100644 index 0000000000..c9681add40 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java @@ -0,0 +1,5 @@ +package com.baeldung.javers.web; + +public class RebrandStoreDto { + public String name; +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java b/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java new file mode 100644 index 0000000000..89c3c03a11 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java @@ -0,0 +1,73 @@ +package com.baeldung.javers.web; + +import com.baeldung.javers.domain.Product; +import com.baeldung.javers.domain.Store; +import com.baeldung.javers.service.StoreService; +import org.javers.core.Changes; +import org.javers.core.Javers; +import org.javers.core.metamodel.object.CdoSnapshot; +import org.javers.repository.jql.JqlQuery; +import org.javers.repository.jql.QueryBuilder; +import org.javers.shadow.Shadow; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class StoreController { + private final StoreService storeService; + private final Javers javers; + + public StoreController(StoreService customerService, Javers javers) { + this.storeService = customerService; + this.javers = javers; + } + + @PostMapping("/stores/{storeId}/products/random") + public void createRandomProduct(@PathVariable final Integer storeId) { + storeService.createRandomProduct(storeId); + } + + @PostMapping("/stores/{storeId}/rebrand") + public void rebrandStore(@PathVariable final Integer storeId, @RequestBody RebrandStoreDto rebrandStoreDto) { + storeService.rebrandStore(storeId, rebrandStoreDto.name); + } + + @PostMapping(value = "/stores/{storeId}/products/{productId}/price", consumes = MediaType.APPLICATION_JSON_VALUE) + public void updateProductPrice(@PathVariable final Integer productId, @PathVariable String storeId, @RequestBody UpdatePriceDto priceDto) { + storeService.updateProductPrice(productId, priceDto.price); + } + + @GetMapping("/products/{productId}/changes") + public String getProductChanges(@PathVariable int productId) { + Product product = storeService.findProductById(productId); + QueryBuilder jqlQuery = QueryBuilder.byInstance(product); + Changes changes = javers.findChanges(jqlQuery.build()); + return javers.getJsonConverter().toJson(changes); + } + + @GetMapping("/products/snapshots") + public String getProductSnapshots() { + QueryBuilder jqlQuery = QueryBuilder.byClass(Product.class); + List snapshots = javers.findSnapshots(jqlQuery.build()); + return javers.getJsonConverter().toJson(snapshots); + } + + @GetMapping("/stores/{storeId}/shadows") + public String getStoreShadows(@PathVariable int storeId) { + Store store = storeService.findStoreById(storeId); + JqlQuery jqlQuery = QueryBuilder.byInstance(store) + .withChildValueObjects().build(); + List> shadows = javers.findShadows(jqlQuery); + return javers.getJsonConverter().toJson(shadows.get(0)); + } + + @GetMapping("/stores/snapshots") + public String getStoresSnapshots() { + QueryBuilder jqlQuery = QueryBuilder.byClass(Store.class); + List snapshots = javers.findSnapshots(jqlQuery.build()); + return javers.getJsonConverter().toJson(snapshots); + } + +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java b/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java new file mode 100644 index 0000000000..02808a8134 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java @@ -0,0 +1,5 @@ +package com.baeldung.javers.web; + +public class UpdatePriceDto { + public double price; +} diff --git a/spring-boot-data/src/main/resources/application.properties b/spring-boot-data/src/main/resources/application.properties index 845b783634..6378a48506 100644 --- a/spring-boot-data/src/main/resources/application.properties +++ b/spring-boot-data/src/main/resources/application.properties @@ -1,2 +1,25 @@ spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=Europe/Zagreb \ No newline at end of file +spring.jackson.time-zone=Europe/Zagreb +spring.h2.console.path=/h2 +spring.h2.console.enabled=true +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.main.allow-bean-definition-overriding=true +javers.mappingStyle=FIELD +javers.algorithm=SIMPLE +javers.commitIdGenerator=synchronized_sequence +javers.prettyPrint=true +javers.typeSafeValues=false +javers.newObjectSnapshot=true +javers.packagesToScan= +javers.auditableAspectEnabled=true +javers.springDataAuditableRepositoryAspectEnabled=true +javers.sqlSchema= +javers.sqlSchemaManagementEnabled=true +javers.prettyPrintDateFormats.localDateTime=dd MMM yyyy, HH:mm:ss +javers.prettyPrintDateFormats.zonedDateTime=dd MMM yyyy, HH:mm:ssZ +javers.prettyPrintDateFormats.localDate=dd MMM yyyy +javers.prettyPrintDateFormats.localTime=HH:mm:ss + diff --git a/spring-boot-di/README.MD b/spring-boot-di/README.MD index 78cd163668..6e2c495b88 100644 --- a/spring-boot-di/README.MD +++ b/spring-boot-di/README.MD @@ -1,3 +1,7 @@ +## Spring Boot Dependency Inject + +This module contains articles about dependency injection with Spring Boot + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-boot-di/pom.xml b/spring-boot-di/pom.xml index b07d7c6385..31ccff03da 100644 --- a/spring-boot-di/pom.xml +++ b/spring-boot-di/pom.xml @@ -1,55 +1,64 @@ - 4.0.0 - spring-boot-di - spring-boot-di - jar - Module For Spring Boot DI + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + spring-boot-di + spring-boot-di + jar + Module For Spring Boot DI - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + - + + + org.aspectj + aspectjweaver + - + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - provided + spring-boot-starter-test + test - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - + - + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.SpringBootDiApplication + JAR + + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.SpringBootDiApplication - JAR - - - - - - - com.baeldung.SpringBootDiApplication - + + com.baeldung.SpringBootDiApplication + diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java new file mode 100644 index 0000000000..7ec076abc7 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java @@ -0,0 +1,11 @@ +package com.baeldung.componentscan.filter.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java new file mode 100644 index 0000000000..7849e4e10a --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java @@ -0,0 +1,13 @@ +package com.baeldung.componentscan.filter.annotation; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Animal.class)) +public class ComponentScanAnnotationFilterApp { + + public static void main(String[] args) { + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java new file mode 100644 index 0000000000..758775a737 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java @@ -0,0 +1,5 @@ +package com.baeldung.componentscan.filter.annotation; + +@Animal +public class Elephant { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java new file mode 100644 index 0000000000..ababe4fea9 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.aspectj; + +public class Cat { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java new file mode 100644 index 0000000000..aea7c0a2cd --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java @@ -0,0 +1,15 @@ +package com.baeldung.componentscan.filter.aspectj; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, +pattern = "com.baeldung.componentscan.filter.aspectj.* " + + "&& !(com.baeldung.componentscan.filter.aspectj.L* " + + "|| com.baeldung.componentscan.filter.aspectj.C*)")) +public class ComponentScanAspectJFilterApp { + public static void main(String[] args) { + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java new file mode 100644 index 0000000000..ade1b5903c --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.aspectj; + +public class Elephant { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java new file mode 100644 index 0000000000..6bfdfeb321 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.aspectj; + +public class Loin { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java new file mode 100644 index 0000000000..faf4121834 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.assignable; + +public interface Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java new file mode 100644 index 0000000000..568ac8045f --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.assignable; + +public class Cat implements Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java new file mode 100644 index 0000000000..b0155a882b --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java @@ -0,0 +1,13 @@ +package com.baeldung.componentscan.filter.assignable; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Animal.class)) +public class ComponentScanAssignableTypeFilterApp { + + public static void main(String[] args) { + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java new file mode 100644 index 0000000000..74637c86ba --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.assignable; + +public class Elephant implements Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java new file mode 100644 index 0000000000..17a8e87b7a --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.custom; + +public class Cat extends Pet { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java new file mode 100644 index 0000000000..30ccb19276 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java @@ -0,0 +1,22 @@ +package com.baeldung.componentscan.filter.custom; + +import org.springframework.core.type.ClassMetadata; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.core.type.filter.TypeFilter; + +import java.io.IOException; + +public class ComponentScanCustomFilter implements TypeFilter { + + @Override + public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { + ClassMetadata classMetadata = metadataReader.getClassMetadata(); + String superClass = classMetadata.getSuperClassName(); + if (Pet.class.getName() + .equalsIgnoreCase(superClass)) { + return true; + } + return false; + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java new file mode 100644 index 0000000000..3a87b6a807 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java @@ -0,0 +1,13 @@ +package com.baeldung.componentscan.filter.custom; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = ComponentScanCustomFilter.class)) +public class ComponentScanCustomFilterApp { + + public static void main(String[] args) { + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java new file mode 100644 index 0000000000..5deb4af9f3 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.custom; + +public class Loin { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java new file mode 100644 index 0000000000..c9be5a39c2 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.custom; + +public class Pet { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java new file mode 100644 index 0000000000..4569f91787 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.regex; + +public class Cat { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java new file mode 100644 index 0000000000..d2b7bd03fb --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java @@ -0,0 +1,13 @@ +package com.baeldung.componentscan.filter.regex; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*[t]")) +public class ComponentScanRegexFilterApp { + + public static void main(String[] args) { + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java new file mode 100644 index 0000000000..4910be41ad --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.regex; + +public class Elephant { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java new file mode 100644 index 0000000000..5b7949be38 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.regex; + +public class Loin { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java index 83b91f7860..8873f1214c 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java @@ -10,10 +10,10 @@ import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan -//@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) -//@ComponentScan(basePackages = "com.baeldung.componentscan.springapp") -//@ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals") -//@ComponentScan (excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springapp\\.flowers\\..*")) +// @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp") +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals") +// @ComponentScan (excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springapp\\.flowers\\..*")) public class SpringComponentScanApp { private static ApplicationContext applicationContext; diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java index 4362caefbb..c48f8c5e54 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java @@ -8,9 +8,9 @@ import org.springframework.context.annotation.Bean; import com.baeldung.componentscan.ExampleBean; @SpringBootApplication -//@ComponentScan(basePackages = "com.baeldung.componentscan.springbootapp.animals") -//@ComponentScan ( excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springbootapp\\.flowers\\..*")) -//@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) +// @ComponentScan(basePackages = "com.baeldung.componentscan.springbootapp.animals") +// @ComponentScan ( excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springbootapp\\.flowers\\..*")) +// @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) public class SpringBootComponentScanApp { private static ApplicationContext applicationContext; diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java new file mode 100644 index 0000000000..9eb0b67c21 --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.componentscan.filter.annotation; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanAnnotationFilterApp.class) +public class ComponentScanAnnotationFilterAppIntegrationTest { + + @Test + public void whenAnnotationFilterIsUsed_thenComponentScanShouldRegisterBeanAnnotatedWithAnimalAnootation() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAnnotationFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAnnotationFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(1)); + assertThat(beans.get(0), equalTo("elephant")); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java new file mode 100644 index 0000000000..945a0085f6 --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.componentscan.filter.aspectj; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanAspectJFilterApp.class) +public class ComponentScanAspectJFilterAppIntegrationTest { + + @Test + public void whenAspectJFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingAspectJCreteria() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAspectJFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAspectJFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(1)); + assertThat(beans.get(0), equalTo("elephant")); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java new file mode 100644 index 0000000000..3e5c7ee4f7 --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.componentscan.filter.assignable; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanAssignableTypeFilterApp.class) +public class ComponentScanAssignableTypeFilterAppIntegrationTest { + + @Test + public void whenAssignableTypeFilterIsUsed_thenComponentScanShouldRegisterBeanOfAssignableTypeAndItsSubClass() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAssignableTypeFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAssignableTypeFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(2)); + assertThat(beans.contains("cat"), equalTo(true)); + assertThat(beans.contains("elephant"), equalTo(true)); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java new file mode 100644 index 0000000000..097214a2cf --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.componentscan.filter.custom; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanCustomFilterApp.class) +public class ComponentScanCustomFilterAppIntegrationTest { + + @Test + public void whenCustomFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingCustomFilter() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanCustomFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(1)); + assertThat(beans.get(0), equalTo("cat")); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java new file mode 100644 index 0000000000..3163581c37 --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.componentscan.filter.regex; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanRegexFilterApp.class) +public class ComponentScanRegexFilterAppIntegrationTest { + + @Test + public void whenRegexFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingRegex() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanRegexFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanRegexFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(2)); + assertThat(beans.contains("cat"), equalTo(true)); + assertThat(beans.contains("elephant"), equalTo(true)); + } +} diff --git a/spring-boot-disable-console-logging/README.md b/spring-boot-disable-console-logging/README.md index 3d75fddc8e..7f1c06042f 100644 --- a/spring-boot-disable-console-logging/README.md +++ b/spring-boot-disable-console-logging/README.md @@ -1,2 +1,6 @@ +## Spring Boot Disable Console Logging + +This module contains articles about disabling Spring Boot console logging. + ### Relevant Articles: - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) diff --git a/spring-boot-flowable/README.md b/spring-boot-flowable/README.md index 8fb90d953b..1a8fb28a5e 100644 --- a/spring-boot-flowable/README.md +++ b/spring-boot-flowable/README.md @@ -1,3 +1,7 @@ +## Spring Boot Flowable + +This module contains articles about Flowable in Boot applications + ### Relevant articles -- [Introduction to Flowable](http://www.baeldung.com/flowable) +- [Introduction to Flowable](https://www.baeldung.com/flowable) diff --git a/spring-boot-gradle/README.md b/spring-boot-gradle/README.md index 76b82dce02..859c5d8199 100644 --- a/spring-boot-gradle/README.md +++ b/spring-boot-gradle/README.md @@ -1,4 +1,8 @@ +## Spring Boot Gradle + +This module contains articles about Gradle in Spring Boot projects. + ### Relevant Articles: -- [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) -- [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar) +- [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) +- [Thin JARs with Spring Boot](https://www.baeldung.com/spring-boot-thin-jar) diff --git a/spring-boot-jasypt/README.md b/spring-boot-jasypt/README.md index 5df2a4a6e5..c76339119a 100644 --- a/spring-boot-jasypt/README.md +++ b/spring-boot-jasypt/README.md @@ -1,4 +1,7 @@ +## Spring Boot Jasypt + +This module contains articles about Jasypt in Spring Boot projects. ### Relevant Articles: -- [Spring Boot Configuration with Jasypt](http://www.baeldung.com/spring-boot-jasypt) +- [Spring Boot Configuration with Jasypt](https://www.baeldung.com/spring-boot-jasypt) diff --git a/spring-boot-keycloak/README.md b/spring-boot-keycloak/README.md index cfe82c6cf7..2dfe3fc331 100644 --- a/spring-boot-keycloak/README.md +++ b/spring-boot-keycloak/README.md @@ -1,2 +1,6 @@ +## Spring Boot Keycloak + +This module contains articles about Keycloak in Spring Boot projects. + ## Relevant articles: -- [A Quick Guide to Using Keycloak with Spring Boot](http://www.baeldung.com/spring-boot-keycloak) +- [A Quick Guide to Using Keycloak with Spring Boot](https://www.baeldung.com/spring-boot-keycloak) diff --git a/spring-boot-kotlin/README.md b/spring-boot-kotlin/README.md index dc50c24aa0..d393805ed1 100644 --- a/spring-boot-kotlin/README.md +++ b/spring-boot-kotlin/README.md @@ -1,2 +1,6 @@ +## Spring Boot Kotlin + +This module contains articles about Kotlin in Spring Boot projects. + ### Relevant Articles: -- [Non-blocking Spring Boot with Kotlin Coroutines](http://www.baeldung.com/non-blocking-spring-boot-with-kotlin-coroutines) +- [Non-blocking Spring Boot with Kotlin Coroutines](https://www.baeldung.com/non-blocking-spring-boot-with-kotlin-coroutines) diff --git a/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt b/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt index d70d352cda..363090abac 100644 --- a/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt +++ b/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt @@ -5,6 +5,8 @@ import com.baeldung.nonblockingcoroutines.repository.ProductRepositoryCoroutines import kotlinx.coroutines.Deferred import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.flow.Flow import org.springframework.beans.factory.annotation.Autowired @@ -28,17 +30,17 @@ class ProductControllerCoroutines { } @GetMapping("/{id}/stock") - suspend fun findOneInStock(@PathVariable id: Int): ProductStockView { - val product: Deferred = GlobalScope.async { + suspend fun findOneInStock(@PathVariable id: Int): ProductStockView = coroutineScope { + val product: Deferred = async(start = CoroutineStart.LAZY) { productRepository.getProductById(id) } - val quantity: Deferred = GlobalScope.async { + val quantity: Deferred = async(start = CoroutineStart.LAZY) { webClient.get() .uri("/stock-service/product/$id/quantity") .accept(APPLICATION_JSON) .awaitExchange().awaitBody() } - return ProductStockView(product.await()!!, quantity.await()) + ProductStockView(product.await()!!, quantity.await()) } @FlowPreview diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.md similarity index 74% rename from spring-boot-libraries/README.MD rename to spring-boot-libraries/README.md index f3706e0fa4..f0bc3c9e89 100644 --- a/spring-boot-libraries/README.MD +++ b/spring-boot-libraries/README.md @@ -1,3 +1,7 @@ +## Spring Boot Libraries + +This module contains articles about various Spring Boot libraries + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-boot-logging-log4j2/README.md b/spring-boot-logging-log4j2/README.md index ea968d7fae..76029caef8 100644 --- a/spring-boot-logging-log4j2/README.md +++ b/spring-boot-logging-log4j2/README.md @@ -1,4 +1,8 @@ +## Spring Boot Logging with Log4j 2 + +This module contains articles about logging in Spring Boot projects with Log4j 2. + ### Relevant Articles: -- [Logging in Spring Boot](http://www.baeldung.com/spring-boot-logging) +- [Logging in Spring Boot](https://www.baeldung.com/spring-boot-logging) - [Logging to Graylog with Spring Boot](https://www.baeldung.com/graylog-with-spring-boot) diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml index 64696969ca..8e4bf60f91 100644 --- a/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-logging-log4j2/pom.xml @@ -37,7 +37,7 @@ org.projectlombok lombok - 1.18.4 + ${lombok.version} provided @@ -79,5 +79,6 @@ com.baeldung.springbootlogging.SpringBootLoggingApplication 1.3.8.RELEASE 1.1.16 + 1.18.4 diff --git a/spring-boot-management/README.md b/spring-boot-management/README.md new file mode 100644 index 0000000000..53d4c439ff --- /dev/null +++ b/spring-boot-management/README.md @@ -0,0 +1,7 @@ +## Spring Boot Logging HTTP Requests + +This module contains articles about the management of Spring Boot applications. + +### Relevant Articles: +- [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) + diff --git a/spring-boot-management/pom.xml b/spring-boot-management/pom.xml index 2b3e8f5d06..ca483d2f61 100644 --- a/spring-boot-management/pom.xml +++ b/spring-boot-management/pom.xml @@ -1,47 +1,56 @@ - - 4.0.0 - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - com.baeldung - spring-boot-management - 0.0.1-SNAPSHOT - spring-boot-management + + 4.0.0 + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + com.baeldung + spring-boot-management + 0.0.1-SNAPSHOT + spring-boot-management - - 1.8 - + + com.baeldung.spring.boot.management.logging.LoggingApplication + 1.8 + 2.1.6 + - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin-starter-client.version} + - - org.springframework.boot - spring-boot-starter-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java new file mode 100644 index 0000000000..6371ac4c64 --- /dev/null +++ b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.boot.management.logging; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LoggingApplication { + public static void main(String[] args) { + SpringApplication.run(LoggingApplication.class); + } +} diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java new file mode 100644 index 0000000000..5bd15be10c --- /dev/null +++ b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.boot.management.logging; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/log") +public class LoggingController { + private Log log = LogFactory.getLog(LoggingController.class); + + @GetMapping + public String log() { + log.trace("This is a TRACE level message"); + log.debug("This is a DEBUG level message"); + log.info("This is an INFO level message"); + log.warn("This is a WARN level message"); + log.error("This is an ERROR level message"); + + return "See the log for details"; + } +} diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java new file mode 100644 index 0000000000..45cc1ebb33 --- /dev/null +++ b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.boot.management.logging; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .ignoringAntMatchers("/actuator/**"); + } +} diff --git a/spring-boot-management/src/main/resources/application.properties b/spring-boot-management/src/main/resources/application.properties index 835ca64eac..338251cf9b 100644 --- a/spring-boot-management/src/main/resources/application.properties +++ b/spring-boot-management/src/main/resources/application.properties @@ -1,3 +1,22 @@ -management.endpoints.web.exposure.include=httptrace +management.endpoints.web.exposure.include=httptrace,loggers,health,info,metrics management.trace.http.include=RESPONSE_HEADERS +management.endpoint.loggers.enabled=true + +#basic auth creddentials +spring.security.user.name=client +spring.security.user.password=client + +#configs to connect to a secured server +spring.boot.admin.client.url=http://localhost:8080 +spring.boot.admin.client.username=admin +spring.boot.admin.client.password=admin + +#configs to give secured server info +spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} +spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password} + +#app config +spring.application.name=spring-boot-management +server.port=8081 + diff --git a/spring-boot-management/src/main/resources/logback.xml b/spring-boot-management/src/main/resources/logback.xml new file mode 100644 index 0000000000..36314cbeeb --- /dev/null +++ b/spring-boot-management/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/spring-boot-mvc-2/README.md b/spring-boot-mvc-2/README.md index f8e26f218b..0ff0f1f156 100644 --- a/spring-boot-mvc-2/README.md +++ b/spring-boot-mvc-2/README.md @@ -1,3 +1,8 @@ +## Spring Boot MVC + +This module contains articles about Spring Web MVC in Spring Boot projects. + ### Relevant Articles: - [Functional Controllers in Spring MVC](https://www.baeldung.com/spring-mvc-functional-controllers) +- More articles: [[prev -->]](/spring-boot-mvc) diff --git a/spring-boot-mvc-birt/README.md b/spring-boot-mvc-birt/README.md index 9fe3d94e2a..2c3804c745 100644 --- a/spring-boot-mvc-birt/README.md +++ b/spring-boot-mvc-birt/README.md @@ -1,3 +1,7 @@ +## Spring Boot MVC BIRT + +This module contains articles about BIRT Reporting in Spring Boot MVC projects. + ### Relevant Articles - [BIRT Reporting with Spring Boot](https://www.baeldung.com/birt-reports-spring-boot) diff --git a/spring-boot-mvc-birt/pom.xml b/spring-boot-mvc-birt/pom.xml index bf6bbbf71d..3532b20c15 100644 --- a/spring-boot-mvc-birt/pom.xml +++ b/spring-boot-mvc-birt/pom.xml @@ -48,19 +48,19 @@ com.innoventsolutions.birt.runtime org.eclipse.birt.runtime_4.8.0-20180626 - 4.8.0 + ${eclipse.birt.runtime.version} log4j log4j - 1.2.17 + ${log4j.version} org.projectlombok lombok - 1.18.6 + ${lombok.version} provided @@ -80,6 +80,7 @@ com.baeldung.birt.engine.ReportEngineApplication 1.8 1.8 + 4.8.0 diff --git a/spring-boot-mvc/README.md b/spring-boot-mvc/README.md index e3e3dbdb74..a83ea3ee25 100644 --- a/spring-boot-mvc/README.md +++ b/spring-boot-mvc/README.md @@ -1,16 +1,21 @@ +## Spring Boot MVC + +This module contains articles about Spring Web MVC in Spring Boot projects. + ### Relevant Articles: -- [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) +- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) - [Custom Validation MessageSource in Spring Boot](https://www.baeldung.com/spring-custom-validation-message-source) -- [Spring Boot Annotations](http://www.baeldung.com/spring-boot-annotations) -- [Spring Scheduling Annotations](http://www.baeldung.com/spring-scheduling-annotations) -- [Spring Web Annotations](http://www.baeldung.com/spring-mvc-annotations) -- [Spring Core Annotations](http://www.baeldung.com/spring-core-annotations) -- [Display RSS Feed with Spring MVC](http://www.baeldung.com/spring-mvc-rss-feed) +- [Spring Boot Annotations](https://www.baeldung.com/spring-boot-annotations) +- [Spring Scheduling Annotations](https://www.baeldung.com/spring-scheduling-annotations) +- [Spring Web Annotations](https://www.baeldung.com/spring-mvc-annotations) +- [Spring Core Annotations](https://www.baeldung.com/spring-core-annotations) +- [Display RSS Feed with Spring MVC](https://www.baeldung.com/spring-mvc-rss-feed) - [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao) - [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache) -- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) +- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally) - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js) -- [Using Spring ResponseEntity to Manipulate the HTTP Response](http://www.baeldung.com/spring-response-entity) -- [Spring Bean Annotations](http://www.baeldung.com/spring-bean-annotations) +- [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity) +- [Spring Bean Annotations](https://www.baeldung.com/spring-bean-annotations) +- More articles: [[next -->]](/spring-boot-mvc-2) diff --git a/spring-boot-nashorn/README.md b/spring-boot-nashorn/README.md index 1ca43927ee..f24adfe8e8 100644 --- a/spring-boot-nashorn/README.md +++ b/spring-boot-nashorn/README.md @@ -1,3 +1,8 @@ -### Relevant Articles: -- []() +## Spring Boot Nashorn + +This module contains articles about Spring Boot with Nashorn + +### Relevant Articles: + +- [Isomorphic Application with React and Nashorn](https://www.baeldung.com/react-nashorn-isomorphic-app) diff --git a/spring-boot-ops-2/README.MD b/spring-boot-ops-2/README.md similarity index 61% rename from spring-boot-ops-2/README.MD rename to spring-boot-ops-2/README.md index b4218dc395..0925b099b1 100644 --- a/spring-boot-ops-2/README.MD +++ b/spring-boot-ops-2/README.md @@ -1,4 +1,9 @@ +## Spring Boot Operations + +This module contains articles about Spring Boot Operations + ### Relevant Articles - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) +- More articles: [[<-- prev]](/spring-boot-ops) diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java new file mode 100644 index 0000000000..dd0d0f920c --- /dev/null +++ b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.gracefulshutdown; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GracefulShutdownApplication { + + public static void main(String args[]) { + SpringApplication.run(GracefulShutdownApplication.class, args); + } +} diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java new file mode 100644 index 0000000000..e21ddfe021 --- /dev/null +++ b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java @@ -0,0 +1,36 @@ +package com.baeldung.gracefulshutdown.beans; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.task.TaskExecutor; +import org.springframework.stereotype.Component; + +@Component +public class LongRunningProcessBean { + + private static final Logger LOG = LoggerFactory.getLogger(LongRunningProcessBean.class); + + @Autowired + private TaskExecutor taskExecutor; + + @PostConstruct + public void runTaskOnStartup() { + LOG.info("runTaskOnStartup entering"); + for (int i = 0; i < 3; i++) { + final int processNumber = i; + taskExecutor.execute(() -> { + try { + LOG.info("Long running process {} using threadpool started", processNumber); + Thread.sleep(60_000); + LOG.info("Long running process {} using threadpool completed", processNumber); + } catch (Exception e) { + LOG.error("Error while executing task", e); + } + }); + } + LOG.info("runTaskOnStartup exiting"); + } +} diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java new file mode 100644 index 0000000000..b458f16206 --- /dev/null +++ b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java @@ -0,0 +1,32 @@ +package com.baeldung.gracefulshutdown.config; + +import javax.annotation.PreDestroy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +public class SpringConfiguration { + + private static final Logger LOG = LoggerFactory.getLogger(SpringConfiguration.class); + + @Bean + public TaskExecutor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(2); + taskExecutor.setMaxPoolSize(2); + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + taskExecutor.setAwaitTerminationSeconds(30); + taskExecutor.initialize(); + return taskExecutor; + } + + @PreDestroy + public void destroy() { + LOG.info("Shutdown initiated"); + } +} diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md index 5be5c974d3..2720bc5ae2 100644 --- a/spring-boot-ops/README.md +++ b/spring-boot-ops/README.md @@ -1,14 +1,20 @@ +## Spring Boot Operations + +This module contains articles about Spring Boot Operations + ### Relevant Articles: - - [Deploy a Spring Boot WAR into a Tomcat Server](http://www.baeldung.com/spring-boot-war-tomcat-deploy) - - [Spring Boot Dependency Management with a Custom Parent](http://www.baeldung.com/spring-boot-dependency-management-custom-parent) - - [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder) - - [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot) - - [Introduction to WebJars](http://www.baeldung.com/maven-webjars) - - [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters) - - [A Quick Guide to Maven Wrapper](http://www.baeldung.com/maven-wrapper) - - [Shutdown a Spring Boot Application](http://www.baeldung.com/spring-boot-shutdown) - - [Spring Boot Console Application](http://www.baeldung.com/spring-boot-console-app) - - [Comparing Embedded Servlet Containers in Spring Boot](http://www.baeldung.com/spring-boot-servlet-containers) + - [Deploy a Spring Boot WAR into a Tomcat Server](https://www.baeldung.com/spring-boot-war-tomcat-deploy) + - [Spring Boot Dependency Management with a Custom Parent](https://www.baeldung.com/spring-boot-dependency-management-custom-parent) + - [A Custom Data Binder in Spring MVC](https://www.baeldung.com/spring-mvc-custom-data-binder) + - [Create a Fat Jar App with Spring Boot](https://www.baeldung.com/deployable-fat-jar-spring-boot) + - [Introduction to WebJars](https://www.baeldung.com/maven-webjars) + - [Intro to Spring Boot Starters](https://www.baeldung.com/spring-boot-starters) + - [A Quick Guide to Maven Wrapper](https://www.baeldung.com/maven-wrapper) + - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) + - [Spring Boot Console Application](https://www.baeldung.com/spring-boot-console-app) + - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) + - [Running a Spring Boot App with Maven vs an Executable War/Jar](https://www.baeldung.com/spring-boot-run-maven-vs-executable-jar) + - More articles: [[next -->]](/spring-boot-ops-2) diff --git a/spring-boot-ops/pom.xml b/spring-boot-ops/pom.xml index f36434b682..f578a24163 100644 --- a/spring-boot-ops/pom.xml +++ b/spring-boot-ops/pom.xml @@ -85,11 +85,17 @@ ${jquery.version} - + org.springframework.cloud spring-cloud-context ${springcloud.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + @@ -190,7 +196,8 @@ 2.2 18.0 3.1.7 - 2.0.2.RELEASE + 2.0.2.RELEASE + 4.5.8 diff --git a/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java b/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java index 0b6041bb06..c6413324f3 100644 --- a/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java +++ b/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java @@ -6,13 +6,13 @@ import org.springframework.stereotype.Component; @Component public class ConfProperties { - @Value("${url}") + @Value("${db.url}") private String url; - @Value("${username}") + @Value("${db.username}") private String username; - @Value("${password}") + @Value("${db.password}") private String password; public String getUrl() { diff --git a/spring-boot-ops/src/main/resources/external/conf.properties b/spring-boot-ops/src/main/resources/external/conf.properties index cfcd23dc76..944b31cc5c 100644 --- a/spring-boot-ops/src/main/resources/external/conf.properties +++ b/spring-boot-ops/src/main/resources/external/conf.properties @@ -1,4 +1,4 @@ -url=jdbc:postgresql://localhost:5432/ -username=admin -password=root +db.url=jdbc:postgresql://localhost:5432/ +db.username=admin +db.password=root spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java similarity index 84% rename from spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java rename to spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java index 14e80c3ac7..35b488f9d8 100644 --- a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java +++ b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java @@ -2,17 +2,16 @@ package com.baeldung.restart; import static org.junit.Assert.assertEquals; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; -import java.time.Duration; - -public class RestartApplicationIntegrationTest { +/** + * We have to make sure that while running this test, 8080 and 8090 ports are free. + * Otherwise it will fail. + */ +public class RestartApplicationManualTest { private TestRestTemplate restTemplate = new TestRestTemplate(); diff --git a/spring-boot-parent/README.md b/spring-boot-parent/README.md index c3bb4c700d..b48a286d62 100644 --- a/spring-boot-parent/README.md +++ b/spring-boot-parent/README.md @@ -1,3 +1,7 @@ +## Spring Boot Parent + +This module contains articles about Spring Boot Starter Parent + ### Relevant Articles - [The Spring Boot Starter Parent](https://www.baeldung.com/spring-boot-starter-parent) diff --git a/spring-boot-properties/README.md b/spring-boot-properties/README.md index 9aea5b4871..48ff79537c 100644 --- a/spring-boot-properties/README.md +++ b/spring-boot-properties/README.md @@ -1,10 +1,10 @@ ### Relevant Articles: - [Reloading Properties Files in Spring](https://www.baeldung.com/spring-reloading-properties) -- [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) +- [Guide to @ConfigurationProperties in Spring Boot](https://www.baeldung.com/configuration-properties-in-spring-boot) - [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) - [Guide to @EnableConfigurationProperties](https://www.baeldung.com/spring-enable-config-properties) -- [Properties with Spring and Spring Boot](http://www.baeldung.com/properties-with-spring) - checkout the `com.baeldung.properties` package for all scenarios of properties injection and usage -- [A Quick Guide to Spring @Value](http://www.baeldung.com/spring-value-annotation) -- [Spring YAML Configuration](http://www.baeldung.com/spring-yaml) -- [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults) -- [How to Inject a Property Value Into a Class Not Managed by Spring?](http://www.baeldung.com/inject-properties-value-non-spring-class) +- [Properties with Spring and Spring Boot](https://www.baeldung.com/properties-with-spring) - checkout the `com.baeldung.properties` package for all scenarios of properties injection and usage +- [A Quick Guide to Spring @Value](https://www.baeldung.com/spring-value-annotation) +- [Spring YAML Configuration](https://www.baeldung.com/spring-yaml) +- [Using Spring @Value with Defaults](https://www.baeldung.com/spring-value-defaults) +- [How to Inject a Property Value Into a Class Not Managed by Spring?](https://www.baeldung.com/inject-properties-value-non-spring-class) diff --git a/spring-boot-properties/extra.properties b/spring-boot-properties/extra.properties index 51874a0415..8e28a6f889 100644 --- a/spring-boot-properties/extra.properties +++ b/spring-boot-properties/extra.properties @@ -1 +1 @@ -application.theme.color=red \ No newline at end of file +application.theme.color=blue \ No newline at end of file diff --git a/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java deleted file mode 100644 index 011acaba36..0000000000 --- a/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.configurationproperties; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; - -@SpringBootApplication -@EnableConfigurationProperties(ConfigProperties.class) -public class DemoApplication { - public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); - } -} \ No newline at end of file diff --git a/spring-boot-property-exp/README.md b/spring-boot-property-exp/README.md index 70cf6bdfac..23af5995e2 100644 --- a/spring-boot-property-exp/README.md +++ b/spring-boot-property-exp/README.md @@ -1,18 +1,27 @@ -## The Module Holds Sources for the Following Articles - - [Automatic Property Expansion with Spring Boot](http://www.baeldung.com/spring-boot-auto-property-expansion) +## Spring Boot Property Expansion + +This module contains articles about Spring Boot Property Expansion + +### Relevant Articles + + - [Automatic Property Expansion with Spring Boot](https://www.baeldung.com/spring-boot-auto-property-expansion) -### Module property-exp-default-config - This module contains both a standard Maven Spring Boot build and the Gradle build which is Maven compatible. +## SubModules - In order to execute the Maven example, run the following command: +### property-exp-default-config + +This module contains both a standard Maven Spring Boot build and the Gradle build which is Maven compatible. - `mvn spring-boot:run` +In order to execute the Maven example, run the following command: - To execute the Gradle example: +`mvn spring-boot:run` + +To execute the Gradle example: `gradle bootRun` - ### Module property-exp-custom-config - This project is not using the standard Spring Boot parent and is configured manually. Run the following command: +### property-exp-custom-config - `mvn exec:java` +This project is not using the standard Spring Boot parent and is configured manually. Run the following command: + +`mvn exec:java` diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index 6f365bd465..ffac9335fd 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -1,19 +1,27 @@ -Module for the articles that are part of the Spring REST E-book: +## Spring Boot REST -1. [Bootstrap a Web Application with Spring 5](https://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) -2. [Build a REST API with Spring and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) -3. [Http Message Converters with the Spring Framework](http://www.baeldung.com/spring-httpmessageconverter-rest) -4. [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body) -5. [Entity To DTO Conversion for a Spring REST API](https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application) -6. [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring) -7. [REST API Discoverability and HATEOAS](http://www.baeldung.com/restful-web-service-discoverability) -8. [An Intro to Spring HATEOAS](http://www.baeldung.com/spring-hateoas-tutorial) -9. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring) -10. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api) +This module contains articles about Spring Boot RESTful APIs. -- [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring) -- [Versioning a REST API](http://www.baeldung.com/rest-versioning) -- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring) -- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types) +### Relevant Articles + +- [HATEOAS for a Spring REST Service](https://www.baeldung.com/rest-api-discoverability-with-spring) +- [Versioning a REST API](https://www.baeldung.com/rest-versioning) +- [ETags for REST with Spring](https://www.baeldung.com/etags-for-rest-with-spring) +- [Testing REST with multiple MIME types](https://www.baeldung.com/testing-rest-api-with-multiple-media-types) - [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) - [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) + +### E-book + +These articles are part of the Spring REST E-book: + +1. [Bootstrap a Web Application with Spring 5](https://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) +2. [Build a REST API with Spring and Java Config](https://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) +3. [Http Message Converters with the Spring Framework](https://www.baeldung.com/spring-httpmessageconverter-rest) +4. [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body) +5. [Entity To DTO Conversion for a Spring REST API](https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application) +6. [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) +7. [REST API Discoverability and HATEOAS](https://www.baeldung.com/restful-web-service-discoverability) +8. [An Intro to Spring HATEOAS](https://www.baeldung.com/spring-hateoas-tutorial) +9. [REST Pagination in Spring](https://www.baeldung.com/rest-api-pagination-in-spring) +10. [Test a REST API with Java](https://www.baeldung.com/integration-testing-a-rest-api) diff --git a/spring-boot-security/README.md b/spring-boot-security/README.md index 30a3218672..be4690f321 100644 --- a/spring-boot-security/README.md +++ b/spring-boot-security/README.md @@ -1,3 +1,13 @@ +## Spring Boot Security + +This module contains articles about Spring Boot Security + +### Relevant Articles: + +- [Spring Boot Security Auto-Configuration](https://www.baeldung.com/spring-boot-security-autoconfiguration) +- [Spring Security for Spring Boot Integration Tests](https://www.baeldung.com/spring-security-integration-tests) +- [Introduction to Spring Security Taglibs](https://www.baeldung.com/spring-security-taglibs) + ### Spring Boot Security Auto-Configuration - mvn clean install @@ -5,9 +15,5 @@ - uncomment security properties for easy testing. If not random will be generated. ### CURL commands -- curl -X POST -u baeldung-admin:baeldung -d grant_type=client_credentials -d username=baeldung-admin -d password=baeldung http://localhost:8080/oauth/token -### Relevant Articles: -- [Spring Boot Security Auto-Configuration](http://www.baeldung.com/spring-boot-security-autoconfiguration) -- [Spring Security for Spring Boot Integration Tests](https://www.baeldung.com/spring-security-integration-tests) -- [Introduction to Spring Security Taglibs](https://www.baeldung.com/spring-security-taglibs) +- curl -X POST -u baeldung-admin:baeldung -d grant_type=client_credentials -d username=baeldung-admin -d password=baeldung http://localhost:8080/oauth/token diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java similarity index 80% rename from spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java rename to spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java index 7007c15596..3afeda66a4 100644 --- a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth; +package com.baeldung.springbootsecurity.autoconfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi @SpringBootApplication(exclude = { SecurityAutoConfiguration.class // ,ManagementWebSecurityAutoConfiguration.class -}, scanBasePackages = "com.baeldung.springbootsecurity.basic_auth") +}, scanBasePackages = "com.baeldung.springbootsecurity.autoconfig") public class SpringBootSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSecurityApplication.class, args); diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java similarity index 95% rename from spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java rename to spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java index 3cfa45421c..7060792df5 100644 --- a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth.config; +package com.baeldung.springbootsecurity.autoconfig.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java similarity index 93% rename from spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java rename to spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java index f221712513..a28d0f5e26 100644 --- a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth; +package com.baeldung.springbootsecurity.autoconfig.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -18,6 +18,8 @@ import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.springbootsecurity.autoconfig.SpringBootSecurityApplication; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootSecurityApplication.class) public class BasicConfigurationIntegrationTest { diff --git a/spring-boot-testing/README.MD b/spring-boot-testing/README.md similarity index 86% rename from spring-boot-testing/README.MD rename to spring-boot-testing/README.md index 7a4c4f53a1..0b2533e6bc 100644 --- a/spring-boot-testing/README.MD +++ b/spring-boot-testing/README.md @@ -1,4 +1,9 @@ +## Spring Boot Testing + +This module contains articles about Spring Boot testing + ### The Course + The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: diff --git a/spring-boot-vue/README.md b/spring-boot-vue/README.md index e68f961e51..de473c0d36 100644 --- a/spring-boot-vue/README.md +++ b/spring-boot-vue/README.md @@ -1,2 +1,6 @@ +## Spring Boot Vue + +This module contains articles about Spring Boot with Vue.js + ### Relevant Articles: -- [Vue.js Frontend with a Spring Boot Backend](http://www.baeldung.com/spring-boot-vue-js) +- [Vue.js Frontend with a Spring Boot Backend](https://www.baeldung.com/spring-boot-vue-js) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 04d76e438e..2423d6d331 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -1,32 +1,36 @@ +## Spring Boot + +This module contains articles about Spring Boot + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) -- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan) -- [How to Register a Servlet in Java](http://www.baeldung.com/register-servlet) -- [Guide to Spring WebUtils and ServletRequestUtils](http://www.baeldung.com/spring-webutils-servletrequestutils) -- [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) -- [Guide to Internationalization in Spring Boot](http://www.baeldung.com/spring-boot-internationalization) -- [Create a Custom FailureAnalyzer with Spring Boot](http://www.baeldung.com/spring-boot-failure-analyzer) -- [Dynamic DTO Validation Config Retrieved from the Database](http://www.baeldung.com/spring-dynamic-dto-validation) -- [Custom Information in Spring Boot Info Endpoint](http://www.baeldung.com/spring-boot-info-actuator-custom) -- [Using @JsonComponent in Spring Boot](http://www.baeldung.com/spring-boot-jsoncomponent) -- [Testing in Spring Boot](http://www.baeldung.com/spring-boot-testing) -- [How to Get All Spring-Managed Beans?](http://www.baeldung.com/spring-show-all-beans) -- [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) -- [Getting Started with GraphQL and Spring Boot](http://www.baeldung.com/spring-graphql) -- [Guide to Spring Type Conversions](http://www.baeldung.com/spring-type-conversions) -- [An Introduction to Kong](http://www.baeldung.com/kong) -- [Spring Boot: Customize Whitelabel Error Page](http://www.baeldung.com/spring-boot-custom-error-page) -- [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) -- [A Quick Intro to the SpringBootServletInitializer](http://www.baeldung.com/spring-boot-servlet-initializer) -- [How to Define a Spring Boot Filter?](http://www.baeldung.com/spring-boot-add-filter) -- [Spring Boot Exit Codes](http://www.baeldung.com/spring-boot-exit-codes) -- [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) -- [Spring Shutdown Callbacks](http://www.baeldung.com/spring-shutdown-callbacks) -- [Container Configuration in Spring Boot 2](http://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) +- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) +- [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan) +- [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) +- [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) +- [Using Custom Banners in Spring Boot](https://www.baeldung.com/spring-boot-custom-banners) +- [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) +- [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) +- [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) +- [Custom Information in Spring Boot Info Endpoint](https://www.baeldung.com/spring-boot-info-actuator-custom) +- [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent) +- [Testing in Spring Boot](https://www.baeldung.com/spring-boot-testing) +- [How to Get All Spring-Managed Beans?](https://www.baeldung.com/spring-show-all-beans) +- [Spring Boot and Togglz Aspect](https://www.baeldung.com/spring-togglz) +- [Getting Started with GraphQL and Spring Boot](https://www.baeldung.com/spring-graphql) +- [Guide to Spring Type Conversions](https://www.baeldung.com/spring-type-conversions) +- [An Introduction to Kong](https://www.baeldung.com/kong) +- [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) +- [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) +- [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) +- [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) +- [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) +- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) +- [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) +- [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) - [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey) - [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report) - [Injecting Git Information Into Spring](https://www.baeldung.com/spring-git-information) diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/Application.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java similarity index 78% rename from spring-boot/src/main/java/com/baeldung/validation/application/Application.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java index af8f768193..b37eec9da0 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/Application.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java @@ -1,7 +1,8 @@ -package com.baeldung.validation.application; +package com.baeldung.beanvalidation.application; + +import com.baeldung.beanvalidation.application.entities.User; +import com.baeldung.beanvalidation.application.repositories.UserRepository; -import com.baeldung.validation.application.entities.User; -import com.baeldung.validation.application.repositories.UserRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/controllers/UserController.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java similarity index 87% rename from spring-boot/src/main/java/com/baeldung/validation/application/controllers/UserController.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java index a4aeefb70b..0c47e27e25 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/controllers/UserController.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java @@ -1,7 +1,8 @@ -package com.baeldung.validation.application.controllers; +package com.baeldung.beanvalidation.application.controllers; + +import com.baeldung.beanvalidation.application.entities.User; +import com.baeldung.beanvalidation.application.repositories.UserRepository; -import com.baeldung.validation.application.entities.User; -import com.baeldung.validation.application.repositories.UserRepository; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/entities/User.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java similarity index 90% rename from spring-boot/src/main/java/com/baeldung/validation/application/entities/User.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java index 529368f132..8233d08f4e 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/entities/User.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java @@ -1,4 +1,4 @@ -package com.baeldung.validation.application.entities; +package com.baeldung.beanvalidation.application.entities; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/repositories/UserRepository.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java similarity index 59% rename from spring-boot/src/main/java/com/baeldung/validation/application/repositories/UserRepository.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java index b579addcaa..8bf7a9f8b2 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/repositories/UserRepository.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java @@ -1,8 +1,9 @@ -package com.baeldung.validation.application.repositories; +package com.baeldung.beanvalidation.application.repositories; -import com.baeldung.validation.application.entities.User; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; +import com.baeldung.beanvalidation.application.entities.User; + @Repository public interface UserRepository extends CrudRepository {} diff --git a/spring-boot/src/test/java/com/baeldung/validation/application/UserControllerIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java similarity index 91% rename from spring-boot/src/test/java/com/baeldung/validation/application/UserControllerIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java index 77a230ee6c..07d9b0807e 100644 --- a/spring-boot/src/test/java/com/baeldung/validation/application/UserControllerIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java @@ -1,7 +1,8 @@ -package com.baeldung.validation.application; +package com.baeldung.beanvalidation.application; + +import com.baeldung.beanvalidation.application.controllers.UserController; +import com.baeldung.beanvalidation.application.repositories.UserRepository; -import com.baeldung.validation.application.controllers.UserController; -import com.baeldung.validation.application.repositories.UserRepository; import java.nio.charset.Charset; import static org.assertj.core.api.Assertions.assertThat; import org.hamcrest.core.Is; diff --git a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java similarity index 87% rename from spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java index 86af985d8a..7be85b5e4f 100644 --- a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java @@ -2,11 +2,14 @@ package com.baeldung.jsondateformat; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.ResponseEntity; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -22,23 +25,33 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = DEFINED_PORT, classes = ContactApp.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class) @TestPropertySource(properties = { "spring.jackson.date-format=yyyy-MM-dd HH:mm:ss" }) -public class ContactAppIntegrationTest { +public class ContactAppUnitTest { private final ObjectMapper mapper = new ObjectMapper(); @Autowired TestRestTemplate restTemplate; + + @LocalServerPort + int port; + + String url; + @Before + public void before() { + url=String.format("http://localhost:%s", port); + } + @Test public void givenJsonFormatAnnotationAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException, ParseException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -53,7 +66,7 @@ public class ContactAppIntegrationTest { @Test public void givenJsonFormatAnnotationAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/javaUtilDate", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/javaUtilDate", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -68,7 +81,7 @@ public class ContactAppIntegrationTest { @Test public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plainWithJavaUtilDate", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plainWithJavaUtilDate", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -83,7 +96,7 @@ public class ContactAppIntegrationTest { @Test(expected = DateTimeParseException.class) public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenNotApplyFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plain", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plain", String.class); assertEquals(200, response.getStatusCodeValue()); diff --git a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java similarity index 82% rename from spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java index 554283d758..114f9bfc1a 100644 --- a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java @@ -2,11 +2,14 @@ package com.baeldung.jsondateformat; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; @@ -19,20 +22,30 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = DEFINED_PORT, classes = ContactApp.class) -public class ContactAppWithObjectMapperCustomizerIntegrationTest { +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class) +public class ContactAppWithObjectMapperCustomizerUnitTest { private final ObjectMapper mapper = new ObjectMapper(); @Autowired TestRestTemplate restTemplate; + @LocalServerPort + int port; + + String url; + + @Before + public void before() { + url=String.format("http://localhost:%s", port); + } + @Test public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plainWithJavaUtilDate", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plainWithJavaUtilDate", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -47,7 +60,7 @@ public class ContactAppWithObjectMapperCustomizerIntegrationTest { @Test public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plain", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plain", String.class); assertEquals(200, response.getStatusCodeValue()); diff --git a/spring-cloud-bus/README.md b/spring-cloud-bus/README.md index c5410ca4e2..dbbb8d7156 100644 --- a/spring-cloud-bus/README.md +++ b/spring-cloud-bus/README.md @@ -1,3 +1,7 @@ +## Spring Cloud Bus + +This module contains articles about Spring Cloud Bus + ### Relevant articles -- [Spring Cloud Bus](http://www.baeldung.com/spring-cloud-bus) +- [Spring Cloud Bus](https://www.baeldung.com/spring-cloud-bus) diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index c0298daeb1..0000000000 --- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.SpringCloudConfigClientApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringCloudConfigClientApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java index 8a33efef43..a401d41e1e 100644 --- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -7,12 +7,27 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.SpringCloudConfigClientApplication; +/** + * This LiveTest requires: + * 1- The 'spring-cloud-bus/spring-cloud-config-server' service running, with valid Spring Cloud Config properties, for instance: + * 1.1- `spring.cloud.config.server.git.uri` pointing to a valid URI, which has `user.role` and `user.password` properties configured in a properties file. For example, to achieve this in a dev environment: + * 1.1.1- `cd my/custom/path` + * 1.1.2- `git init .` + * 1.1.3- `echo user.role=Programmer >> application.properties` + * 1.1.4- `echo user.password=d3v3L >> application.properties` + * 1.1.5- `git add .` + * 1.1.6- `git commit -m 'inital commit'` + * 1.1.7- 'spring-cloud-bus/spring-cloud-config-server' with property `spring.cloud.config.server.git.uri=my/custom/path` + * + * Note: This is enough to run the ContextTest successfully, but to get the full functionality shown in the related article, we'll need also a RabbitMQ instance running (e.g. `docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management`) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringCloudConfigClientApplication.class) public class SpringContextLiveTest { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } diff --git a/spring-cloud-cli/README.md b/spring-cloud-cli/README.md index 7f29be3f07..46b47e0e08 100644 --- a/spring-cloud-cli/README.md +++ b/spring-cloud-cli/README.md @@ -1,6 +1,6 @@ -========= - ## Spring Cloud CLI +This module contains articles about Spring Cloud CLI + ### Relevant Articles: -- [Introduction to Spring Cloud CLI](http://www.baeldung.com/spring-cloud-cli) +- [Introduction to Spring Cloud CLI](https://www.baeldung.com/spring-cloud-cli) diff --git a/spring-cloud-data-flow/README.MD b/spring-cloud-data-flow/README.md similarity index 71% rename from spring-cloud-data-flow/README.MD rename to spring-cloud-data-flow/README.md index f2ab96de2c..c9b6891b54 100644 --- a/spring-cloud-data-flow/README.MD +++ b/spring-cloud-data-flow/README.md @@ -1,2 +1,3 @@ +## Spring Cloud Data Flow This is an aggregator module for Spring Cloud Data Flow modules. diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml index cf583c216a..7166b0fd32 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 data-flow-server @@ -12,7 +13,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 @@ -20,6 +21,16 @@ org.springframework.cloud spring-cloud-starter-dataflow-server-local + + org.hibernate + hibernate-core + ${hibernate.compatible.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.compatible.version} + @@ -42,8 +53,9 @@ - 1.1.0.RELEASE - Brixton.SR7 + 1.3.1.RELEASE + Edgware.SR6 + 5.2.12.Final diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties new file mode 100644 index 0000000000..20ad5d5bcb --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties @@ -0,0 +1,2 @@ +#spring.datasource.url=jdbc:h2:mem:dataflow +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java deleted file mode 100644 index 980c096f5e..0000000000 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.cloud.DataFlowServerApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = DataFlowServerApplication.class) -public class SpringContextLiveTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties new file mode 100644 index 0000000000..70e3e5c65b --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.datasource.url=jdbc:h2:mem:dataflow \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml index 52cb204201..9c379624d3 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 28dbc9a8d8..0000000000 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.cloud.DataFlowShellApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = DataFlowShellApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java index 5be4f9c077..1784eb772a 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -6,6 +6,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * complete data-flow server and shell setup running + * + *
+ * For more info: + * https://www.baeldung.com/spring-cloud-data-flow-stream-processing + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = DataFlowShellApplication.class) public class SpringContextLiveTest { diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml index ecabb91a98..73fb82d79f 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml index de354ca698..28a9d3e6e0 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml index a4d06e13d2..3b748fd7df 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud/README.md b/spring-cloud/README.md new file mode 100644 index 0000000000..2727aec08c --- /dev/null +++ b/spring-cloud/README.md @@ -0,0 +1,3 @@ +## Spring Cloud + +This module contains modules about Spring Cloud \ No newline at end of file diff --git a/spring-cloud/spring-cloud-archaius/README.md b/spring-cloud/spring-cloud-archaius/README.md index ae853c6ef0..3b5ed16373 100644 --- a/spring-cloud/spring-cloud-archaius/README.md +++ b/spring-cloud/spring-cloud-archaius/README.md @@ -1,10 +1,12 @@ +# Spring Cloud Archaius + +This module contains articles about Spring Cloud with Netflix Archaius + # Relevant Articles - [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration) - [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations) -# Spring Cloud Archaius - #### Basic Config This service has the basic, out-of-the-box Spring Cloud Netflix Archaius configuration. diff --git a/spring-cloud/spring-cloud-bootstrap/README.MD b/spring-cloud/spring-cloud-bootstrap/README.md similarity index 87% rename from spring-cloud/spring-cloud-bootstrap/README.MD rename to spring-cloud/spring-cloud-bootstrap/README.md index 7a3a94c8e3..01998ccf51 100644 --- a/spring-cloud/spring-cloud-bootstrap/README.MD +++ b/spring-cloud/spring-cloud-bootstrap/README.md @@ -1,3 +1,7 @@ +## Spring Cloud Bootstrap + +This module contains articles about bootstrapping Spring Cloud applications + ### Relevant Articles: - [Spring Cloud – Bootstrapping](http://www.baeldung.com/spring-cloud-bootstrapping) - [Spring Cloud – Securing Services](http://www.baeldung.com/spring-cloud-securing-services) @@ -5,6 +9,8 @@ - [Spring Cloud Series – The Gateway Pattern](http://www.baeldung.com/spring-cloud-gateway-pattern) - [Spring Cloud – Adding Angular 4](http://www.baeldung.com/spring-cloud-angular) +### Running the Project + - To run the project: - copy the appliction-config folder to c:\Users\{username}\ on Windows or /home/{username}/ on *nix. Then open a git bash terminal in application-config and run: - git init diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java deleted file mode 100644 index dc635cd003..0000000000 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.spring.cloud.bootstrap.gateway; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } - -} diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java index a3cbb3310d..a5c6ab612a 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java @@ -5,6 +5,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * Eureka server and Gateway application up and running + * + *
+ * For more info: + * https://www.baeldung.com/spring-cloud-netflix-eureka + * https://www.baeldung.com/spring-cloud-gateway-pattern + */ @RunWith(SpringRunner.class) @SpringBootTest public class SpringContextLiveTest { diff --git a/spring-cloud/spring-cloud-contract/README.md b/spring-cloud/spring-cloud-contract/README.md index 70e056757b..72a3627e30 100644 --- a/spring-cloud/spring-cloud-contract/README.md +++ b/spring-cloud/spring-cloud-contract/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Contract + +This module contains articles about Spring Cloud Contract + ### Relevant Articles: - [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) diff --git a/spring-cloud/spring-cloud-gateway/README.MD b/spring-cloud/spring-cloud-gateway/README.md similarity index 57% rename from spring-cloud/spring-cloud-gateway/README.MD rename to spring-cloud/spring-cloud-gateway/README.md index d945ae949c..e87bc547e1 100644 --- a/spring-cloud/spring-cloud-gateway/README.MD +++ b/spring-cloud/spring-cloud-gateway/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Gateway + +This module contains articles about Spring Cloud Gateway + ### Relevant Articles: - [Exploring the new Spring Cloud Gateway](http://www.baeldung.com/spring-cloud-gateway) diff --git a/spring-cloud/spring-cloud-kubernetes/README.md b/spring-cloud/spring-cloud-kubernetes/README.md index 32bcbc59b8..b64ad65ef9 100644 --- a/spring-cloud/spring-cloud-kubernetes/README.md +++ b/spring-cloud/spring-cloud-kubernetes/README.md @@ -1,3 +1,7 @@ +## Spring Cloud Kubernetes + +This moudle contains articles about Spring Cloud Kubernetes + ### Relevant Articles: - [Running Spring Boot Applications With Minikube](https://www.baeldung.com/spring-boot-minikube) diff --git a/spring-cloud/spring-cloud-rest/README.md b/spring-cloud/spring-cloud-rest/README.md index a650004708..25d62007b6 100644 --- a/spring-cloud/spring-cloud-rest/README.md +++ b/spring-cloud/spring-cloud-rest/README.md @@ -1,2 +1,5 @@ +## Spring Cloud REST + +This module contains articles about RESTful APIs with Spring Cloud Code for an ebook - "A REST API with Spring Boot and Spring Cloud" diff --git a/spring-cloud/spring-cloud-ribbon-client/README.md b/spring-cloud/spring-cloud-ribbon-client/README.md index 596b3226c8..d22b8ec8f8 100644 --- a/spring-cloud/spring-cloud-ribbon-client/README.md +++ b/spring-cloud/spring-cloud-ribbon-client/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Ribbon Client + +This module contains articles about Spring Cloud with Netflix Ribbon + ### Relevant Articles: - [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) diff --git a/spring-cloud/spring-cloud-security/README.md b/spring-cloud/spring-cloud-security/README.md index 7099406614..0f3b39c98b 100644 --- a/spring-cloud/spring-cloud-security/README.md +++ b/spring-cloud/spring-cloud-security/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Security + +This module contains articles about Spring Cloud Security + ### Relevant Articles: - [An Intro to Spring Cloud Security](http://www.baeldung.com/spring-cloud-security) diff --git a/spring-cloud/spring-cloud-stream/README.md b/spring-cloud/spring-cloud-stream/README.md index 5ecb852df5..fd1eeccfda 100644 --- a/spring-cloud/spring-cloud-stream/README.md +++ b/spring-cloud/spring-cloud-stream/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Stream + +This module contains articles about Spring Cloud Stream + ## Relevant Articles - [Introduction to Spring Cloud Stream](http://www.baeldung.com/spring-cloud-stream) diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml index 13ad18810e..18bc426364 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml @@ -18,6 +18,8 @@ 1.8 Greenwich.SR1 + 4.0.0 + 1.8.2 @@ -41,19 +43,19 @@ io.confluent kafka-avro-serializer - 4.0.0 + ${kafka-avro-serializer.version} org.apache.avro avro-compiler - 1.8.2 + ${avro.version} org.apache.avro avro-maven-plugin - 1.8.2 + ${avro.version} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml new file mode 100644 index 0000000000..3817f2747a --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + spring-cloud-stream-kinesis + spring-cloud-stream-kinesis + + + org.springframework.boot + spring-boot-starter-parent + 2.1.8.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.cloud + spring-cloud-stream-binder-kinesis + ${spring-cloud-stream-kinesis-binder.version} + + + + com.amazonaws + aws-java-sdk-kinesis + ${aws-sdk.version} + + + + org.springframework.cloud + spring-cloud-stream-test-support + ${spring-cloud-stream-test.version} + test + + + + + 1.11.632 + 1.2.1.RELEASE + 2.2.1.RELEASE + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java new file mode 100644 index 0000000000..c863cd8fe2 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java @@ -0,0 +1,30 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.messaging.support.MessageBuilder; + +@SpringBootApplication +@EnableBinding(Processor.class) +public class KinesisApplication { + + public static void main(String[] args) { + SpringApplication.run(KinesisApplication.class, args); + } + + @Autowired + private Processor processor; + + @StreamListener(Processor.INPUT) + public void consume(String val) { + System.out.println(val); + } + + public void produce(String val) { + processor.output().send(MessageBuilder.withPayload(val).build()); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties new file mode 100644 index 0000000000..1a966c64fb --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -0,0 +1,11 @@ +cloud.aws.credentials.access-key=aws-key +cloud.aws.credentials.secret-key=aws-secret +cloud.aws.region.static=eu-central-1 +cloud.aws.stack.auto=false + +spring.cloud.stream.bindings.output.destination=myStream +spring.cloud.stream.bindings.output.content-type=text/plain + +spring.cloud.stream.bindings.input.destination=myStream +spring.cloud.stream.bindings.input.group=myStream-group +spring.cloud.stream.bindings.input.content-type=text/plain \ No newline at end of file diff --git a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java similarity index 70% rename from spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java rename to spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java index 18fabce5ca..4e1c281cfb 100644 --- a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java @@ -5,13 +5,11 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.spring.Application; - @RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class SpringContextIntegrationTest { - +@SpringBootTest(classes = KinesisApplication.class) +public class KinesisApplicationIntegrationTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } -} +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties new file mode 100644 index 0000000000..48005616ec --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties @@ -0,0 +1,2 @@ +cloud.aws.region.static=eu-central-1 +cloud.aws.stack.auto=false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/README.md b/spring-cloud/spring-cloud-task/README.md index cabc1ac854..8f6ee26099 100644 --- a/spring-cloud/spring-cloud-task/README.md +++ b/spring-cloud/spring-cloud-task/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Task + +This module contains articles about Spring Cloud Task + ### Relevant Articles: - [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task) diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml index 89c9318c4e..b6b5a1cf0f 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 org.baeldung.cloud @@ -43,6 +44,11 @@ org.springframework.cloud spring-cloud-task-batch + + com.h2database + h2 + test +
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java index be2a173589..30e17cb956 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java @@ -14,6 +14,13 @@ import org.springframework.cloud.task.configuration.EnableTask; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; +/** + * This Application requires: + * * a MySql instance running, that allows a root user with no password, and with a database named + * + * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`) + * + */ @SpringBootApplication @EnableTask @EnableBatchProcessing diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 60% rename from spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java index ddbcbf65ea..0caa626c14 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -10,18 +10,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.task.JobConfiguration; import com.baeldung.task.TaskDemo; -/** - * This Live Test requires: - * * a MySql instance running, that allows a root user with no password, and with a database named - * - * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`) - * - */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootApplication -@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = { - ConfigFileApplicationContextInitializer.class }) -public class SpringContextLiveTest { +@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = { ConfigFileApplicationContextInitializer.class }) +public class SpringContextIntegrationTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml new file mode 100644 index 0000000000..794ac4d247 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:springcloud + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java deleted file mode 100644 index e1eb2f8e24..0000000000 --- a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.spring.cloud.vaultsample; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = VaultSampleApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java index 3be4d96964..82fe3d7a4a 100644 --- a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java @@ -5,6 +5,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * vault server up and running on the environment + * + *
+ * For more info on setting up the vault server: + * https://www.baeldung.com/vault + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = VaultSampleApplication.class) public class SpringContextLiveTest { diff --git a/spring-cloud/spring-cloud-zookeeper/README.md b/spring-cloud/spring-cloud-zookeeper/README.md index a49a448833..2bef63ef9f 100644 --- a/spring-cloud/spring-cloud-zookeeper/README.md +++ b/spring-cloud/spring-cloud-zookeeper/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Zookeeper + +This module contains articles about Spring Cloud Zookeeper + ### Relevant Articles: - [An Intro to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index d346943ac4..7ff3a628a1 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -1,14 +1,10 @@ -========= +## Spring Core -## Spring General Example Project +This module contains articles about core Spring functionality -This project is used to replicate Spring Exceptions only. +## Relevant Articles: -### The Course - -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant articles: +- [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) - [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) - [Spring Profiles](http://www.baeldung.com/spring-profiles) @@ -20,4 +16,8 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) -- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) \ No newline at end of file +- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) +- [Exploring the Spring BeanFactory API](https://www.baeldung.com/spring-beanfactory) +- [How to use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean) +- [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections) +- More articles: [[<-- prev]](/spring-core) \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/beanfactory/Employee.java b/spring-core-2/src/main/java/com/baeldung/beanfactory/Employee.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/beanfactory/Employee.java rename to spring-core-2/src/main/java/com/baeldung/beanfactory/Employee.java diff --git a/spring-core/src/main/java/com/baeldung/collection/BaeldungBean.java b/spring-core-2/src/main/java/com/baeldung/collection/BaeldungBean.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/BaeldungBean.java rename to spring-core-2/src/main/java/com/baeldung/collection/BaeldungBean.java diff --git a/spring-core/src/main/java/com/baeldung/collection/CollectionConfig.java b/spring-core-2/src/main/java/com/baeldung/collection/CollectionConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/CollectionConfig.java rename to spring-core-2/src/main/java/com/baeldung/collection/CollectionConfig.java diff --git a/spring-core/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java b/spring-core-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java rename to spring-core-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java diff --git a/spring-core/src/main/java/com/baeldung/collection/CollectionsBean.java b/spring-core-2/src/main/java/com/baeldung/collection/CollectionsBean.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/CollectionsBean.java rename to spring-core-2/src/main/java/com/baeldung/collection/CollectionsBean.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java b/spring-core-2/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java b/spring-core-2/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/README.md b/spring-core-2/src/main/java/com/baeldung/factorybean/README.md similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/README.md rename to spring-core-2/src/main/java/com/baeldung/factorybean/README.md diff --git a/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java b/spring-core-2/src/main/java/com/baeldung/factorybean/SingleToolFactory.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/SingleToolFactory.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/Tool.java b/spring-core-2/src/main/java/com/baeldung/factorybean/Tool.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/Tool.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/Tool.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java b/spring-core-2/src/main/java/com/baeldung/factorybean/ToolFactory.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/ToolFactory.java diff --git a/spring-core-2/src/main/java/org/baeldung/spring/config/ScopesConfig.java b/spring-core-2/src/main/java/org/baeldung/spring/config/ScopesConfig.java index b5fe494ee2..e69de29bb2 100644 --- a/spring-core-2/src/main/java/org/baeldung/spring/config/ScopesConfig.java +++ b/spring-core-2/src/main/java/org/baeldung/spring/config/ScopesConfig.java @@ -1,63 +0,0 @@ -package org.baeldung.spring.config; - -import org.baeldung.scopes.HelloMessageGenerator; -import org.baeldung.scopes.Person; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; -import org.springframework.context.annotation.ScopedProxyMode; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.view.JstlView; -import org.springframework.web.servlet.view.UrlBasedViewResolver; - -@Configuration -@ComponentScan("org.baeldung.scopes") -@EnableWebMvc -public class ScopesConfig { - @Bean - public UrlBasedViewResolver setupViewResolver() { - final UrlBasedViewResolver resolver = new UrlBasedViewResolver(); - resolver.setPrefix("/WEB-INF/view/"); - resolver.setSuffix(".jsp"); - resolver.setViewClass(JstlView.class); - return resolver; - } - - @Bean - @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) - public HelloMessageGenerator requestScopedBean() { - return new HelloMessageGenerator(); - } - - @Bean - @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) - public HelloMessageGenerator sessionScopedBean() { - return new HelloMessageGenerator(); - } - - @Bean - @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) - public HelloMessageGenerator applicationScopedBean() { - return new HelloMessageGenerator(); - } - - @Bean - @Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS) - public HelloMessageGenerator websocketScopedBean() { - return new HelloMessageGenerator(); - } - - @Bean - @Scope("prototype") - public Person personPrototype() { - return new Person(); - } - - @Bean - @Scope("singleton") - public Person personSingleton() { - return new Person(); - } -} diff --git a/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-core-2/src/main/resources/factorybean-abstract-spring-ctx.xml similarity index 100% rename from spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml rename to spring-core-2/src/main/resources/factorybean-abstract-spring-ctx.xml diff --git a/spring-core/src/main/resources/factorybean-spring-ctx.xml b/spring-core-2/src/main/resources/factorybean-spring-ctx.xml similarity index 100% rename from spring-core/src/main/resources/factorybean-spring-ctx.xml rename to spring-core-2/src/main/resources/factorybean-spring-ctx.xml diff --git a/spring-core/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/beanfactory/README.md b/spring-core-2/src/test/java/com/baeldung/beanfactory/README.md similarity index 100% rename from spring-core/src/test/java/com/baeldung/beanfactory/README.md rename to spring-core-2/src/test/java/com/baeldung/beanfactory/README.md diff --git a/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java diff --git a/spring-core/src/test/resources/beanfactory-example.xml b/spring-core-2/src/test/resources/beanfactory-example.xml similarity index 100% rename from spring-core/src/test/resources/beanfactory-example.xml rename to spring-core-2/src/test/resources/beanfactory-example.xml diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index 4d83d03ffd..7ed4a2df86 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/pom.xml @@ -29,6 +29,11 @@ spring-core ${spring.version} + + org.springframework + spring-test + ${spring.version} + org.junit.jupiter junit-jupiter-engine diff --git a/spring-core/README.md b/spring-core/README.md index 111b034bef..6d274e89f0 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -1,22 +1,17 @@ +## Spring Core + +This module contains articles about core Spring functionality + ### Relevant Articles: -- [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire) -- [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory) -- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) -- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) -- [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) -- [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils) -- [XML-Based Injection in Spring](http://www.baeldung.com/spring-xml-injection) -- [A Quick Guide to the Spring @Lazy Annotation](http://www.baeldung.com/spring-lazy-annotation) -- [Injecting Prototype Beans into a Singleton Instance in Spring](http://www.baeldung.com/spring-inject-prototype-bean-into-singleton) -- [@Lookup Annotation in Spring](http://www.baeldung.com/spring-lookup) -- [BeanNameAware and BeanFactoryAware Interfaces in Spring](http://www.baeldung.com/spring-bean-name-factory-aware) -- [Spring – Injecting Collections](http://www.baeldung.com/spring-injecting-collections) -- [Access a File from the Classpath in a Spring Application](http://www.baeldung.com/spring-classpath-file-access) -- [Controlling Bean Creation Order with @DependsOn Annotation](http://www.baeldung.com/spring-depends-on) -- [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics) +- [Wiring in Spring: @Autowired, @Resource and @Inject](https://www.baeldung.com/spring-annotations-resource-inject-autowire) +- [Constructor Injection in Spring with Lombok](httsp://www.baeldung.com/spring-injection-lombok) +- [Introduction to Spring’s StreamUtils](https://www.baeldung.com/spring-stream-utils) +- [XML-Based Injection in Spring](httsp://www.baeldung.com/spring-xml-injection) +- [A Quick Guide to the Spring @Lazy Annotation](https://www.baeldung.com/spring-lazy-annotation) +- [BeanNameAware and BeanFactoryAware Interfaces in Spring](https://www.baeldung.com/spring-bean-name-factory-aware) +- [Access a File from the Classpath in a Spring Application](https://www.baeldung.com/spring-classpath-file-access) - [Spring Application Context Events](https://www.baeldung.com/spring-context-events) -- [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency) - [What is a Spring Bean?](https://www.baeldung.com/spring-bean) - [Spring PostConstruct and PreDestroy Annotations](https://www.baeldung.com/spring-postconstruct-predestroy) -- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) -- [Circular Dependencies in Spring](http://www.baeldung.com/circular-dependencies-in-spring) +- More articles: [[next -->]](/spring-core-2) + diff --git a/spring-core/src/main/java/com/baeldung/definition/Config.java b/spring-core/src/main/java/com/baeldung/springbean/Config.java similarity index 74% rename from spring-core/src/main/java/com/baeldung/definition/Config.java rename to spring-core/src/main/java/com/baeldung/springbean/Config.java index 126e6259ca..27275dbb0f 100644 --- a/spring-core/src/main/java/com/baeldung/definition/Config.java +++ b/spring-core/src/main/java/com/baeldung/springbean/Config.java @@ -1,11 +1,12 @@ -package com.baeldung.definition; +package com.baeldung.springbean; -import com.baeldung.definition.domain.Address; -import com.baeldung.definition.domain.Company; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import com.baeldung.springbean.domain.Address; +import com.baeldung.springbean.domain.Company; + @Configuration @ComponentScan(basePackageClasses = Company.class) public class Config { diff --git a/spring-core/src/main/java/com/baeldung/definition/domain/Address.java b/spring-core/src/main/java/com/baeldung/springbean/domain/Address.java similarity index 84% rename from spring-core/src/main/java/com/baeldung/definition/domain/Address.java rename to spring-core/src/main/java/com/baeldung/springbean/domain/Address.java index 91be18398e..5704be4bf8 100644 --- a/spring-core/src/main/java/com/baeldung/definition/domain/Address.java +++ b/spring-core/src/main/java/com/baeldung/springbean/domain/Address.java @@ -1,4 +1,4 @@ -package com.baeldung.definition.domain; +package com.baeldung.springbean.domain; import lombok.Data; diff --git a/spring-core/src/main/java/com/baeldung/definition/domain/Company.java b/spring-core/src/main/java/com/baeldung/springbean/domain/Company.java similarity index 84% rename from spring-core/src/main/java/com/baeldung/definition/domain/Company.java rename to spring-core/src/main/java/com/baeldung/springbean/domain/Company.java index eabde8afdf..68c177dab7 100644 --- a/spring-core/src/main/java/com/baeldung/definition/domain/Company.java +++ b/spring-core/src/main/java/com/baeldung/springbean/domain/Company.java @@ -1,4 +1,4 @@ -package com.baeldung.definition.domain; +package com.baeldung.springbean.domain; import lombok.Data; import org.springframework.stereotype.Component; diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java similarity index 99% rename from spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java rename to spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java index c7a2984045..b57a64a8c6 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.resource; +package com.baeldung.classpathfileaccess; import static org.junit.Assert.assertEquals; diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java b/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java rename to spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java b/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java rename to spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java diff --git a/spring-core/src/test/java/com/baeldung/definition/SpringBeanIntegrationTest.java b/spring-core/src/test/java/com/baeldung/springbean/SpringBeanIntegrationTest.java similarity index 88% rename from spring-core/src/test/java/com/baeldung/definition/SpringBeanIntegrationTest.java rename to spring-core/src/test/java/com/baeldung/springbean/SpringBeanIntegrationTest.java index 0057611308..e148ab2dd9 100644 --- a/spring-core/src/test/java/com/baeldung/definition/SpringBeanIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/springbean/SpringBeanIntegrationTest.java @@ -1,11 +1,12 @@ -package com.baeldung.definition; +package com.baeldung.springbean; + +import static org.junit.Assert.assertEquals; -import com.baeldung.definition.domain.Company; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import static org.junit.Assert.assertEquals; +import com.baeldung.springbean.domain.Company; public class SpringBeanIntegrationTest { @Test diff --git a/spring-cucumber/README.md b/spring-cucumber/README.md index 1e506f3a09..85bc1f65d5 100644 --- a/spring-cucumber/README.md +++ b/spring-cucumber/README.md @@ -1,2 +1,6 @@ +## Spring Cucumber + +This module contains articles about Spring testing with Cucumber + ### Relevant Articles: -- [Cucumber Spring Integration](http://www.baeldung.com/cucumber-spring-integration) +- [Cucumber Spring Integration](https://www.baeldung.com/cucumber-spring-integration) diff --git a/spring-data-rest-querydsl/README.md b/spring-data-rest-querydsl/README.md index 03b5fee06a..05ae03ab87 100644 --- a/spring-data-rest-querydsl/README.md +++ b/spring-data-rest-querydsl/README.md @@ -1,2 +1,6 @@ +## Spring Data REST Querydsl + +This module contains articles about Querydsl with Spring Data REST + ### Relevant Articles: -- [REST Query Language Over Multiple Tables with Querydsl Web Support](http://www.baeldung.com/rest-querydsl-multiple-tables) +- [REST Query Language Over Multiple Tables with Querydsl Web Support](https://www.baeldung.com/rest-querydsl-multiple-tables) diff --git a/spring-data-rest-querydsl/pom.xml b/spring-data-rest-querydsl/pom.xml index 55ff78f0cb..2c75990c65 100644 --- a/spring-data-rest-querydsl/pom.xml +++ b/spring-data-rest-querydsl/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 com.baeldung @@ -44,6 +45,11 @@ spring-boot-starter-test test + + com.h2database + h2 + test +
diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java index 28d084a4dc..4b2f567090 100644 --- a/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java +++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java @@ -13,6 +13,9 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import javax.annotation.PostConstruct; +/** + * Note: In the IDE, remember to generate query type classes before running the Integration Test (e.g. in Eclipse right-click on the project > Run As > Maven generate sources) + */ @SpringBootApplication @EntityScan("com.baeldung.entity") @EnableJpaRepositories("com.baeldung.controller.repository") diff --git a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java similarity index 60% rename from spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java index 5cb0a8167e..48c4630fa5 100644 --- a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,9 +7,13 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.Application; +/** + * Note: In the IDE, remember to generate query type classes before running the Integration Test (e.g. in Eclipse right-click on the project > Run As > Maven generate sources) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) -public class SpringContextLiveTest { +public class SpringContextTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-data-rest-querydsl/src/test/resources/application.yml b/spring-data-rest-querydsl/src/test/resources/application.yml new file mode 100644 index 0000000000..33b7231838 --- /dev/null +++ b/spring-data-rest-querydsl/src/test/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:springcloud + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index abbacb69cc..bae2fe8eaf 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -1,9 +1,21 @@ +## Spring Data REST + +This module contains articles about Spring Data REST + +### Relevant Articles: +- [Introduction to Spring Data REST](https://www.baeldung.com/spring-data-rest-intro) +- [Guide to Spring Data REST Validators](https://www.baeldung.com/spring-data-rest-validators) +- [Working with Relationships in Spring Data REST](https://www.baeldung.com/spring-data-rest-relationships) +- [AngularJS CRUD Application with Spring Data REST](https://www.baeldung.com/angularjs-crud-with-spring-data-rest) +- [Projections and Excerpts in Spring Data REST](https://www.baeldung.com/spring-data-rest-projections-excerpts) +- [Spring Data REST Events with @RepositoryEventHandler](https://www.baeldung.com/spring-data-rest-events) +- [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) +- [Spring Boot with SQLite](https://www.baeldung.com/spring-boot-sqlite) +- [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support) + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring -# About this project -This project contains examples from the [Introduction to Spring Data REST](http://www.baeldung.com/spring-data-rest-intro) article from Baeldung. - # Running the project The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so it is easy to run. You can start it any of a few ways: * Run the `main` method from `SpringDataRestApplication` @@ -12,14 +24,3 @@ The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so i # Viewing the running application To view the running application, visit [http://localhost:8080](http://localhost:8080) in your browser - -### Relevant Articles: -- [Guide to Spring Data REST Validators](http://www.baeldung.com/spring-data-rest-validators) -- [Working with Relationships in Spring Data REST](http://www.baeldung.com/spring-data-rest-relationships) -- [AngularJS CRUD Application with Spring Data REST](http://www.baeldung.com/angularjs-crud-with-spring-data-rest) -- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases) -- [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts) -- [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events) -- [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) -- [Spring Boot with SQLite](https://www.baeldung.com/spring-boot-sqlite) -- [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support) diff --git a/spring-di/README.md b/spring-di/README.md index a61ebe5127..7571b12916 100644 --- a/spring-di/README.md +++ b/spring-di/README.md @@ -1,3 +1,15 @@ +## Spring Dependency Injection + +This module contains articles about dependency injection with Spring + ### Relevant Articles - [The Spring @Qualifier Annotation](https://www.baeldung.com/spring-qualifier-annotation) +- [Constructor Dependency Injection in Spring](https://www.baeldung.com/constructor-injection-in-spring) +- [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics) +- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) +- [Injecting Prototype Beans into a Singleton Instance in Spring](https://www.baeldung.com/spring-inject-prototype-bean-into-singleton) +- [@Lookup Annotation in Spring](https://www.baeldung.com/spring-lookup) +- [Controlling Bean Creation Order with @DependsOn Annotation](https://www.baeldung.com/spring-depends-on) +- [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency) +- [Circular Dependencies in Spring](https://www.baeldung.com/circular-dependencies-in-spring) diff --git a/spring-di/pom.xml b/spring-di/pom.xml index f3ad380778..c865815753 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -9,18 +9,70 @@ spring-di - parent-boot-2 com.baeldung + parent-spring-5 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-spring-5 - + + org.springframework + spring-test + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + org.springframework spring-context + ${spring.version} + + javax.inject + javax.inject + ${javax.inject.version} + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.springframework.boot + spring-boot-starter + ${spring-boot.version} + + + org.springframework.boot + spring-boot-test + ${mockito.spring.boot.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + commons-io + commons-io + ${commons.io.version} + + + + + + javax.annotation @@ -28,12 +80,12 @@ ${annotation-api.version} - - - org.springframework - spring-test - test - + + + + + + @@ -66,7 +118,7 @@ org.apache.maven.plugins maven-war-plugin - 3.2.2 + ${maven-war-plugin.version} false @@ -97,6 +149,14 @@ 5.0.6.RELEASE 1.3.2 + + 1.4.4.RELEASE + 1 + 20.0 + 2.5 + 1.5.2.RELEASE + 1.10.19 + 3.12.2 \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java b/spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java rename to spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java diff --git a/spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java b/spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java rename to spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java diff --git a/spring-core/src/main/java/com/baeldung/constructordi/Config.java b/spring-di/src/main/java/com/baeldung/constructordi/Config.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/constructordi/Config.java rename to spring-di/src/main/java/com/baeldung/constructordi/Config.java diff --git a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java b/spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java rename to spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java index bffd35ec59..abbe97a4bd 100644 --- a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java +++ b/spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java @@ -1,31 +1,31 @@ -package com.baeldung.constructordi; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.constructordi.domain.Car; - -public class SpringRunner { - public static void main(String[] args) { - Car toyota = getCarFromXml(); - - System.out.println(toyota); - - toyota = getCarFromJavaConfig(); - - System.out.println(toyota); - } - - private static Car getCarFromJavaConfig() { - ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); - - return context.getBean(Car.class); - } - - private static Car getCarFromXml() { - ApplicationContext context = new ClassPathXmlApplicationContext("constructordi.xml"); - - return context.getBean(Car.class); - } -} +package com.baeldung.constructordi; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.constructordi.domain.Car; + +public class SpringRunner { + public static void main(String[] args) { + Car toyota = getCarFromXml(); + + System.out.println(toyota); + + toyota = getCarFromJavaConfig(); + + System.out.println(toyota); + } + + private static Car getCarFromJavaConfig() { + ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); + + return context.getBean(Car.class); + } + + private static Car getCarFromXml() { + ApplicationContext context = new ClassPathXmlApplicationContext("constructordi.xml"); + + return context.getBean(Car.class); + } +} diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java b/spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java rename to spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java index 5c9467fdf4..9f68ba5cd9 100644 --- a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java +++ b/spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java @@ -1,21 +1,21 @@ -package com.baeldung.constructordi.domain; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class Car { - private Engine engine; - private Transmission transmission; - - @Autowired - public Car(Engine engine, Transmission transmission) { - this.engine = engine; - this.transmission = transmission; - } - - @Override - public String toString() { - return String.format("Engine: %s Transmission: %s", engine, transmission); - } -} +package com.baeldung.constructordi.domain; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Car { + private Engine engine; + private Transmission transmission; + + @Autowired + public Car(Engine engine, Transmission transmission) { + this.engine = engine; + this.transmission = transmission; + } + + @Override + public String toString() { + return String.format("Engine: %s Transmission: %s", engine, transmission); + } +} diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java b/spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java rename to spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java b/spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java rename to spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java b/spring-di/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java rename to spring-di/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/ArbitraryDependency.java b/spring-di/src/main/java/com/baeldung/dependency/ArbitraryDependency.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/ArbitraryDependency.java rename to spring-di/src/main/java/com/baeldung/dependency/ArbitraryDependency.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java b/spring-di/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java rename to spring-di/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java b/spring-di/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java b/spring-di/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java b/spring-di/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java b/spring-di/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java b/spring-di/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/DriverApplication.java b/spring-di/src/main/java/com/baeldung/dependson/DriverApplication.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/DriverApplication.java rename to spring-di/src/main/java/com/baeldung/dependson/DriverApplication.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/config/Config.java b/spring-di/src/main/java/com/baeldung/dependson/config/Config.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/config/Config.java rename to spring-di/src/main/java/com/baeldung/dependson/config/Config.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java b/spring-di/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java rename to spring-di/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/file/reader/FileReader.java b/spring-di/src/main/java/com/baeldung/dependson/file/reader/FileReader.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/file/reader/FileReader.java rename to spring-di/src/main/java/com/baeldung/dependson/file/reader/FileReader.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java b/spring-di/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java rename to spring-di/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/shared/File.java b/spring-di/src/main/java/com/baeldung/dependson/shared/File.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/shared/File.java rename to spring-di/src/main/java/com/baeldung/dependson/shared/File.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/Account.java b/spring-di/src/main/java/com/baeldung/di/spring/Account.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/Account.java rename to spring-di/src/main/java/com/baeldung/di/spring/Account.java index 6d9883bda5..e34f2864e5 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/Account.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/Account.java @@ -1,27 +1,27 @@ -package com.baeldung.di.spring; - -import org.springframework.stereotype.Component; - -@Component -public class Account { - - private String accountNumber; - private String type; - - public String getAccountNumber() { - return accountNumber; - } - - public void setAccountNumber(String accountNumber) { - this.accountNumber = accountNumber; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - -} +package com.baeldung.di.spring; + +import org.springframework.stereotype.Component; + +@Component +public class Account { + + private String accountNumber; + private String type; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AccountService.java b/spring-di/src/main/java/com/baeldung/di/spring/AccountService.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/AccountService.java rename to spring-di/src/main/java/com/baeldung/di/spring/AccountService.java index 75ba6bb3eb..388c8c03db 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/AccountService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/AccountService.java @@ -1,5 +1,5 @@ -package com.baeldung.di.spring; - -public interface AccountService { - -} +package com.baeldung.di.spring; + +public interface AccountService { + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java similarity index 95% rename from spring-core/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java index 4a4baf7d92..6a3e4619f3 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java @@ -1,8 +1,8 @@ -package com.baeldung.di.spring; - -import org.springframework.stereotype.Component; - -@Component -public class AccountServiceImpl implements AccountService { - -} +package com.baeldung.di.spring; + +import org.springframework.stereotype.Component; + +@Component +public class AccountServiceImpl implements AccountService { + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AudioBookService.java b/spring-di/src/main/java/com/baeldung/di/spring/AudioBookService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AudioBookService.java rename to spring-di/src/main/java/com/baeldung/di/spring/AudioBookService.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AuthorService.java b/spring-di/src/main/java/com/baeldung/di/spring/AuthorService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AuthorService.java rename to spring-di/src/main/java/com/baeldung/di/spring/AuthorService.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/BookService.java b/spring-di/src/main/java/com/baeldung/di/spring/BookService.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/BookService.java rename to spring-di/src/main/java/com/baeldung/di/spring/BookService.java index 8e693e687d..6b25137ced 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/BookService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/BookService.java @@ -1,5 +1,5 @@ -package com.baeldung.di.spring; - -public interface BookService { - -} +package com.baeldung.di.spring; + +public interface BookService { + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/BookServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/BookServiceImpl.java similarity index 95% rename from spring-core/src/main/java/com/baeldung/di/spring/BookServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/BookServiceImpl.java index b4ea602234..7cbb7e9b89 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/BookServiceImpl.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/BookServiceImpl.java @@ -1,10 +1,10 @@ -package com.baeldung.di.spring; - -import org.springframework.beans.factory.annotation.Autowired; - -public class BookServiceImpl implements BookService { - - @Autowired(required = false) - private AuthorService authorService; - -} +package com.baeldung.di.spring; + +import org.springframework.beans.factory.annotation.Autowired; + +public class BookServiceImpl implements BookService { + + @Autowired(required = false) + private AuthorService authorService; + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/Foo.java b/spring-di/src/main/java/com/baeldung/di/spring/Foo.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/Foo.java rename to spring-di/src/main/java/com/baeldung/di/spring/Foo.java index 9d9b5d0888..6b2ba9b602 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/Foo.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/Foo.java @@ -1,4 +1,4 @@ -package com.baeldung.di.spring; - -public class Foo { -} +package com.baeldung.di.spring; + +public class Foo { +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/FooProcessor.java b/spring-di/src/main/java/com/baeldung/di/spring/FooProcessor.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/FooProcessor.java rename to spring-di/src/main/java/com/baeldung/di/spring/FooProcessor.java index 9baaaef7a3..74f4d3a92b 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/FooProcessor.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/FooProcessor.java @@ -1,6 +1,6 @@ -package com.baeldung.di.spring; - -public class FooProcessor { - - private Foo foo; +package com.baeldung.di.spring; + +public class FooProcessor { + + private Foo foo; } \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/di/spring/IService.java b/spring-di/src/main/java/com/baeldung/di/spring/IService.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/IService.java rename to spring-di/src/main/java/com/baeldung/di/spring/IService.java index 478eea0657..8c27f91589 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/IService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/IService.java @@ -1,5 +1,5 @@ -package com.baeldung.di.spring; - -public interface IService { - public String serve(); -} +package com.baeldung.di.spring; + +public interface IService { + public String serve(); +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/IndexApp.java b/spring-di/src/main/java/com/baeldung/di/spring/IndexApp.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/IndexApp.java rename to spring-di/src/main/java/com/baeldung/di/spring/IndexApp.java index a45970d6b2..d3ca2158cd 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/IndexApp.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/IndexApp.java @@ -1,19 +1,19 @@ -package com.baeldung.di.spring; - -public class IndexApp { - - private IService service; - - public String getServiceValue() { - return service.serve(); - } - - public IService getService() { - return service; - } - - public void setService(IService service) { - this.service = service; - } - -} +package com.baeldung.di.spring; + +public class IndexApp { + + private IService service; + + public String getServiceValue() { + return service.serve(); + } + + public IService getService() { + return service; + } + + public void setService(IService service) { + this.service = service; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/IndexService.java b/spring-di/src/main/java/com/baeldung/di/spring/IndexService.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/IndexService.java rename to spring-di/src/main/java/com/baeldung/di/spring/IndexService.java index ad241f5200..cbd4c28f3c 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/IndexService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/IndexService.java @@ -1,10 +1,10 @@ -package com.baeldung.di.spring; - -public class IndexService implements IService { - - @Override - public String serve() { - return "Hello World"; - } - -} +package com.baeldung.di.spring; + +public class IndexService implements IService { + + @Override + public String serve() { + return "Hello World"; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java b/spring-di/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java rename to spring-di/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java index f083504e8f..2cc7ff65ae 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java @@ -1,14 +1,14 @@ -package com.baeldung.di.spring; - -public class InstanceServiceFactory { - public IService getService(int number) { - switch (number) { - case 1: - return new MessageService("Foo"); - case 0: - return new IndexService(); - default: - throw new IllegalArgumentException("Unknown parameter " + number); - } - } -} +package com.baeldung.di.spring; + +public class InstanceServiceFactory { + public IService getService(int number) { + switch (number) { + case 1: + return new MessageService("Foo"); + case 0: + return new IndexService(); + default: + throw new IllegalArgumentException("Unknown parameter " + number); + } + } +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/MessageApp.java b/spring-di/src/main/java/com/baeldung/di/spring/MessageApp.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/MessageApp.java rename to spring-di/src/main/java/com/baeldung/di/spring/MessageApp.java index 1bf6c20b28..bb8188853a 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/MessageApp.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/MessageApp.java @@ -1,14 +1,14 @@ -package com.baeldung.di.spring; - -public class MessageApp { - - private IService iService; - - public MessageApp(IService iService) { - this.iService = iService; - } - - public String getServiceValue() { - return iService.serve(); - } -} +package com.baeldung.di.spring; + +public class MessageApp { + + private IService iService; + + public MessageApp(IService iService) { + this.iService = iService; + } + + public String getServiceValue() { + return iService.serve(); + } +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/MessageService.java b/spring-di/src/main/java/com/baeldung/di/spring/MessageService.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/MessageService.java rename to spring-di/src/main/java/com/baeldung/di/spring/MessageService.java index 9b6efaab2a..1bb548bdf6 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/MessageService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/MessageService.java @@ -1,16 +1,16 @@ -package com.baeldung.di.spring; - -public class MessageService implements IService { - - private String message; - - public MessageService(String message) { - this.message = message; - } - - @Override - public String serve() { - return message; - } - -} +package com.baeldung.di.spring; + +public class MessageService implements IService { + + private String message; + + public MessageService(String message) { + this.message = message; + } + + @Override + public String serve() { + return message; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/PersonDao.java b/spring-di/src/main/java/com/baeldung/di/spring/PersonDao.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/PersonDao.java rename to spring-di/src/main/java/com/baeldung/di/spring/PersonDao.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java b/spring-di/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java rename to spring-di/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/SpringMainConfig.java b/spring-di/src/main/java/com/baeldung/di/spring/SpringMainConfig.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/di/spring/SpringMainConfig.java rename to spring-di/src/main/java/com/baeldung/di/spring/SpringMainConfig.java index 75066fd539..374a7e8e32 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/SpringMainConfig.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/SpringMainConfig.java @@ -1,18 +1,18 @@ -package com.baeldung.di.spring; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -@Configuration -@Import({ SpringBeansConfig.class }) -@ComponentScan("com.baeldung.di.spring") -public class SpringMainConfig { - - @Bean - public BookService bookServiceGenerator() { - return new BookServiceImpl(); - } - -} +package com.baeldung.di.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({ SpringBeansConfig.class }) +@ComponentScan("com.baeldung.di.spring") +public class SpringMainConfig { + + @Bean + public BookService bookServiceGenerator() { + return new BookServiceImpl(); + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/SpringPersonService.java b/spring-di/src/main/java/com/baeldung/di/spring/SpringPersonService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/SpringPersonService.java rename to spring-di/src/main/java/com/baeldung/di/spring/SpringPersonService.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java b/spring-di/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java rename to spring-di/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java index bd70898faf..6ef4c5e9ac 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java @@ -1,14 +1,14 @@ -package com.baeldung.di.spring; - -public class StaticServiceFactory { - public static IService getService(int number) { - switch (number) { - case 1: - return new MessageService("Foo"); - case 0: - return new IndexService(); - default: - throw new IllegalArgumentException("Unknown parameter " + number); - } - } -} +package com.baeldung.di.spring; + +public class StaticServiceFactory { + public static IService getService(int number) { + switch (number) { + case 1: + return new MessageService("Foo"); + case 0: + return new IndexService(); + default: + throw new IllegalArgumentException("Unknown parameter " + number); + } + } +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/UserService.java b/spring-di/src/main/java/com/baeldung/di/spring/UserService.java similarity index 95% rename from spring-core/src/main/java/com/baeldung/di/spring/UserService.java rename to spring-di/src/main/java/com/baeldung/di/spring/UserService.java index 330d7f7448..5ff35cda95 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/UserService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/UserService.java @@ -1,20 +1,20 @@ -package com.baeldung.di.spring; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class UserService { - - @Autowired - private AccountService accountService; - - public AccountService getAccountService() { - return accountService; - } - - public void setAccountService(AccountService accountService) { - this.accountService = accountService; - } - -} +package com.baeldung.di.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class UserService { + + @Autowired + private AccountService accountService; + + public AccountService getAccountService() { + return accountService; + } + + public void setAccountService(AccountService accountService) { + this.accountService = accountService; + } + +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java b/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java new file mode 100644 index 0000000000..7c1e209383 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.methodinjections; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = "com.baeldung.methodinjections") + +public class AppConfig { +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java b/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java new file mode 100644 index 0000000000..10dc77484c --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java @@ -0,0 +1,19 @@ +package com.baeldung.methodinjections; + +import java.util.Collection; + +import org.springframework.stereotype.Component; + +@Component +public class Grader { + + public String grade(Collection marks) { + + boolean result = marks.stream() + .anyMatch(mark -> mark < 45); + if (result) { + return "FAIL"; + } + return "PASS"; + } +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java b/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java new file mode 100644 index 0000000000..752eb8893f --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java @@ -0,0 +1,45 @@ +package com.baeldung.methodinjections; + +import java.util.ArrayList; +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("schoolNotification") +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class SchoolNotification { + @Autowired + Grader grader; + + private String name; + private Collection marks; + + public SchoolNotification(String name) { + this.name = name; + this.marks = new ArrayList(); + } + + public String addMark(Integer mark) { + this.marks.add(mark); + return this.grader.grade(this.marks); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Collection getMarks() { + return marks; + } + + public void setMarks(Collection marks) { + this.marks = marks; + } +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/Student.java b/spring-di/src/main/java/com/baeldung/methodinjections/Student.java new file mode 100644 index 0000000000..ceeebc3d0d --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/Student.java @@ -0,0 +1,27 @@ +package com.baeldung.methodinjections; + +import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.stereotype.Component; + +@Component("studentBean") +public class Student { + + private String id; + + /** + * Injects a prototype bean SchoolNotification into Singleton student + */ + @Lookup + public SchoolNotification getNotification(String name) { + // spring overrides and returns a SchoolNotification instance + return null; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java b/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java new file mode 100644 index 0000000000..20d631b120 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java @@ -0,0 +1,21 @@ +package com.baeldung.methodinjections; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.stereotype.Component; + +@Component("studentService") +public abstract class StudentServices { + + private Map notes = new HashMap<>(); + + @Lookup + protected abstract SchoolNotification getNotification(String name); + + public String appendMark(String name, Integer mark) { + SchoolNotification notification = notes.computeIfAbsent(name, exists -> getNotification(name)); + return notification.addMark(mark); + } +} diff --git a/spring-di/src/main/java/org/baeldung/sample/App.java b/spring-di/src/main/java/com/baeldung/sample/App.java similarity index 92% rename from spring-di/src/main/java/org/baeldung/sample/App.java rename to spring-di/src/main/java/com/baeldung/sample/App.java index 17fc49fc8c..f2a017f3e5 100644 --- a/spring-di/src/main/java/org/baeldung/sample/App.java +++ b/spring-di/src/main/java/com/baeldung/sample/App.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/spring-di/src/main/java/org/baeldung/sample/AppConfig.java b/spring-di/src/main/java/com/baeldung/sample/AppConfig.java similarity index 71% rename from spring-di/src/main/java/org/baeldung/sample/AppConfig.java rename to spring-di/src/main/java/com/baeldung/sample/AppConfig.java index 8a177d2611..d13023d89e 100644 --- a/spring-di/src/main/java/org/baeldung/sample/AppConfig.java +++ b/spring-di/src/main/java/com/baeldung/sample/AppConfig.java @@ -1,10 +1,10 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan("org.baeldung.sample") +@ComponentScan("com.baeldung.sample") public class AppConfig { } diff --git a/spring-di/src/main/java/com/baeldung/sample/Bar.java b/spring-di/src/main/java/com/baeldung/sample/Bar.java new file mode 100644 index 0000000000..42302b5563 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/Bar.java @@ -0,0 +1,5 @@ +package com.baeldung.sample; + +public class Bar { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java b/spring-di/src/main/java/com/baeldung/sample/BarFormatter.java similarity index 86% rename from spring-di/src/main/java/org/baeldung/sample/BarFormatter.java rename to spring-di/src/main/java/com/baeldung/sample/BarFormatter.java index 8396653970..e3e0733627 100644 --- a/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java +++ b/spring-di/src/main/java/com/baeldung/sample/BarFormatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.stereotype.Component; diff --git a/spring-di/src/main/java/com/baeldung/sample/Foo.java b/spring-di/src/main/java/com/baeldung/sample/Foo.java new file mode 100644 index 0000000000..b25c9ecfb5 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/Foo.java @@ -0,0 +1,5 @@ +package com.baeldung.sample; + +public class Foo { + +} diff --git a/spring-di/src/main/java/com/baeldung/sample/FooDAO.java b/spring-di/src/main/java/com/baeldung/sample/FooDAO.java new file mode 100644 index 0000000000..cc8f732bf9 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/FooDAO.java @@ -0,0 +1,5 @@ +package com.baeldung.sample; + +public class FooDAO { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java b/spring-di/src/main/java/com/baeldung/sample/FooFormatter.java similarity index 86% rename from spring-di/src/main/java/org/baeldung/sample/FooFormatter.java rename to spring-di/src/main/java/com/baeldung/sample/FooFormatter.java index 68cb7f81f2..25a0b9059d 100644 --- a/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java +++ b/spring-di/src/main/java/com/baeldung/sample/FooFormatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.stereotype.Component; diff --git a/spring-di/src/main/java/org/baeldung/sample/FooService.java b/spring-di/src/main/java/com/baeldung/sample/FooService.java similarity index 91% rename from spring-di/src/main/java/org/baeldung/sample/FooService.java rename to spring-di/src/main/java/com/baeldung/sample/FooService.java index 711711f205..6d7ed3d93b 100644 --- a/spring-di/src/main/java/org/baeldung/sample/FooService.java +++ b/spring-di/src/main/java/com/baeldung/sample/FooService.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spring-di/src/main/java/org/baeldung/sample/Formatter.java b/spring-di/src/main/java/com/baeldung/sample/Formatter.java similarity index 65% rename from spring-di/src/main/java/org/baeldung/sample/Formatter.java rename to spring-di/src/main/java/com/baeldung/sample/Formatter.java index ab29c2b848..c5de59993c 100644 --- a/spring-di/src/main/java/org/baeldung/sample/Formatter.java +++ b/spring-di/src/main/java/com/baeldung/sample/Formatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; public interface Formatter { diff --git a/spring-di/src/main/java/org/baeldung/sample/FormatterType.java b/spring-di/src/main/java/com/baeldung/sample/FormatterType.java similarity index 93% rename from spring-di/src/main/java/org/baeldung/sample/FormatterType.java rename to spring-di/src/main/java/com/baeldung/sample/FormatterType.java index a00a9750bf..1ac6c6f4ad 100644 --- a/spring-di/src/main/java/org/baeldung/sample/FormatterType.java +++ b/spring-di/src/main/java/com/baeldung/sample/FormatterType.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/spring-di/src/main/java/org/baeldung/sample/Bar.java b/spring-di/src/main/java/org/baeldung/sample/Bar.java deleted file mode 100644 index 54e8d54418..0000000000 --- a/spring-di/src/main/java/org/baeldung/sample/Bar.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class Bar { - -} diff --git a/spring-di/src/main/java/org/baeldung/sample/Foo.java b/spring-di/src/main/java/org/baeldung/sample/Foo.java deleted file mode 100644 index 562a00121a..0000000000 --- a/spring-di/src/main/java/org/baeldung/sample/Foo.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class Foo { - -} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooDAO.java b/spring-di/src/main/java/org/baeldung/sample/FooDAO.java deleted file mode 100644 index 151c0c38de..0000000000 --- a/spring-di/src/main/java/org/baeldung/sample/FooDAO.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class FooDAO { - -} diff --git a/spring-di/src/main/resources/application.properties b/spring-di/src/main/resources/application.properties new file mode 100644 index 0000000000..11710b49aa --- /dev/null +++ b/spring-di/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.profiles.active=prod + diff --git a/spring-di/src/main/resources/baeldung.xml b/spring-di/src/main/resources/baeldung.xml new file mode 100644 index 0000000000..d84492f1d4 --- /dev/null +++ b/spring-di/src/main/resources/baeldung.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/spring-di/src/main/resources/beaninjectiontypes-context.xml b/spring-di/src/main/resources/beaninjectiontypes-context.xml new file mode 100644 index 0000000000..dfdea41cdc --- /dev/null +++ b/spring-di/src/main/resources/beaninjectiontypes-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/beans.xml b/spring-di/src/main/resources/beans.xml new file mode 100644 index 0000000000..4002fa63bd --- /dev/null +++ b/spring-di/src/main/resources/beans.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml b/spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml new file mode 100644 index 0000000000..d0ba03cec8 --- /dev/null +++ b/spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml b/spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml new file mode 100644 index 0000000000..f68d623be7 --- /dev/null +++ b/spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml @@ -0,0 +1,14 @@ + + + + + + + dialog/dialog + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/com.baeldung.di.spring.properties b/spring-di/src/main/resources/com.baeldung.di.spring.properties new file mode 100644 index 0000000000..8b8b5b85c2 --- /dev/null +++ b/spring-di/src/main/resources/com.baeldung.di.spring.properties @@ -0,0 +1 @@ +message.value=Hello World \ No newline at end of file diff --git a/spring-di/src/main/resources/com.baeldung.di.spring.xml b/spring-di/src/main/resources/com.baeldung.di.spring.xml new file mode 100644 index 0000000000..81942453b2 --- /dev/null +++ b/spring-di/src/main/resources/com.baeldung.di.spring.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/constructordi.xml b/spring-di/src/main/resources/constructordi.xml new file mode 100644 index 0000000000..08f6013dc6 --- /dev/null +++ b/spring-di/src/main/resources/constructordi.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/spring-di/src/main/resources/dependencyinjectiontypes-context.xml b/spring-di/src/main/resources/dependencyinjectiontypes-context.xml new file mode 100644 index 0000000000..bd6b3c408d --- /dev/null +++ b/spring-di/src/main/resources/dependencyinjectiontypes-context.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/dialog/dialog_en.properties b/spring-di/src/main/resources/dialog/dialog_en.properties new file mode 100644 index 0000000000..cf65b8990e --- /dev/null +++ b/spring-di/src/main/resources/dialog/dialog_en.properties @@ -0,0 +1,3 @@ +hello=hello +you=you +thanks=thank {0} \ No newline at end of file diff --git a/spring-di/src/main/resources/dialog/dialog_zh_CN.properties b/spring-di/src/main/resources/dialog/dialog_zh_CN.properties new file mode 100644 index 0000000000..ab09c8b39f --- /dev/null +++ b/spring-di/src/main/resources/dialog/dialog_zh_CN.properties @@ -0,0 +1,3 @@ +hello=\u4f60\u597d +you=\u4f60 +thanks=\u8c22\u8c22{0} \ No newline at end of file diff --git a/spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml new file mode 100644 index 0000000000..a82b884ee5 --- /dev/null +++ b/spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/factorybean-spring-ctx.xml b/spring-di/src/main/resources/factorybean-spring-ctx.xml new file mode 100644 index 0000000000..3231fda676 --- /dev/null +++ b/spring-di/src/main/resources/factorybean-spring-ctx.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/injectiontypes.xml b/spring-di/src/main/resources/injectiontypes.xml new file mode 100644 index 0000000000..9dad1e300a --- /dev/null +++ b/spring-di/src/main/resources/injectiontypes.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/logback.xml b/spring-di/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-di/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/spring-di/src/main/resources/setterdi.xml b/spring-di/src/main/resources/setterdi.xml new file mode 100644 index 0000000000..cf3b00d7f5 --- /dev/null +++ b/spring-di/src/main/resources/setterdi.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java b/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java b/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java b/spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java b/spring-di/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/circulardependency/TestConfig.java b/spring-di/src/test/java/com/baeldung/circulardependency/TestConfig.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/circulardependency/TestConfig.java rename to spring-di/src/test/java/com/baeldung/circulardependency/TestConfig.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectName.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectName.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectType.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectType.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java diff --git a/spring-core/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java b/spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java b/spring-di/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/dependson/config/TestConfig.java b/spring-di/src/test/java/com/baeldung/dependson/config/TestConfig.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/dependson/config/TestConfig.java rename to spring-di/src/test/java/com/baeldung/dependson/config/TestConfig.java diff --git a/spring-core/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java b/spring-di/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java b/spring-di/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java similarity index 96% rename from spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java index 4bfb3c5de4..b0c566e4d7 100644 --- a/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java +++ b/spring-di/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java @@ -1,31 +1,31 @@ -package com.baeldung.di.spring; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -public class BeanInjectionIntegrationTest { - - private ApplicationContext applicationContext; - - @Before - public void setUp() throws Exception { - applicationContext = new ClassPathXmlApplicationContext("com.baeldung.di.spring.xml"); - } - - @Test - public void singletonBean_getBean_returnsSingleInstance() { - final IndexApp indexApp1 = applicationContext.getBean("indexApp", IndexApp.class); - final IndexApp indexApp2 = applicationContext.getBean("indexApp", IndexApp.class); - assertEquals(indexApp1, indexApp2); - } - - @Test - public void getBean_returnsInstance() { - final IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class); - assertNotNull(indexApp); - } - -} +package com.baeldung.di.spring; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class BeanInjectionIntegrationTest { + + private ApplicationContext applicationContext; + + @Before + public void setUp() throws Exception { + applicationContext = new ClassPathXmlApplicationContext("com.baeldung.di.spring.xml"); + } + + @Test + public void singletonBean_getBean_returnsSingleInstance() { + final IndexApp indexApp1 = applicationContext.getBean("indexApp", IndexApp.class); + final IndexApp indexApp2 = applicationContext.getBean("indexApp", IndexApp.class); + assertEquals(indexApp1, indexApp2); + } + + @Test + public void getBean_returnsInstance() { + final IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class); + assertNotNull(indexApp); + } + +} diff --git a/spring-core/src/test/java/com/baeldung/di/spring/SpringUnitTest.java b/spring-di/src/test/java/com/baeldung/di/spring/SpringUnitTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/di/spring/SpringUnitTest.java rename to spring-di/src/test/java/com/baeldung/di/spring/SpringUnitTest.java diff --git a/spring-core/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java b/spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java b/spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java b/spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java b/spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java diff --git a/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java b/spring-di/src/test/java/com/baeldung/sample/FooServiceIntegrationTest.java similarity index 96% rename from spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/sample/FooServiceIntegrationTest.java index 6b518395a1..d42b98fc76 100644 --- a/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java +++ b/spring-di/src/test/java/com/baeldung/sample/FooServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.junit.Assert; import org.junit.Test; diff --git a/spring-di/src/test/resources/beanfactory-example.xml b/spring-di/src/test/resources/beanfactory-example.xml new file mode 100644 index 0000000000..7b3d4f29ed --- /dev/null +++ b/spring-di/src/test/resources/beanfactory-example.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/test/resources/data/employees.dat b/spring-di/src/test/resources/data/employees.dat new file mode 100644 index 0000000000..9c28fdf82f --- /dev/null +++ b/spring-di/src/test/resources/data/employees.dat @@ -0,0 +1 @@ +Joe Employee,Jan Employee,James T. Employee \ No newline at end of file diff --git a/spring-di/src/test/resources/input.txt b/spring-di/src/test/resources/input.txt new file mode 100644 index 0000000000..811232fa1f --- /dev/null +++ b/spring-di/src/test/resources/input.txt @@ -0,0 +1 @@ +This file is merely for testing. \ No newline at end of file diff --git a/spring-di/src/test/resources/output.txt b/spring-di/src/test/resources/output.txt new file mode 100644 index 0000000000..34e1e27d5a --- /dev/null +++ b/spring-di/src/test/resources/output.txt @@ -0,0 +1 @@ +Should be copied to OutputStream. \ No newline at end of file diff --git a/spring-dispatcher-servlet/README.md b/spring-dispatcher-servlet/README.md index a93993679f..3027546152 100644 --- a/spring-dispatcher-servlet/README.md +++ b/spring-dispatcher-servlet/README.md @@ -1,3 +1,7 @@ +## Spring DispatcherServlet + +This module contains articles about Spring DispatcherServlet + ## Relevant articles: -- [An Intro to the Spring DispatcherServlet](http://www.baeldung.com/spring-dispatcherservlet) +- [An Intro to the Spring DispatcherServlet](https://www.baeldung.com/spring-dispatcherservlet) diff --git a/spring-drools/README.md b/spring-drools/README.md index 00b35a4624..08ab4de465 100644 --- a/spring-drools/README.md +++ b/spring-drools/README.md @@ -1,3 +1,7 @@ +## Spring Drools + +This modules contains articles about Spring with Drools + ## Relevant articles: -- [Drools Spring Integration](http://www.baeldung.com/drools-spring-integration) +- [Drools Spring Integration](https://www.baeldung.com/drools-spring-integration) diff --git a/spring-ehcache/README.md b/spring-ehcache/README.md index ecf96cd7c7..da7376e476 100644 --- a/spring-ehcache/README.md +++ b/spring-ehcache/README.md @@ -1,7 +1,8 @@ -## Spring Ehcache Example Project +## Spring Ehcache -A simple example of using ehcache with spring-boot. +This module contains articles about Spring with Ehcache ### Relevant Articles: + - [Spring Boot Ehcache Example](https://www.baeldung.com/spring-boot-ehcache) diff --git a/spring-ejb/README.md b/spring-ejb/README.md index 58ccb20e70..6c63c2709f 100644 --- a/spring-ejb/README.md +++ b/spring-ejb/README.md @@ -1,9 +1,13 @@ +## Spring EJB + +This module contains articles about Spring with EJB + ### Relevant Articles -- [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro) -- [Java EE Session Beans](http://www.baeldung.com/ejb-session-beans) -- [Introduction to EJB JNDI Lookup on WildFly Application Server](http://www.baeldung.com/wildfly-ejb-jndi) -- [A Guide to Message Driven Beans in EJB](http://www.baeldung.com/ejb-message-driven-beans) -- [Integration Guide for Spring and EJB](http://www.baeldung.com/spring-ejb) -- [Singleton Session Bean in Java EE](http://www.baeldung.com/java-ee-singleton-session-bean) +- [Guide to EJB Set-up](https://www.baeldung.com/ejb-intro) +- [Java EE Session Beans](https://www.baeldung.com/ejb-session-beans) +- [Introduction to EJB JNDI Lookup on WildFly Application Server](httpss://www.baeldung.com/wildfly-ejb-jndi) +- [A Guide to Message Driven Beans in EJB](https://www.baeldung.com/ejb-message-driven-beans) +- [Integration Guide for Spring and EJB](https://www.baeldung.com/spring-ejb) +- [Singleton Session Bean in Java EE](https://www.baeldung.com/java-ee-singleton-session-bean) diff --git a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 71% rename from spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-ejb/spring-ejb-client/src/test/java/com/baeldung/SpringContextLiveTest.java index bbd3b6c2ba..4d6724f10f 100644 --- a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,6 +7,11 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.springejbclient.SpringEjbClientApplication; +/** + * This Live Test requires: + * * run the `spring-ejb-remote` module with the following command: `mvn clean package cargo:run -Pwildfly-standalone` + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringEjbClientApplication.class) public class SpringContextLiveTest { diff --git a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 4d2d83646d..0000000000 --- a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.springejbclient.SpringEjbClientApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringEjbClientApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-ejb/spring-ejb-remote/pom.xml b/spring-ejb/spring-ejb-remote/pom.xml index 4f4ddb0b54..4a365180f2 100644 --- a/spring-ejb/spring-ejb-remote/pom.xml +++ b/spring-ejb/spring-ejb-remote/pom.xml @@ -1,11 +1,12 @@ - 4.0.0 spring-ejb-remote - spring-ejb-remote + spring-ejb-remote ejb - + com.baeldung.spring.ejb spring-ejb @@ -46,7 +47,7 @@ wildfly10x - http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip + https://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip diff --git a/spring-exceptions/README.md b/spring-exceptions/README.md index b9472c4cca..f8c7553f05 100644 --- a/spring-exceptions/README.md +++ b/spring-exceptions/README.md @@ -1,14 +1,11 @@ -========= +## Spring `Exception`s -## Spring Exceptions Example Project +This module contains articles about Spring `Exception`s -This project is used to replicate Spring Exceptions only. - - ### Relevant articles: -- [Spring BeanCreationException](http://www.baeldung.com/spring-beancreationexception) -- [Spring DataIntegrityViolationException](http://www.baeldung.com/spring-dataIntegrityviolationexception) -- [Spring BeanDefinitionStoreException](http://www.baeldung.com/spring-beandefinitionstoreexception) -- [Spring NoSuchBeanDefinitionException](http://www.baeldung.com/spring-nosuchbeandefinitionexception) -- [Guide to Spring NonTransientDataAccessException](http://www.baeldung.com/nontransientdataaccessexception) -- [Hibernate Mapping Exception – Unknown Entity](http://www.baeldung.com/hibernate-mappingexception-unknown-entity) +- [Spring BeanCreationException](https://www.baeldung.com/spring-beancreationexception) +- [Spring DataIntegrityViolationException](https://www.baeldung.com/spring-dataIntegrityviolationexception) +- [Spring BeanDefinitionStoreException](https://www.baeldung.com/spring-beandefinitionstoreexception) +- [Spring NoSuchBeanDefinitionException](https://www.baeldung.com/spring-nosuchbeandefinitionexception) +- [Guide to Spring NonTransientDataAccessException](https://www.baeldung.com/nontransientdataaccessexception) +- [Hibernate Mapping Exception – Unknown Entity](https://www.baeldung.com/hibernate-mappingexception-unknown-entity) diff --git a/spring-freemarker/README.md b/spring-freemarker/README.md index bd939d11e9..410781f2ca 100644 --- a/spring-freemarker/README.md +++ b/spring-freemarker/README.md @@ -1,7 +1,6 @@ -========= - -## Using FreeMarker in Spring MVC +## Spring FreeMarker +This module contains articles about Spring with FreeMarker ### Relevant Articles: -- [Introduction to Using FreeMarker in Spring MVC](http://www.baeldung.com/freemarker-in-spring-mvc-tutorial) +- [Introduction to Using FreeMarker in Spring MVC](https://www.baeldung.com/freemarker-in-spring-mvc-tutorial) diff --git a/spring-groovy/README.md b/spring-groovy/README.md index 36404230a9..c3bb5636ba 100644 --- a/spring-groovy/README.md +++ b/spring-groovy/README.md @@ -1,3 +1,7 @@ +## Spring Groovy + +This module contains articles about Spring with Groovy + ## Relevant Articles: - [Groovy Bean Definitions](https://www.baeldung.com/spring-groovy-beans) diff --git a/spring-integration/README.md b/spring-integration/README.md index 244cf1fb14..2e719a8674 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -1,6 +1,10 @@ +## Spring Integration + +This module contains articles about Spring Integration + ### Relevant Articles: -- [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) -- [Security In Spring Integration](http://www.baeldung.com/spring-integration-security) +- [Introduction to Spring Integration](https://www.baeldung.com/spring-integration) +- [Security In Spring Integration](https://www.baeldung.com/spring-integration-security) - [Spring Integration Java DSL](https://www.baeldung.com/spring-integration-java-dsl) - [Using Subflows in Spring Integration](https://www.baeldung.com/spring-integration-subflows) diff --git a/spring-jenkins-pipeline/README.md b/spring-jenkins-pipeline/README.md index 8c10e85da2..9182823f52 100644 --- a/spring-jenkins-pipeline/README.md +++ b/spring-jenkins-pipeline/README.md @@ -1,5 +1,12 @@ -BASIC CRUD API with Spring Boot -================================ +## Spring Jenkins + +This module contains articles about Spring with Jenkins + +### Relevant articles + +- [Intro to Jenkins 2 and the Power of Pipelines](https://www.baeldung.com/jenkins-pipelines) + +## Basic CRUD API with Spring Boot This is the code of a simple API for some CRUD operations build using Spring Boot. @@ -20,7 +27,3 @@ $ mvn spring-boot:run -Dserver.port=8989 Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) Enjoy it :) - -### Relevant articles - -- [Intro to Jenkins 2 and the Power of Pipelines](http://www.baeldung.com/jenkins-pipelines) diff --git a/spring-jenkins-pipeline/src/test/resources/application.properties b/spring-jenkins-pipeline/src/test/resources/application.properties new file mode 100644 index 0000000000..4ee830556a --- /dev/null +++ b/spring-jenkins-pipeline/src/test/resources/application.properties @@ -0,0 +1,2 @@ +#To use a randomly allocated free port during tests to avoid port conflict across tests +spring.data.mongodb.port=0 diff --git a/spring-jersey/README.md b/spring-jersey/README.md index 37928620d3..3c6b0577c0 100644 --- a/spring-jersey/README.md +++ b/spring-jersey/README.md @@ -1,6 +1,8 @@ -========= +## Spring Jersey + +This module contains articles about Spring with Jersey ## REST API with Jersey & Spring Example Project -- [REST API with Jersey and Spring](http://www.baeldung.com/jersey-rest-api-with-spring) -- [JAX-RS Client with Jersey](http://www.baeldung.com/jersey-jax-rs-client) +- [REST API with Jersey and Spring](https://www.baeldung.com/jersey-rest-api-with-spring) +- [JAX-RS Client with Jersey](https://www.baeldung.com/jersey-jax-rs-client) - [Reactive JAX-RS Client API](https://www.baeldung.com/jax-rs-reactive-client) diff --git a/spring-jinq/README.md b/spring-jinq/README.md index 10d7903f49..e049dc2ba8 100644 --- a/spring-jinq/README.md +++ b/spring-jinq/README.md @@ -1,4 +1,8 @@ +## Spring Jinq + +This module contains articles about Spring with Jinq + ## Relevant articles: -- [Introduction to Jinq with Spring](http://www.baeldung.com/spring-jinq) +- [Introduction to Jinq with Spring](https://www.baeldung.com/spring-jinq) diff --git a/spring-jms/README.md b/spring-jms/README.md index 55e74f18ff..fdeb64953a 100644 --- a/spring-jms/README.md +++ b/spring-jms/README.md @@ -1,2 +1,6 @@ +## Spring JMS + +This module contains articles about Spring with JMS + ### Relevant Articles: -- [Getting Started with Spring JMS](http://www.baeldung.com/spring-jms) +- [Getting Started with Spring JMS](https://www.baeldung.com/spring-jms) diff --git a/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java index e13809f571..483ffec208 100644 --- a/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -6,7 +6,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:EmbeddedActiveMQ.xml"}) +@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) public class SpringContextIntegrationTest { @Test diff --git a/spring-jms/src/test/java/org/baeldung/SpringContextTest.java b/spring-jms/src/test/java/org/baeldung/SpringContextTest.java index e89faeebb7..11c9d9bca6 100644 --- a/spring-jms/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-jms/src/test/java/org/baeldung/SpringContextTest.java @@ -6,7 +6,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:EmbeddedActiveMQ.xml"}) +@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) public class SpringContextTest { @Test diff --git a/spring-jooq/README.md b/spring-jooq/README.md index 2777aa450c..515ab8be3c 100644 --- a/spring-jooq/README.md +++ b/spring-jooq/README.md @@ -1,6 +1,10 @@ +## Spring jOOQ + +This module contains articles about Spring with jOOQ + ### Relevant Articles: -- [Spring Boot Support for jOOQ](http://www.baeldung.com/spring-boot-support-for-jooq) -- [Introduction to jOOQ with Spring](http://www.baeldung.com/jooq-with-spring) +- [Spring Boot Support for jOOQ](https://www.baeldung.com/spring-boot-support-for-jooq) +- [Introduction to jOOQ with Spring](https://www.baeldung.com/jooq-with-spring) In order to fix the error "Plugin execution not covered by lifecycle configuration: org.jooq:jooq-codegen-maven:3.7.3:generate (execution: default, phase: generate-sources)", right-click on the error message and choose "Mark goal generated as ignore in pom.xml". Until version 1.4.x, the maven-plugin-plugin was covered by the default lifecycle mapping that ships with m2e. diff --git a/spring-jooq/src/test/resources/application.properties b/spring-jooq/src/test/resources/application.properties new file mode 100644 index 0000000000..ef37552bf0 --- /dev/null +++ b/spring-jooq/src/test/resources/application.properties @@ -0,0 +1,4 @@ +spring.datasource.url=jdbc:h2:~/jooq;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.hibernate.ddl-auto=update diff --git a/spring-kafka/README.md b/spring-kafka/README.md index 291bbca6f6..f2fecde894 100644 --- a/spring-kafka/README.md +++ b/spring-kafka/README.md @@ -1,10 +1,12 @@ +## Spring Kafka + +This module contains articles about Spring with Kafka + ### Relevant articles -- [Intro to Apache Kafka with Spring](http://www.baeldung.com/spring-kafka) +- [Intro to Apache Kafka with Spring](https://www.baeldung.com/spring-kafka) - - -# Spring Kafka +### Intro This is a simple Spring Boot app to demonstrate sending and receiving of messages in Kafka using spring-kafka. diff --git a/spring-katharsis/README.md b/spring-katharsis/README.md index 2082de2dda..d7454e6841 100644 --- a/spring-katharsis/README.md +++ b/spring-katharsis/README.md @@ -1,9 +1,11 @@ -========= +## Spring Katharsis -## Java Web Application - -###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +This module contains articles about Spring with Katharsis ### Relevant Articles: -- [JSON API in a Spring Application](http://www.baeldung.com/json-api-java-spring-web-app) + +- [JSON API in a Spring Application](https://www.baeldung.com/json-api-java-spring-web-app) + +### The Course + +The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-ldap/README.md b/spring-ldap/README.md index b8163ab44d..4872f897e1 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -1,6 +1,8 @@ -## Spring LDAP Example Project +## Spring LDAP + +This module contains articles about Spring LDAP ### Relevant articles -- [Spring LDAP Overview](http://www.baeldung.com/spring-ldap) -- [Guide to Spring Data LDAP](http://www.baeldung.com/spring-data-ldap) +- [Spring LDAP Overview](https://www.baeldung.com/spring-ldap) +- [Guide to Spring Data LDAP](https://www.baeldung.com/spring-data-ldap) diff --git a/spring-mobile/README.md b/spring-mobile/README.md index e3d23bcda6..badd79d162 100644 --- a/spring-mobile/README.md +++ b/spring-mobile/README.md @@ -1,4 +1,8 @@ +## Spring Mobile + +This module contains articles about Spring Mobile + ## Relevant articles: -- [A Guide to Spring Mobile](http://www.baeldung.com/spring-mobile) +- [A Guide to Spring Mobile](https://www.baeldung.com/spring-mobile) diff --git a/spring-mockito/README.md b/spring-mockito/README.md index 969954c15e..0ad8e05ce3 100644 --- a/spring-mockito/README.md +++ b/spring-mockito/README.md @@ -1,8 +1,7 @@ -========= - -## Mockito Mocks into Spring Beans +## Spring Mockito +This module contains articles about Spring with Mockito ### Relevant Articles: -- [Injecting Mockito Mocks into Spring Beans](http://www.baeldung.com/injecting-mocks-in-spring) -- [Mockito ArgumentMatchers](http://www.baeldung.com/mockito-argument-matchers) +- [Injecting Mockito Mocks into Spring Beans](https://www.baeldung.com/injecting-mocks-in-spring) +- [Mockito ArgumentMatchers](https://www.baeldung.com/mockito-argument-matchers) diff --git a/spring-mvc-basics/README.md b/spring-mvc-basics/README.md index b257b3587b..a04c6e7ae7 100644 --- a/spring-mvc-basics/README.md +++ b/spring-mvc-basics/README.md @@ -7,12 +7,12 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Spring MVC Tutorial](https://www.baeldung.com/spring-mvc-tutorial) -- [The Spring @Controller and @RestController Annotations](http://www.baeldung.com/spring-controller-vs-restcontroller) -- [A Guide to the ViewResolver in Spring MVC](http://www.baeldung.com/spring-mvc-view-resolver-tutorial) -- [Guide to Spring Handler Mappings](http://www.baeldung.com/spring-handler-mappings) -- [Spring MVC Content Negotiation](http://www.baeldung.com/spring-mvc-content-negotiation-json-xml) -- [Spring @RequestMapping New Shortcut Annotations](http://www.baeldung.com/spring-new-requestmapping-shortcuts) -- [Spring MVC Custom Validation](http://www.baeldung.com/spring-mvc-custom-validator) -- [Using Spring @ResponseStatus to Set HTTP Status Code](http://www.baeldung.com/spring-response-status) -- [Spring MVC and the @ModelAttribute Annotation](http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation) -- [The HttpMediaTypeNotAcceptableException in Spring MVC](http://www.baeldung.com/spring-httpmediatypenotacceptable) \ No newline at end of file +- [The Spring @Controller and @RestController Annotations](https://www.baeldung.com/spring-controller-vs-restcontroller) +- [A Guide to the ViewResolver in Spring MVC](https://www.baeldung.com/spring-mvc-view-resolver-tutorial) +- [Guide to Spring Handler Mappings](https://www.baeldung.com/spring-handler-mappings) +- [Spring MVC Content Negotiation](https://www.baeldung.com/spring-mvc-content-negotiation-json-xml) +- [Spring @RequestMapping New Shortcut Annotations](https://www.baeldung.com/spring-new-requestmapping-shortcuts) +- [Spring MVC Custom Validation](https://www.baeldung.com/spring-mvc-custom-validator) +- [Using Spring @ResponseStatus to Set HTTP Status Code](https://www.baeldung.com/spring-response-status) +- [Spring MVC and the @ModelAttribute Annotation](https://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation) +- [The HttpMediaTypeNotAcceptableException in Spring MVC](https://www.baeldung.com/spring-httpmediatypenotacceptable) diff --git a/spring-mvc-forms-jsp/README.md b/spring-mvc-forms-jsp/README.md index 588828c9cf..2c077f5171 100644 --- a/spring-mvc-forms-jsp/README.md +++ b/spring-mvc-forms-jsp/README.md @@ -1,7 +1,9 @@ -## Spring MVC Forms Tutorials +## Spring MVC Forms JSP + +This module contains articles about Spring MVC Forms using JSP ### Relevant Articles -- [MaxUploadSizeExceededException in Spring](http://www.baeldung.com/spring-maxuploadsizeexceeded) -- [Getting Started with Forms in Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial) -- [Form Validation with AngularJS and Spring MVC](http://www.baeldung.com/validation-angularjs-spring-mvc) -- [A Guide to the JSTL Library](http://www.baeldung.com/jstl) +- [MaxUploadSizeExceededException in Spring](https://www.baeldung.com/spring-maxuploadsizeexceeded) +- [Getting Started with Forms in Spring MVC](https://www.baeldung.com/spring-mvc-form-tutorial) +- [Form Validation with AngularJS and Spring MVC](https://www.baeldung.com/validation-angularjs-spring-mvc) +- [A Guide to the JSTL Library](https://www.baeldung.com/jstl) diff --git a/spring-mvc-forms-thymeleaf/README.md b/spring-mvc-forms-thymeleaf/README.md index 22f12afbca..57fa32901c 100644 --- a/spring-mvc-forms-thymeleaf/README.md +++ b/spring-mvc-forms-thymeleaf/README.md @@ -1,5 +1,9 @@ +## Spring MVC Forms Thymeleaf + +This module contains articles about Spring MVC Forms using Thymeleaf + ### Relevant articles -- [Session Attributes in Spring MVC](http://www.baeldung.com/spring-mvc-session-attributes) -- [Binding a List in Thymeleaf](http://www.baeldung.com/thymeleaf-list) +- [Session Attributes in Spring MVC](https://www.baeldung.com/spring-mvc-session-attributes) +- [Binding a List in Thymeleaf](https://www.baeldung.com/thymeleaf-list) diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index e67d4f30a1..7088162496 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -1,21 +1,23 @@ -========= +## Spring MVC with Java Configuration -## Spring MVC with Java Configuration Example Project +This module contains articles about Spring MVC with Java configuration ### The Course + The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Introduction to Pointcut Expressions in Spring](http://www.baeldung.com/spring-aop-pointcut-tutorial) -- [Introduction to Advice Types in Spring](http://www.baeldung.com/spring-aop-advice-tutorial) -- [Integration Testing in Spring](http://www.baeldung.com/integration-testing-in-spring) -- [A Quick Guide to Spring MVC Matrix Variables](http://www.baeldung.com/spring-mvc-matrix-variables) -- [Intro to WebSockets with Spring](http://www.baeldung.com/websockets-spring) -- [File Upload with Spring MVC](http://www.baeldung.com/spring-file-upload) -- [Introduction to HtmlUnit](http://www.baeldung.com/htmlunit) -- [Upload and Display Excel Files with Spring MVC](http://www.baeldung.com/spring-mvc-excel-files) -- [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) -- [Spring MVC @PathVariable with a dot (.) gets truncated](http://www.baeldung.com/spring-mvc-pathvariable-dot) -- [A Quick Example of Spring Websockets’ @SendToUser Annotation](http://www.baeldung.com/spring-websockets-sendtouser) +- [Introduction to Pointcut Expressions in Spring](https://www.baeldung.com/spring-aop-pointcut-tutorial) +- [Introduction to Advice Types in Spring](https://www.baeldung.com/spring-aop-advice-tutorial) +- [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring) +- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables) +- [Intro to WebSockets with Spring](https://www.baeldung.com/websockets-spring) +- [File Upload with Spring MVC](https://www.baeldung.com/spring-file-upload) +- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit) +- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files) +- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) +- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot) +- [A Quick Example of Spring Websockets’ @SendToUser Annotation](https://www.baeldung.com/spring-websockets-sendtouser) - [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) +- [The HttpMediaTypeNotAcceptableException in Spring MVC](https://www.baeldung.com/spring-httpmediatypenotacceptable) diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index cb16e91bc4..ea0acdcb00 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -8,17 +8,20 @@ war - parent-spring-5 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-boot-2 - org.springframework - spring-webmvc - ${spring.version} + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat javax.servlet @@ -33,7 +36,11 @@ javax.servlet jstl - ${jstl.version} + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided @@ -55,17 +62,6 @@ - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - commons-io - commons-io - - - net.sourceforge.htmlunit htmlunit @@ -106,9 +102,8 @@ 2.4.0 - org.springframework - spring-test - ${spring.version} + org.springframework.boot + spring-boot-starter-test test @@ -134,15 +129,8 @@ 2.8.5 - org.springframework - spring-websocket - ${spring.version} - - - - org.springframework - spring-messaging - ${spring.version} + org.springframework.boot + spring-boot-starter-websocket org.glassfish @@ -296,6 +284,7 @@ 3.16-beta1 3.0.1-b09 + com.baeldung.SpringMVCApplication diff --git a/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java b/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java new file mode 100644 index 0000000000..a456dc125e --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication +public class SpringMVCApplication extends SpringBootServletInitializer { + public static void main(String[] args) { + SpringApplication.run(SpringMVCApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java index 7ae37404be..169d664471 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java +++ b/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java @@ -23,15 +23,15 @@ public class LoggingAspect { } }; - @Pointcut("@target(org.springframework.stereotype.Repository)") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.*(..))") public void repositoryMethods() { } - @Pointcut("@annotation(com.baeldung.aop.annotations.Loggable)") + @Pointcut("within(com.baeldung..*) && @annotation(com.baeldung.aop.annotations.Loggable)") public void loggableMethods() { } - @Pointcut("@args(com.baeldung.aop.annotations.Entity)") + @Pointcut("within(com.baeldung..*) && @args(com.baeldung.aop.annotations.Entity)") public void methodsAcceptingEntities() { } diff --git a/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java index 1f2076adff..8f374cc1e5 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java +++ b/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java @@ -15,7 +15,7 @@ public class PerformanceAspect { private static Logger logger = Logger.getLogger(PerformanceAspect.class.getName()); - @Pointcut("within(@org.springframework.stereotype.Repository *)") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.*(..))") public void repositoryClassMethods() { } diff --git a/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java index 7791c63e7b..a45402dc18 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java +++ b/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java @@ -20,11 +20,11 @@ public class PublishingAspect { this.eventPublisher = eventPublisher; } - @Pointcut("@target(org.springframework.stereotype.Repository)") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.*(..))") public void repositoryMethods() { } - @Pointcut("execution(* *..create*(Long,..))") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.create*(Long,..))") public void firstLongParamMethods() { } diff --git a/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java deleted file mode 100644 index eec12f466f..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.config; - -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -public class AppInitializer implements WebApplicationInitializer { - - @Override - public void onStartup(ServletContext container) throws ServletException { - AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); - - context.scan("com.baeldung"); - - container.addListener(new ContextLoaderListener(context)); - - ServletRegistration.Dynamic dispatcher = container.addServlet("mvc", new DispatcherServlet(context)); - dispatcher.setLoadOnStartup(1); - dispatcher.addMapping("/"); - - // final MultipartConfigElement multipartConfigElement = new - // MultipartConfigElement(TMP_FOLDER, MAX_UPLOAD_SIZE, - // MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); - // - // appServlet.setMultipartConfig(multipartConfigElement); - } - -} diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 44fef92917..96e300464b 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -3,9 +3,6 @@ package com.baeldung.spring.web.config; import java.util.ArrayList; import java.util.List; -import javax.servlet.ServletContext; - -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -15,7 +12,6 @@ import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; @@ -26,8 +22,9 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.util.UrlPathHelper; import org.thymeleaf.spring4.SpringTemplateEngine; +import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring4.view.ThymeleafViewResolver; -import org.thymeleaf.templateresolver.ServletContextTemplateResolver; +import org.thymeleaf.templateresolver.ITemplateResolver; import com.baeldung.excel.ExcelPOIHelper; @@ -35,9 +32,6 @@ import com.baeldung.excel.ExcelPOIHelper; @Configuration @ComponentScan(basePackages = { "com.baeldung.web.controller" }) public class WebConfig implements WebMvcConfigurer { - - @Autowired - private ServletContext ctx; @Override public void addViewControllers(final ViewControllerRegistry registry) { @@ -64,11 +58,11 @@ public class WebConfig implements WebMvcConfigurer { @Bean @Description("Thymeleaf template resolver serving HTML 5") - public ServletContextTemplateResolver templateResolver() { - final ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(ctx); + public ITemplateResolver templateResolver() { + final SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode("HTML5"); + templateResolver.setTemplateMode("HTML"); return templateResolver; } @@ -92,15 +86,6 @@ public class WebConfig implements WebMvcConfigurer { public void addResourceHandlers(final ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } - - @Bean(name = "multipartResolver") - public CommonsMultipartResolver multipartResolver() { - - final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); - multipartResolver.setMaxUploadSize(100000); - - return multipartResolver; - } @Override public void extendMessageConverters(final List> converters) { diff --git a/spring-mvc-java/src/main/resources/application.properties b/spring-mvc-java/src/main/resources/application.properties new file mode 100644 index 0000000000..00c491c271 --- /dev/null +++ b/spring-mvc-java/src/main/resources/application.properties @@ -0,0 +1,5 @@ +server.servlet.context-path=/spring-mvc-java +spring.servlet.multipart.max-file-size=1MB +spring.servlet.multipart.max-request-size=1MB +spring.servlet.multipart.enabled=true +spring.servlet.multipart.location=${java.io.tmpdir} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 4c06917325..ae91d4dc1e 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -3,15 +3,12 @@ package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.config.AppInitializer; +import com.baeldung.config.TestConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { AppInitializer.class }, loader = AnnotationConfigContextLoader.class) -@WebAppConfiguration +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {TestConfig.class}) public class SpringContextIntegrationTest { @Test diff --git a/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java b/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java index 9777addb61..8943ecb548 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java @@ -3,15 +3,12 @@ package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.config.AppInitializer; +import com.baeldung.config.TestConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { AppInitializer.class }, loader = AnnotationConfigContextLoader.class) -@WebAppConfiguration +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {TestConfig.class}) public class SpringContextTest { @Test diff --git a/spring-mvc-kotlin/README.md b/spring-mvc-kotlin/README.md index cc6827eb1b..590c627cb6 100644 --- a/spring-mvc-kotlin/README.md +++ b/spring-mvc-kotlin/README.md @@ -1,5 +1,9 @@ +## Spring MVC with Kotlin + +This module contains articles about Spring MVC with Kotlin + ### Relevant articles -- [Spring MVC Setup with Kotlin](http://www.baeldung.com/spring-mvc-kotlin) -- [Working with Kotlin and JPA](http://www.baeldung.com/kotlin-jpa) -- [Kotlin-allopen and Spring](http://www.baeldung.com/kotlin-allopen-spring) +- [Spring MVC Setup with Kotlin](https://www.baeldung.com/spring-mvc-kotlin) +- [Working with Kotlin and JPA](https://www.baeldung.com/kotlin-jpa) +- [Kotlin-allopen and Spring](https://www.baeldung.com/kotlin-allopen-spring) - [MockMvc Kotlin DSL](https://www.baeldung.com/mockmvc-kotlin-dsl) diff --git a/spring-mvc-simple-2/README.md b/spring-mvc-simple-2/README.md index 6dfe789be4..80456c5732 100644 --- a/spring-mvc-simple-2/README.md +++ b/spring-mvc-simple-2/README.md @@ -1,2 +1,7 @@ +## Spring MVC Simple 2 + +This module contains articles about Spring MVC + ## Relevant articles: - [How to Read HTTP Headers in Spring REST Controllers](https://www.baeldung.com/spring-rest-http-headers) +- More articles: [[<-- prev]](/spring-mvc-simple) diff --git a/spring-mvc-simple-2/pom.xml b/spring-mvc-simple-2/pom.xml index 74302cff78..ca911b2719 100644 --- a/spring-mvc-simple-2/pom.xml +++ b/spring-mvc-simple-2/pom.xml @@ -18,6 +18,11 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java new file mode 100644 index 0000000000..4fb6938694 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java @@ -0,0 +1,17 @@ +package com.baeldung.exclude_urls_filter; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@ComponentScan(basePackages = "com.baeldung.exclude_urls_filter") +@Configuration +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java new file mode 100644 index 0000000000..1463af6bfd --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java @@ -0,0 +1,32 @@ +package com.baeldung.exclude_urls_filter.controller; + +import com.baeldung.exclude_urls_filter.service.FAQService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class FAQController { + + private final FAQService faqService; + + @Autowired + public FAQController(FAQService faqService) { + this.faqService = faqService; + } + + @RequestMapping(value = "/faq/helpline", method = RequestMethod.GET) + public ResponseEntity getHelpLineNumber() { + String helplineNumber = faqService.getHelpLineNumber(); + if (helplineNumber != null) { + return new ResponseEntity(helplineNumber, HttpStatus.OK); + } else { + return new ResponseEntity("Unavailable", HttpStatus.NOT_FOUND); + } + } + + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java new file mode 100644 index 0000000000..c8a0723ba6 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java @@ -0,0 +1,22 @@ +package com.baeldung.exclude_urls_filter.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class Ping { + + @RequestMapping(value = "/health", method = RequestMethod.GET) + public ResponseEntity pingGet() { + return new ResponseEntity("pong", HttpStatus.OK); + } + + @RequestMapping(value = "/health", method = RequestMethod.POST) + public ResponseEntity pingPost() { + return new ResponseEntity("pong", HttpStatus.OK); + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java new file mode 100644 index 0000000000..ff99b4cc25 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java @@ -0,0 +1,26 @@ +package com.baeldung.exclude_urls_filter.filter; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FilterRegistrationConfig { + + @Bean + public FilterRegistrationBean logFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new LogFilter()); + registrationBean.addUrlPatterns("/health", "/faq/*"); + return registrationBean; + } + + + @Bean + public FilterRegistrationBean headerValidatorFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new HeaderValidatorFilter()); + registrationBean.addUrlPatterns("*"); + return registrationBean; + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java new file mode 100644 index 0000000000..2af90badae --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java @@ -0,0 +1,30 @@ +package com.baeldung.exclude_urls_filter.filter; + +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Order(1) +public class HeaderValidatorFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String path = request.getRequestURI(); + if ("/health".equals(path)) { + filterChain.doFilter(request, response); + return; + } + String countryCode = request.getHeader("X-Country-Code"); + if (!"US".equals(countryCode)) { + response.sendError(HttpStatus.BAD_REQUEST.value(), "Invalid Locale"); + return; + } + + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java new file mode 100644 index 0000000000..fcde4f7f8f --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java @@ -0,0 +1,25 @@ +package com.baeldung.exclude_urls_filter.filter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Order(1) +public class LogFilter extends OncePerRequestFilter { + private final Logger logger = LoggerFactory.getLogger(LogFilter.class); + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + String path = request.getRequestURI(); + String contentType = request.getContentType(); + logger.info("Request URL path : {}, Request content type: {}", path, contentType); + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java new file mode 100644 index 0000000000..a2949ea0a2 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java @@ -0,0 +1,5 @@ +package com.baeldung.exclude_urls_filter.service; + +public interface FAQService { + String getHelpLineNumber(); +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java new file mode 100644 index 0000000000..6f841e4ec1 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java @@ -0,0 +1,15 @@ +package com.baeldung.exclude_urls_filter.service; + +import org.springframework.stereotype.Service; + +@Service +public class FAQServiceImpl implements FAQService { + + private static final String HELPLINE_NUMBER = "+1 888-777-66"; + + @Override + public String getHelpLineNumber() { + return HELPLINE_NUMBER; + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java new file mode 100644 index 0000000000..efa3d62b88 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java @@ -0,0 +1,29 @@ +package com.baeldung.interpolation; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.validation.MessageInterpolator; +import java.util.Locale; + +public class MyMessageInterpolator implements MessageInterpolator { + + private static Logger logger = LoggerFactory.getLogger(MyMessageInterpolator.class); + + private final MessageInterpolator defaultInterpolator; + + public MyMessageInterpolator(MessageInterpolator interpolator) { + this.defaultInterpolator = interpolator; + } + + @Override + public String interpolate(String messageTemplate, Context context) { + messageTemplate = messageTemplate.toUpperCase(); + return defaultInterpolator.interpolate(messageTemplate, context, Locale.getDefault()); + } + + @Override + public String interpolate(String messageTemplate, Context context, Locale locale) { + messageTemplate = messageTemplate.toUpperCase(); + return defaultInterpolator.interpolate(messageTemplate, context, locale); + } +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java new file mode 100644 index 0000000000..9a2b00be8f --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java @@ -0,0 +1,17 @@ +package com.baeldung.interpolation; + +import javax.validation.constraints.NotNull; + +public class NotNullRequest { + + @NotNull(message = "stringValue has to be present") + private String stringValue; + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationController.java new file mode 100644 index 0000000000..3fed170fdf --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationController.java @@ -0,0 +1,15 @@ +package com.baeldung.interpolation; + +import javax.validation.Valid; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ValidationController { + + @PostMapping("/test-not-null") + public void testNotNull(@Valid @RequestBody NotNullRequest request) { + + } +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java new file mode 100644 index 0000000000..6c9b924200 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java @@ -0,0 +1,31 @@ +package com.baeldung.interpolation; + +import java.util.Formatter; +import javax.validation.constraints.Size; +import javax.validation.constraints.Min; +import javax.validation.constraints.DecimalMin; + +public class ValidationExamples { + + private static final Formatter formatter = new Formatter(); + + @Size( + min = 5, + max = 14, + message = "The author email '${validatedValue}' must be between {min} and {max} characters long" + ) + private String authorEmail; + + @Min( + value = 1, + message = "There must be at least {value} test{value > 1 ? 's' : ''} in the test case" + ) + private int testCount; + + @DecimalMin( + value = "50", + message = "The code coverage ${formatter.format('%1$.2f', validatedValue)} must be higher than {value}%" + ) + private double codeCoverage; + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java new file mode 100644 index 0000000000..ad99e8169b --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.baeldung.spring.config.converter.StringToEnumConverter; + +@Configuration +@EnableWebMvc +public class MvcConfig implements WebMvcConfigurer { + + public MvcConfig() { + super(); + } + + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new StringToEnumConverter()); + } +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/converter/StringToEnumConverter.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/converter/StringToEnumConverter.java new file mode 100644 index 0000000000..b481f691bf --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/converter/StringToEnumConverter.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.config.converter; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +import com.baeldung.spring.model.Modes; + +@Component +public class StringToEnumConverter implements Converter { + @Override + public Modes convert(String source) { + // Remove the try-catch block if we want to handle the exception globally in GlobalControllerExceptionHandler + try { + return Modes.valueOf(source.toUpperCase()); + } catch (IllegalArgumentException e) { + return null; + } + + } +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums/EnumController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums/EnumController.java new file mode 100644 index 0000000000..356e751d5e --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums/EnumController.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.enums; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.spring.model.Modes; + +@RestController +@RequestMapping("/enums") +public class EnumController { + + @GetMapping("/mode2str") + public String getStringToMode(@RequestParam("mode") Modes mode) { + return "good"; + } + + @GetMapping("/findbymode/{mode}") + public String findByEnum(@PathVariable Modes mode) { + return "good"; + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/exceptions/GlobalControllerExceptionHandler.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/exceptions/GlobalControllerExceptionHandler.java new file mode 100644 index 0000000000..2e0f1b6559 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/exceptions/GlobalControllerExceptionHandler.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.exceptions; + +import org.springframework.core.convert.ConversionFailedException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalControllerExceptionHandler { + @ExceptionHandler(ConversionFailedException.class) + public ResponseEntity handleConflict(RuntimeException ex) { + // Remove the try-catch block in the StringToEnumConverter if we want to handle the exception here + return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST); + } +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/model/Modes.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/model/Modes.java new file mode 100644 index 0000000000..dc05448f3f --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/model/Modes.java @@ -0,0 +1,5 @@ +package com.baeldung.spring.model; + +public enum Modes { + ALPHA, BETA; +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java new file mode 100644 index 0000000000..7db6ac3755 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.slash; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@SpringBootApplication +public class Application implements WebMvcConfigurer { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java new file mode 100644 index 0000000000..635587ee5b --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java @@ -0,0 +1,31 @@ +package com.baeldung.spring.slash; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("slash") +public class SlashParsingController { + + @GetMapping("mypaths/{anything}") + public String pathVariable(@PathVariable("anything") String anything) { + return anything; + } + + @GetMapping("all/**") + public String allDirectories(HttpServletRequest request) { + return request.getRequestURI() + .split(request.getContextPath() + "/all/")[1]; + } + + @GetMapping("all") + public String queryParameter(@RequestParam("param") String param) { + return param; + } + +} diff --git a/spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java b/spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java new file mode 100644 index 0000000000..d81b34f7bf --- /dev/null +++ b/spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java @@ -0,0 +1,87 @@ +package com.baeldung.spring.slash; + +import static org.junit.Assert.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.net.URI; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +@AutoConfigureMockMvc +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class SlashParsingControllerIntTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenUsingPathVariablemWithoutSlashes_thenStatusOk() throws Exception { + final String stringWithoutSlashes = "noslash"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/mypaths/" + stringWithoutSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + assertEquals(stringWithoutSlashes, mvcResult.getResponse() + .getContentAsString()); + } + + @Test + public void whenUsingPathVariableWithSlashes_thenStatusNotFound() throws Exception { + final String stringWithSlashes = "url/with/slashes"; + + mockMvc.perform(get("/slash/mypaths/" + stringWithSlashes)) + .andExpect(status().isNotFound()); + } + + @Test + public void givenAllFallbackEndpoint_whenUsingPathWithSlashes_thenStatusOk() throws Exception { + final String stringWithSlashes = "url/for/testing/purposes"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/all/" + stringWithSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + assertEquals(stringWithSlashes, mvcResult.getResponse() + .getContentAsString()); + } + + @Test + public void givenAllFallbackEndpoint_whenUsingConsecutiveSlashes_thenPathNormalized() throws Exception { + final String stringWithSlashes = "http://myurl.com"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/all/" + stringWithSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + String stringWithSlashesNormalized = URI.create("/slash/all/" + stringWithSlashes) + .normalize() + .toString() + .split("/slash/all/")[1]; + + assertEquals(stringWithSlashesNormalized, mvcResult.getResponse() + .getContentAsString()); + } + + @Test + public void whenUsingSlashesInQueryParam_thenParameterAccepted() throws Exception { + final String stringWithSlashes = "url/for////testing/purposes"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/all").param("param", stringWithSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + assertEquals(stringWithSlashes, mvcResult.getResponse() + .getContentAsString()); + } + +} diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md index 755e0932fc..ae03fedf3c 100644 --- a/spring-mvc-simple/README.md +++ b/spring-mvc-simple/README.md @@ -1,10 +1,15 @@ +## Spring MVC Simple + +This module contains articles about Spring MVC + ## Relevant articles: -- [HandlerAdapters in Spring MVC](http://www.baeldung.com/spring-mvc-handler-adapters) -- [Template Engines for Spring](http://www.baeldung.com/spring-template-engines) -- [Spring 5 and Servlet 4 – The PushBuilder](http://www.baeldung.com/spring-5-push) -- [Servlet Redirect vs Forward](http://www.baeldung.com/servlet-redirect-forward) -- [Apache Tiles Integration with Spring MVC](http://www.baeldung.com/spring-mvc-apache-tiles) -- [Guide to Spring Email](http://www.baeldung.com/spring-email) +- [HandlerAdapters in Spring MVC](https://www.baeldung.com/spring-mvc-handler-adapters) +- [Template Engines for Spring](https://www.baeldung.com/spring-template-engines) +- [Spring 5 and Servlet 4 – The PushBuilder](https://www.baeldung.com/spring-5-push) +- [Servlet Redirect vs Forward](https://www.baeldung.com/servlet-redirect-forward) +- [Apache Tiles Integration with Spring MVC](https://www.baeldung.com/spring-mvc-apache-tiles) +- [Guide to Spring Email](https://www.baeldung.com/spring-email) - [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405) - [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param) +- More articles: [[more -->]](/spring-mvc-simple-2) \ No newline at end of file diff --git a/spring-mvc-velocity/README.md b/spring-mvc-velocity/README.md index 401e135f75..99c4c032de 100644 --- a/spring-mvc-velocity/README.md +++ b/spring-mvc-velocity/README.md @@ -1,2 +1,6 @@ +## Spring MVC Velocity + +This module contains articles about Spring MVC with Velocity + ### Relevant Articles: -- [Quick Guide to Spring MVC with Velocity](http://www.baeldung.com/spring-mvc-with-velocity) +- [Quick Guide to Spring MVC with Velocity](https://www.baeldung.com/spring-mvc-with-velocity) diff --git a/spring-mvc-webflow/README.md b/spring-mvc-webflow/README.md index 2df4716e31..f89b97963e 100644 --- a/spring-mvc-webflow/README.md +++ b/spring-mvc-webflow/README.md @@ -1,9 +1,7 @@ -========= +## Spring MVC WebFlow -## Spring MVC with Spring Web Flow - -###The Course +This module contains articles about Spring MVC Web Flow ### Relevant Articles: -- -- [Guide to Spring Web Flow](http://www.baeldung.com/spring-web-flow) + +- [Guide to Spring Web Flow](https://www.baeldung.com/spring-web-flow) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index c8ec074d17..b6a34475ea 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -1,18 +1,19 @@ -========= +## Spring MVC XML + +This module contains articles about Spring MVC with XML configuration ###The Course The "REST With Spring" Classes: http://bit.ly/restwithspring +### Relevant Articles: +- [Java Session Timeout](https://www.baeldung.com/servlet-session-timeout) +- [Returning Image/Media Data with Spring MVC](https://www.baeldung.com/spring-mvc-image-media-data) +- [Geolocation by IP in Java](https://www.baeldung.com/geolocation-by-ip-with-maxmind) +- [Guide to JavaServer Pages (JSP)](https://www.baeldung.com/jsp) +- [Exploring SpringMVC’s Form Tag Library](https://www.baeldung.com/spring-mvc-form-tags) +- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) +- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) +- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) + ## Spring MVC with XML Configuration Example Project - access a sample jsp page at: `http://localhost:8080/spring-mvc-xml/sample.html` - - -### Relevant Articles: -- [Java Session Timeout](http://www.baeldung.com/servlet-session-timeout) -- [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) -- [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) -- [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp) -- [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags) -- [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) -- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) -- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) \ No newline at end of file diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java new file mode 100644 index 0000000000..dfa50fcb26 --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class GreetingController { + + @RequestMapping(value = "/greeting", method = RequestMethod.GET) + public String get(ModelMap model) { + model.addAttribute("message", "Hello, World!"); + return "greeting"; + } +} \ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp new file mode 100644 index 0000000000..ac17c75ab7 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Greeting + + +

${message}

+ + \ No newline at end of file diff --git a/spring-protobuf/README.md b/spring-protobuf/README.md index dad0e3f54a..37f35808e1 100644 --- a/spring-protobuf/README.md +++ b/spring-protobuf/README.md @@ -1,2 +1,6 @@ +## Spring Protocol Buffers + +This module contains articles about Spring with Protocol Buffers + ### Relevant Articles: -- [Spring REST API with Protocol Buffers](http://www.baeldung.com/spring-rest-api-with-protocol-buffers) +- [Spring REST API with Protocol Buffers](https://www.baeldung.com/spring-rest-api-with-protocol-buffers) diff --git a/spring-quartz/README.md b/spring-quartz/README.md index 5d32e65053..d9257066d4 100644 --- a/spring-quartz/README.md +++ b/spring-quartz/README.md @@ -1,26 +1,25 @@ -========================================================================= +## Spring Quartz -## Scheduling in Spring with Quartz Example Project -This is the first example where we configure a basic scheduler. -##### Spring boot application, Main class -### -``` -org.baeldung.springquartz.SpringQuartzApp -``` -###### - -##### Configuration in *application.properties* -#### - - - Default: configures scheduler using Spring convenience classes: - ``` - using.spring.schedulerFactory=true - ``` - - To configure scheduler using Quartz API: - ``` - using.spring.schedulerFactory=false - ``` +This module contains articles about Spring with Quartz ### Relevant Articles: -- [Scheduling in Spring with Quartz](http://www.baeldung.com/spring-quartz-schedule) +- [Scheduling in Spring with Quartz](https://www.baeldung.com/spring-quartz-schedule) + +## #Scheduling in Spring with Quartz Example Project +This is the first example where we configure a basic scheduler. + +##### Spring boot application, Main class + + +`org.baeldung.springquartz.SpringQuartzApp` + +##### Configuration in *application.properties* + + - Default: configures scheduler using Spring convenience classes: + + `using.spring.schedulerFactory=true` + + - To configure scheduler using Quartz API: + + `using.spring.schedulerFactory=false` diff --git a/spring-reactive-kotlin/README.md b/spring-reactive-kotlin/README.md index cf5debc617..629f7e7f58 100644 --- a/spring-reactive-kotlin/README.md +++ b/spring-reactive-kotlin/README.md @@ -1,2 +1,6 @@ +## Spring Reactive Kotlin + +This module contains articles about reactive Kotlin + ### Relevant Articles: -- [Spring Webflux with Kotlin](http://www.baeldung.com/spring-webflux-kotlin) +- [Spring Webflux with Kotlin](https://www.baeldung.com/spring-webflux-kotlin) diff --git a/spring-reactor/README.md b/spring-reactor/README.md index 0da2d6be51..b92478f6fb 100644 --- a/spring-reactor/README.md +++ b/spring-reactor/README.md @@ -1,3 +1,7 @@ +## Spring Reactor + +This module contains articles about Spring Reactor + ## Relevant articles: -- [Introduction to Spring Reactor](http://www.baeldung.com/spring-reactor) +- [Introduction to Spring Reactor](https://www.baeldung.com/spring-reactor) diff --git a/spring-remoting/README.md b/spring-remoting/README.md index 0898b9b002..a98893ebcb 100644 --- a/spring-remoting/README.md +++ b/spring-remoting/README.md @@ -1,11 +1,13 @@ -## Spring Remoting Tutorials +## Spring Remoting + +This module contains articles about Spring Remoting ### Relevant Articles -- [Intro to Spring Remoting with HTTP Invokers](http://www.baeldung.com/spring-remoting-http-invoker) -- [Spring Remoting with Hessian and Burlap](http://www.baeldung.com/spring-remoting-hessian-burlap) -- [Spring Remoting with AMQP](http://www.baeldung.com/spring-remoting-amqp) -- [Spring Remoting with JMS and ActiveMQ](http://www.baeldung.com/spring-remoting-jms) -- [Spring Remoting with RMI](http://www.baeldung.com/spring-remoting-rmi) +- [Intro to Spring Remoting with HTTP Invokers](https://www.baeldung.com/spring-remoting-http-invoker) +- [Spring Remoting with Hessian and Burlap](https://www.baeldung.com/spring-remoting-hessian-burlap) +- [Spring Remoting with AMQP](https://www.baeldung.com/spring-remoting-amqp) +- [Spring Remoting with JMS and ActiveMQ](https://www.baeldung.com/spring-remoting-jms) +- [Spring Remoting with RMI](https://www.baeldung.com/spring-remoting-rmi) ### Overview This Maven project contains the Java source code for various modules used in the Spring Remoting series of articles. diff --git a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java new file mode 100644 index 0000000000..4904873be2 --- /dev/null +++ b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -0,0 +1,23 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.server.JmsServer; + +/** + * This Live Test requires: + * * the `com.baeldung:remoting-http-api:jar:1.0-SNAPSHOT` artifact accessible. For that we can run `mvn clean install` in the 'spring-remoting/remoting-http/remoting-http-api' module. + * * an ActiveMQ instance running (e.g. `docker run -p 61616:61616 -p 8161:8161 --name bael-activemq rmohr/activemq`) + * + */ +@SpringBootTest(classes = JmsServer.class) +@RunWith(SpringRunner.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java deleted file mode 100644 index b806f21c27..0000000000 --- a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.server.JmsServer; - -@SpringBootTest(classes = JmsServer.class) -@RunWith(SpringRunner.class) -public class SpringContextManualTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 56% rename from spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/com/baeldung/SpringContextLiveTest.java index 3bace4cd1e..73f7592dcc 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,6 +7,12 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.client.RmiClient; +/** + * This Live Test requires: + * * the `com.baeldung:remoting-http-api:jar:1.0-SNAPSHOT` artifact accessible. For that we can run `mvn clean install` in the 'spring-remoting/remoting-http/remoting-http-api' module. + * * the 'spring-remoting\remoting-rmi\remoting-rmi-server' service running + * + */ @SpringBootTest(classes = RmiClient.class) @RunWith(SpringRunner.class) public class SpringContextLiveTest { diff --git a/spring-rest-angular/README.md b/spring-rest-angular/README.md index d2c2879649..038160db9d 100644 --- a/spring-rest-angular/README.md +++ b/spring-rest-angular/README.md @@ -1,5 +1,7 @@ -## Spring REST Angular Example Project +## Spring REST Angular + +This module contains articles about REST APIs with Spring and Angular ### Relevant Articles: -- [Pagination with Spring REST and AngularJS table](http://www.baeldung.com/pagination-with-a-spring-rest-api-and-an-angularjs-table) +- [Pagination with Spring REST and AngularJS table](https://www.baeldung.com/pagination-with-a-spring-rest-api-and-an-angularjs-table) diff --git a/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java b/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java index e0f6002733..0fc6b74892 100644 --- a/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java +++ b/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java @@ -26,7 +26,7 @@ public class PersistenceConfig { @Bean public DataSource dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); - EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.HSQL).addScript("db/sql/data.sql").build(); + EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.HSQL).build(); return db; } diff --git a/spring-rest-angular/src/main/resources/application.properties b/spring-rest-angular/src/main/resources/application.properties index 2571d286a3..cfa27938c9 100644 --- a/spring-rest-angular/src/main/resources/application.properties +++ b/spring-rest-angular/src/main/resources/application.properties @@ -1,4 +1,5 @@ server.servlet.contextPath=/ spring.h2.console.enabled=true logging.level.org.hibernate.SQL=info -spring.jpa.hibernate.ddl-auto=none \ No newline at end of file +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=create \ No newline at end of file diff --git a/spring-rest-angular/src/main/resources/db/sql/data.sql b/spring-rest-angular/src/main/resources/data.sql similarity index 90% rename from spring-rest-angular/src/main/resources/db/sql/data.sql rename to spring-rest-angular/src/main/resources/data.sql index 418381a681..71e54b29ce 100644 --- a/spring-rest-angular/src/main/resources/db/sql/data.sql +++ b/spring-rest-angular/src/main/resources/data.sql @@ -1,10 +1,3 @@ -CREATE TABLE student ( - id INTEGER PRIMARY KEY, - name VARCHAR(30), - gender VARCHAR(10), - age INTEGER -); - INSERT INTO student (id,name,gender,age) VALUES (1,'Bryan', 'Male',20); INSERT INTO student (id,name,gender,age) diff --git a/spring-rest-compress/README.md b/spring-rest-compress/README.md new file mode 100644 index 0000000000..ce627d8595 --- /dev/null +++ b/spring-rest-compress/README.md @@ -0,0 +1,6 @@ +## Spring REST Compress + +This module contains articles about request compression with Spring + +### Relevant Articles: +- [How to compress requests using the Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-compressing-requests) diff --git a/spring-rest-compress/pom.xml b/spring-rest-compress/pom.xml new file mode 100644 index 0000000000..d5afc5708d --- /dev/null +++ b/spring-rest-compress/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + com.baeldung + spring-rest-compress + 0.0.1-SNAPSHOT + spring-rest-compress + + + 1.8 + 2.6 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-jetty + + + + org.apache.httpcomponents + httpclient + + + + commons-io + commons-io + ${commons-io.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java new file mode 100644 index 0000000000..7d5326246d --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +public class CompressingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(CompressingClientHttpRequestInterceptor.class); + + private static final String GZIP_ENCODING = "gzip"; + + /** + * Compress a request body using Gzip and add Http headers. + * + * @param req + * @param body + * @param exec + * @return + * @throws IOException + */ + @Override + public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution exec) + throws IOException { + LOG.info("Compressing request..."); + HttpHeaders httpHeaders = req.getHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_ENCODING, GZIP_ENCODING); + httpHeaders.add(HttpHeaders.ACCEPT_ENCODING, GZIP_ENCODING); + return exec.execute(req, GzipUtils.compress(body)); + } + +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java new file mode 100644 index 0000000000..75420ca6d8 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java @@ -0,0 +1,52 @@ +package org.baeldung.spring.rest.compress; + +import org.apache.commons.codec.Charsets; +import org.apache.commons.io.IOUtils; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class GzipUtils { + + /** + * Gzip a string. + * + * @param text + * @return + * @throws Exception + */ + public static byte[] compress(String text) throws Exception { + return GzipUtils.compress(text.getBytes(Charsets.UTF_8)); + } + + /** + * Gzip a byte array. + * + * @param body + * @return + * @throws IOException + */ + public static byte[] compress(byte[] body) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(baos)) { + gzipOutputStream.write(body); + } + return baos.toByteArray(); + } + + /** + * Decompress a Gzipped byte array to a String. + * + * @param body + * @return + * @throws IOException + */ + public static String decompress(byte[] body) throws IOException { + try (GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(body))) { + return IOUtils.toString(gzipInputStream, Charsets.UTF_8); + } + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java new file mode 100644 index 0000000000..784814b04d --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configure Jetty web server so it handles compressed requests. + */ +@Configuration +public class JettyWebServerConfiguration { + + private static final int MIN_BYTES = 1; + + /** + * Customise the Jetty web server to automatically decompress requests. + */ + @Bean + public JettyServletWebServerFactory jettyServletWebServerFactory() { + + JettyServletWebServerFactory factory = new JettyServletWebServerFactory(); + factory.addServerCustomizers(server -> { + + GzipHandler gzipHandler = new GzipHandler(); + // Enable request decompression + gzipHandler.setInflateBufferSize(MIN_BYTES); + gzipHandler.setHandler(server.getHandler()); + + HandlerCollection handlerCollection = new HandlerCollection(gzipHandler); + server.setHandler(handlerCollection); + }); + + return factory; + } + +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java new file mode 100644 index 0000000000..d3450b227c --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java @@ -0,0 +1,29 @@ +package org.baeldung.spring.rest.compress; + +public class Message { + + private String text; + + public Message() { + } + + public Message(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Message {"); + sb.append("text='").append(text).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java new file mode 100644 index 0000000000..657c3cfec8 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class MessageController { + + protected static final String PROCESSED = "Processed "; + + protected static final String REQUEST_MAPPING = "process"; + + private static final Logger LOG = LoggerFactory.getLogger(MessageController.class); + + /** + * A simple endpoint that responds with "Processed " + supplied Message content. + * + * @param headers + * @param message + * @return + */ + @PostMapping(value = REQUEST_MAPPING) + public ResponseEntity processMessage(@RequestHeader Map headers, + @RequestBody Message message) { + + // Print headers + headers.forEach((k, v) -> LOG.info(k + "=" + v)); + + return ResponseEntity.ok(PROCESSED + message.getText()); + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java new file mode 100644 index 0000000000..e1d0f985d9 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.spring.rest.compress; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfiguration { + + /** + * A RestTemplate that compresses requests. + * + * @return RestTemplate + */ + @Bean + public RestTemplate getRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add(new CompressingClientHttpRequestInterceptor()); + return restTemplate; + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java new file mode 100644 index 0000000000..3082e3c277 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java @@ -0,0 +1,15 @@ +package org.baeldung.spring.rest.compress; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAutoConfiguration +public class SpringCompressRequestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCompressRequestApplication.class, args); + } + +} diff --git a/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java new file mode 100644 index 0000000000..d238c9ec7c --- /dev/null +++ b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java @@ -0,0 +1,19 @@ +package org.baeldung.spring.rest.compress; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class GzipUtilsUnitTest { + + @Test + public void givenCompressedText_whenDecompressed_thenSuccessful() throws Exception { + final String expectedText = "Hello Baeldung!"; + byte[] compressedText = GzipUtils.compress(expectedText); + String decompressedText = GzipUtils.decompress(compressedText); + assertNotNull(compressedText); + assertEquals(expectedText, decompressedText); + } + +} \ No newline at end of file diff --git a/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java new file mode 100644 index 0000000000..9658204917 --- /dev/null +++ b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java @@ -0,0 +1,56 @@ +package org.baeldung.spring.rest.compress; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class MessageControllerUnitTest { + + private static final Logger LOG = LoggerFactory.getLogger(MessageControllerUnitTest.class); + + @Autowired + private RestTemplate restTemplate; + + @LocalServerPort + private int randomServerPort; + + /** + * As a further test you can intercept the request body, using a tool like + * Wireshark, to see the request body is actually gzipped. + * + * @throws Exception + */ + @Test + public void givenRestTemplate_whenPostCompressedRequest_thenRespondsSuccessfully() throws Exception { + + final String text = "Hello Baeldung!"; + Message message = new Message(text); + + HttpEntity request = new HttpEntity<>(message); + String uri = String.format("http://localhost:%s/%s", randomServerPort, MessageController.REQUEST_MAPPING); + + ResponseEntity responseEntity = restTemplate.postForEntity(uri, request, String.class); + + String response = responseEntity.getBody(); + LOG.info("Got response [{}]", response); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertNotNull(response); + assertEquals(MessageController.PROCESSED + text, response); + } + +} diff --git a/spring-rest-full/README.md b/spring-rest-full/README.md index b7b006d75e..a0ba8df27d 100644 --- a/spring-rest-full/README.md +++ b/spring-rest-full/README.md @@ -1,16 +1,17 @@ -========= +## Spring REST Full -## REST Example Project with Spring +This module contains articles about REST APIs with Spring ### Courses + The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Integration Testing with the Maven Cargo plugin](http://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) -- [Project Configuration with Spring](http://www.baeldung.com/project-configuration-with-spring) -- [Metrics for your Spring REST API](http://www.baeldung.com/spring-rest-api-metrics) +- [Integration Testing with the Maven Cargo plugin](https://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) +- [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) +- [Metrics for your Spring REST API](https://www.baeldung.com/spring-rest-api-metrics) - [Spring Security Expressions - hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) diff --git a/spring-rest-hal-browser/README.md b/spring-rest-hal-browser/README.md index d9760c8295..90337aad1a 100644 --- a/spring-rest-hal-browser/README.md +++ b/spring-rest-hal-browser/README.md @@ -1,2 +1,6 @@ +## Spring REST HAL Browser + +This module contains articles about Spring REST with the HAL browser + ### Relevant Articles: -- [Spring REST and HAL Browser](http://www.baeldung.com/spring-rest-hal) +- [Spring REST and HAL Browser](https://www.baeldung.com/spring-rest-hal) diff --git a/spring-rest-query-language/README.md b/spring-rest-query-language/README.md index 7677f96379..4458fc93fb 100644 --- a/spring-rest-query-language/README.md +++ b/spring-rest-query-language/README.md @@ -1,30 +1,27 @@ -========= +## Spring REST Query Language -## REST Example Project Query Language +This module contains articles about the REST query language with Spring ### Courses + The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [REST Query Language with Spring and JPA Criteria](http://www.baeldung.com/rest-search-language-spring-jpa-criteria) -- [REST Query Language with Spring Data JPA Specifications](http://www.baeldung.com/rest-api-search-language-spring-data-specifications) -- [REST Query Language with Spring Data JPA and QueryDSL](http://www.baeldung.com/rest-api-search-language-spring-data-querydsl) -- [REST Query Language – Advanced Search Operations](http://www.baeldung.com/rest-api-query-search-language-more-operations) -- [REST Query Language with RSQL](http://www.baeldung.com/rest-api-search-language-rsql-fiql) -- [REST Query Language – Implementing OR Operation](http://www.baeldung.com/rest-api-query-search-or-operation) - - - +- [REST Query Language with Spring and JPA Criteria](https://www.baeldung.com/rest-search-language-spring-jpa-criteria) +- [REST Query Language with Spring Data JPA Specifications](https://www.baeldung.com/rest-api-search-language-spring-data-specifications) +- [REST Query Language with Spring Data JPA and QueryDSL](https://www.baeldung.com/rest-api-search-language-spring-data-querydsl) +- [REST Query Language – Advanced Search Operations](https://www.baeldung.com/rest-api-query-search-language-more-operations) +- [REST Query Language with RSQL](https://www.baeldung.com/rest-api-search-language-rsql-fiql) +- [REST Query Language – Implementing OR Operation](https://www.baeldung.com/rest-api-query-search-or-operation) ### Build the Project ``` mvn clean install ``` - ### Set up MySQL ``` mysql -u root -p diff --git a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java index 57886a232a..de83fb663a 100644 --- a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java @@ -7,6 +7,10 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.spring.Application; +/** + * Note: In the IDE, remember to generate query type classes before running the Integration Test (e.g. in Eclipse right-click on the project > Run As > Maven generate sources) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringContextTest { diff --git a/spring-rest-shell/README.md b/spring-rest-shell/README.md index b250f06a4b..3c04bb457e 100644 --- a/spring-rest-shell/README.md +++ b/spring-rest-shell/README.md @@ -1,5 +1,7 @@ -## Spring REST Shell Project +## Spring REST Shell + +This module contains articles about Spring REST Shell ### Relevant Articles -- [Introduction to Spring REST Shell](http://www.baeldung.com/spring-rest-shell) +- [Introduction to Spring REST Shell](https://www.baeldung.com/spring-rest-shell) diff --git a/spring-rest-simple/README.md b/spring-rest-simple/README.md index c01f27bd98..1ad32bf120 100644 --- a/spring-rest-simple/README.md +++ b/spring-rest-simple/README.md @@ -1,8 +1,12 @@ +## Spring REST Simple + +This module contains articles about REST APIs in Spring + ## Relevant articles: -- [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) -- [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) -- [Spring RequestMapping](http://www.baeldung.com/spring-requestmapping) -- [Spring and Apache FileUpload](http://www.baeldung.com/spring-apache-file-upload) -- [Test a REST API with curl](http://www.baeldung.com/curl-rest) +- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) +- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) +- [Spring RequestMapping](https://www.baeldung.com/spring-requestmapping) +- [Spring and Apache FileUpload](https://www.baeldung.com/spring-apache-file-upload) +- [Test a REST API with curl](https://www.baeldung.com/curl-rest) - [CORS with Spring](https://www.baeldung.com/spring-cors) diff --git a/spring-rest-simple/src/main/java/com/baeldung/Application.java b/spring-rest-simple/src/main/java/com/baeldung/Application.java index dc6bfcb970..f4147568ce 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/Application.java +++ b/spring-rest-simple/src/main/java/com/baeldung/Application.java @@ -4,11 +4,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @SpringBootApplication -@ComponentScan("com.baeldung.cors") public class Application extends SpringBootServletInitializer { public static void main(final String[] args) { diff --git a/spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java b/spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java new file mode 100644 index 0000000000..239d74b19c --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java @@ -0,0 +1,25 @@ +package com.baeldung.repository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.baeldung.web.dto.Book; + +@Repository +public class BookRepository { + + private List books = new ArrayList<>(); + + public Optional findById(long id) { + return books.stream() + .filter(book -> book.getId() == id) + .findFirst(); + } + + public void add(Book book) { + books.add(book); + } +} diff --git a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java index 2c11e36141..90012ed054 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java +++ b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java @@ -1,6 +1,8 @@ package com.baeldung.requestmapping; +import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -97,5 +99,29 @@ public class FooMappingExamplesController { public String putAndPostFoos() { return "Advanced - PUT and POST within single method"; } + + // --- Ambiguous Mapping + + @GetMapping(value = "foos/duplicate" ) + public String duplicate() { + return "Duplicate"; + } + + // uncomment for exception of type java.lang.IllegalStateException: Ambiguous mapping -} + // @GetMapping(value = "foos/duplicate" ) + // public String duplicateEx() { + // return "Duplicate"; + // } + + @GetMapping(value = "foos/duplicate/xml", produces = MediaType.APPLICATION_XML_VALUE) + public String duplicateXml() { + return "Duplicate Xml"; + } + + @GetMapping(value = "foos/duplicate/json", produces = MediaType.APPLICATION_JSON_VALUE) + public String duplicateJson() { + return "Duplicate Json"; + } + +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java b/spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java new file mode 100644 index 0000000000..e7f0ac3510 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java @@ -0,0 +1,22 @@ +package com.baeldung.web.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import com.baeldung.web.error.ApiErrorResponse; +import com.baeldung.web.error.BookNotFoundException; + +@RestControllerAdvice +public class ApiExceptionHandler { + + @ExceptionHandler(BookNotFoundException.class) + public ResponseEntity handleApiException( + BookNotFoundException ex) { + ApiErrorResponse response = + new ApiErrorResponse("error-0001", + "No book found with ID " + ex.getId()); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java b/spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java new file mode 100644 index 0000000000..126b40517d --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java @@ -0,0 +1,25 @@ +package com.baeldung.web.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.repository.BookRepository; +import com.baeldung.web.dto.Book; +import com.baeldung.web.error.BookNotFoundException; + +@RestController +@RequestMapping("/api/book") +public class BookController { + + @Autowired + private BookRepository repository; + + @GetMapping("/{id}") + public Book findById(@PathVariable long id) { + return repository.findById(id) + .orElseThrow(() -> new BookNotFoundException(id)); + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java b/spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java new file mode 100644 index 0000000000..9ccd640319 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java @@ -0,0 +1,32 @@ +package com.baeldung.web.dto; + +public class Book { + + private long id; + private String title; + private String author; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java b/spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java new file mode 100644 index 0000000000..a67a7a3f2f --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java @@ -0,0 +1,29 @@ +package com.baeldung.web.error; + +public class ApiErrorResponse { + + private String error; + private String message; + + public ApiErrorResponse(String error, String message) { + super(); + this.error = error; + this.message = message; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java b/spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java new file mode 100644 index 0000000000..ad93ef7f20 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java @@ -0,0 +1,19 @@ +package com.baeldung.web.error; + +@SuppressWarnings("serial") +public class BookNotFoundException extends RuntimeException { + + private long id; + + public BookNotFoundException(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java b/spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java new file mode 100644 index 0000000000..dd64f302fe --- /dev/null +++ b/spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.repository; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.web.dto.Book; + +public class BookRepositoryUnitTest { + + private BookRepository repository; + + @Before + public void setUp() { + repository = new BookRepository(); + } + + @Test + public void givenNoBooks_WhenFindById_ThenReturnEmptyOptional() { + assertFalse(repository.findById(1).isPresent()); + } + + @Test + public void givenOneMatchingBook_WhenFindById_ThenReturnEmptyOptional() { + + long id = 1; + Book expected = bookWithId(id); + + repository.add(expected); + + Optional found = repository.findById(id); + + assertTrue(found.isPresent()); + assertEquals(expected, found.get()); + } + + private static Book bookWithId(long id) { + Book book = new Book(); + book.setId(id); + return book; + } + + @Test + public void givenOneNonMatchingBook_WhenFindById_ThenReturnEmptyOptional() { + + long id = 1; + Book expected = bookWithId(id); + + repository.add(expected); + + Optional found = repository.findById(id + 1); + + assertFalse(found.isPresent()); + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java b/spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java new file mode 100644 index 0000000000..3bf5ce3c3d --- /dev/null +++ b/spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java @@ -0,0 +1,74 @@ +package com.baeldung.web.controller; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.Optional; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.Application; +import com.baeldung.repository.BookRepository; +import com.baeldung.web.dto.Book; +import com.baeldung.web.error.ApiErrorResponse; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringRunner.class) +@WebMvcTest(BookController.class) +@ComponentScan(basePackageClasses = Application.class) +public class BookControllerIntegrationTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Autowired + private MockMvc mvc; + + @MockBean + private BookRepository repository; + + @Test + public void givenNoExistingBooks_WhenGetBookWithId1_ThenErrorReturned() throws Exception { + + long id = 1; + + doReturn(Optional.empty()).when(repository).findById(eq(id)); + + mvc.perform(get("/api/book/{id}", id)) + .andExpect(status().isNotFound()) + .andExpect(content().json(MAPPER.writeValueAsString(new ApiErrorResponse("error-0001", "No book found with ID " + id)))); + } + + @Test + public void givenMatchingBookExists_WhenGetBookWithId1_ThenBookReturned() throws Exception { + + long id = 1; + Book book = book(id, "foo", "bar"); + + doReturn(Optional.of(book)).when(repository).findById(eq(id)); + + mvc.perform(get("/api/book/{id}", id)) + .andExpect(status().isOk()) + .andExpect(content().json(MAPPER.writeValueAsString(book))); + } + + private static Book book(long id, String title, String author) { + + Book book = new Book(); + + book.setId(id); + book.setTitle(title); + book.setAuthor(author); + + return book; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java b/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java index 4bbfa2818e..bc644af428 100644 --- a/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java +++ b/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java @@ -5,7 +5,7 @@ import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan({ "com.baeldung.web" }) +@ComponentScan({ "com.baeldung.web", "com.baeldung.repository" }) public class TestConfig { } diff --git a/spring-rest/README.md b/spring-rest/README.md index 54b47604d4..ac12066e8f 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -1,23 +1,25 @@ -## Spring REST Example Project +## Spring REST + +This module contains articles about REST APIs with Spring ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Spring @RequestMapping](http://www.baeldung.com/spring-requestmapping) -- [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) -- [Binary Data Formats in a Spring REST API](http://www.baeldung.com/spring-rest-api-with-binary-data-formats) -- [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) -- [Introduction to FindBugs](http://www.baeldung.com/intro-to-findbugs) -- [A Custom Media Type for a Spring REST API](http://www.baeldung.com/spring-rest-custom-media-type) -- [HTTP PUT vs HTTP PATCH in a REST API](http://www.baeldung.com/http-put-patch-difference-spring) -- [Spring – Log Incoming Requests](http://www.baeldung.com/spring-http-logging) -- [Introduction to CheckStyle](http://www.baeldung.com/checkstyle-java) -- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) -- [Guide to DeferredResult in Spring](http://www.baeldung.com/spring-deferred-result) -- [Spring Custom Property Editor](http://www.baeldung.com/spring-mvc-custom-property-editor) -- [Using the Spring RestTemplate Interceptor](http://www.baeldung.com/spring-rest-template-interceptor) -- [Get and Post Lists of Objects with RestTemplate](http://www.baeldung.com/spring-rest-template-list) -- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header) -- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) -- [Download an Image or a File with Spring MVC](http://www.baeldung.com/spring-controller-return-image-file) +- [Spring @RequestMapping](https://www.baeldung.com/spring-requestmapping) +- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) +- [Binary Data Formats in a Spring REST API](https://www.baeldung.com/spring-rest-api-with-binary-data-formats) +- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) +- [Introduction to FindBugs](https://www.baeldung.com/intro-to-findbugs) +- [A Custom Media Type for a Spring REST API](https://www.baeldung.com/spring-rest-custom-media-type) +- [HTTP PUT vs HTTP PATCH in a REST API](https://www.baeldung.com/http-put-patch-difference-spring) +- [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) +- [Introduction to CheckStyle](https://www.baeldung.com/checkstyle-java) +- [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) +- [Guide to DeferredResult in Spring](https://www.baeldung.com/spring-deferred-result) +- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) +- [Using the Spring RestTemplate Interceptor](https://www.baeldung.com/spring-rest-template-interceptor) +- [Get and Post Lists of Objects with RestTemplate](https://www.baeldung.com/spring-rest-template-list) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) +- [Uploading MultipartFile with Spring RestTemplate](https://www.baeldung.com/spring-rest-template-multipart-upload) +- [Download an Image or a File with Spring MVC](https://www.baeldung.com/spring-controller-return-image-file) diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 670bac9805..555eafe40a 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -139,7 +139,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} au.com.dius diff --git a/spring-rest/src/main/java/com/baeldung/custom/CustomApplication.java b/spring-rest/src/main/java/com/baeldung/changeport/CustomApplication.java similarity index 92% rename from spring-rest/src/main/java/com/baeldung/custom/CustomApplication.java rename to spring-rest/src/main/java/com/baeldung/changeport/CustomApplication.java index 75f4d714e2..3fce0f1289 100644 --- a/spring-rest/src/main/java/com/baeldung/custom/CustomApplication.java +++ b/spring-rest/src/main/java/com/baeldung/changeport/CustomApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.custom; +package com.baeldung.changeport; import java.util.Collections; diff --git a/spring-rest/src/main/java/com/baeldung/custom/ServerPortCustomizer.java b/spring-rest/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java similarity index 92% rename from spring-rest/src/main/java/com/baeldung/custom/ServerPortCustomizer.java rename to spring-rest/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java index 978e7c8a82..f3610aeac6 100644 --- a/spring-rest/src/main/java/com/baeldung/custom/ServerPortCustomizer.java +++ b/spring-rest/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java @@ -1,4 +1,4 @@ -package com.baeldung.custom; +package com.baeldung.changeport; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; diff --git a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java index f04106c1e1..3c2cde4268 100644 --- a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -5,7 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.custom.CustomApplication; +import com.baeldung.changeport.CustomApplication; import com.baeldung.produceimage.ImageApplication; import com.baeldung.propertyeditor.PropertyEditorApplication; import com.baeldung.responseheaders.ResponseHeadersApplication; diff --git a/spring-rest/src/test/java/com/baeldung/SpringContextTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextTest.java index 4b2024e207..0f39fc3983 100644 --- a/spring-rest/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextTest.java @@ -5,7 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.custom.CustomApplication; +import com.baeldung.changeport.CustomApplication; import com.baeldung.produceimage.ImageApplication; import com.baeldung.propertyeditor.PropertyEditorApplication; import com.baeldung.responseheaders.ResponseHeadersApplication; diff --git a/spring-resttemplate/README.md b/spring-resttemplate/README.md index 97a89ff7aa..e98af0e787 100644 --- a/spring-resttemplate/README.md +++ b/spring-resttemplate/README.md @@ -1,13 +1,15 @@ -## Spring REST Example Project +## Spring RestTemplate + +This module contains articles about Spring RestTemplate ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [The Guide to RestTemplate](http://www.baeldung.com/rest-template) -- [Exploring the Spring Boot TestRestTemplate](http://www.baeldung.com/spring-boot-testresttemplate) -- [Spring RestTemplate Error Handling](http://www.baeldung.com/spring-rest-template-error-handling) -- [Configure a RestTemplate with RestTemplateBuilder](http://www.baeldung.com/spring-rest-template-builder) +- [The Guide to RestTemplate](https://www.baeldung.com/rest-template) +- [Exploring the Spring Boot TestRestTemplate](https://www.baeldung.com/spring-boot-testresttemplate) +- [Spring RestTemplate Error Handling](https://www.baeldung.com/spring-rest-template-error-handling) +- [Configure a RestTemplate with RestTemplateBuilder](https://www.baeldung.com/spring-rest-template-builder) - [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) - [RestTemplate Post Request with JSON](https://www.baeldung.com/spring-resttemplate-post-json) - [Download a Large File Through a Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-download-large-file) diff --git a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java similarity index 96% rename from spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java rename to spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java index de18f6db09..1347cb0c7a 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java +++ b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java @@ -1,10 +1,11 @@ -package org.baeldung.resttemplate; +package org.baeldung.resttemplate.postjson; import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.net.URI; +import org.baeldung.resttemplate.RestTemplateConfigurationApplication; import org.baeldung.resttemplate.web.dto.Person; import org.json.JSONException; import org.json.JSONObject; diff --git a/spring-roo/README.md b/spring-roo/README.md index b63b6f35d4..abbc4249d4 100644 --- a/spring-roo/README.md +++ b/spring-roo/README.md @@ -1,2 +1,6 @@ +## Spring Roo + +This module contains articles about Spring Roo + ### Relevant Articles: -[Quick Guide to Spring Roo](http://www.baeldung.com/spring-roo) +[Quick Guide to Spring Roo](https://www.baeldung.com/spring-roo) diff --git a/spring-security-acl/README.md b/spring-security-acl/README.md index fb3e8160ab..b2f42d5c29 100644 --- a/spring-security-acl/README.md +++ b/spring-security-acl/README.md @@ -1,4 +1,6 @@ -## Spring Security ACL Project +## Spring Security ACL + +This module contains articles about Spring Security ACL ### Relevant Articles -- [Introduction to Spring Security ACL](http://www.baeldung.com/spring-security-acl) +- [Introduction to Spring Security ACL](https://www.baeldung.com/spring-security-acl) diff --git a/spring-security-angular/README.md b/spring-security-angular/README.md index 80312c4bab..2b376a539f 100644 --- a/spring-security-angular/README.md +++ b/spring-security-angular/README.md @@ -1,2 +1,6 @@ +## Spring Security Angular + +This module contains articles about Spring Security with Angular + ### Relevant Articles: - [Spring Security Login Page with Angular](https://www.baeldung.com/spring-security-login-angular) diff --git a/spring-security-cache-control/README.md b/spring-security-cache-control/README.md index 4b0bab72cb..1c7cbfd096 100644 --- a/spring-security-cache-control/README.md +++ b/spring-security-cache-control/README.md @@ -1,6 +1,6 @@ -========= - ## Spring Security Cache Control +This module contains articles about cache control with Spring Security + ### Relevant Articles: -- [Spring Security – Cache Control Headers](http://www.baeldung.com/spring-security-cache-control-headers) +- [Spring Security – Cache Control Headers](https://www.baeldung.com/spring-security-cache-control-headers) diff --git a/spring-security-core/README.md b/spring-security-core/README.md index bc9a8afed7..3579e5e759 100644 --- a/spring-security-core/README.md +++ b/spring-security-core/README.md @@ -1,13 +1,15 @@ -## @PreFilter and @PostFilter annotations +## Spring Security Core -### Build the Project ### - -``` -mvn clean install -``` +This module contains articles about core Spring Security ### Relevant Articles: -- [Spring Security – @PreFilter and @PostFilter](http://www.baeldung.com/spring-security-prefilter-postfilter) -- [Spring Boot Authentication Auditing Support](http://www.baeldung.com/spring-boot-authentication-audit) -- [Introduction to Spring Method Security](http://www.baeldung.com/spring-security-method-security) -- [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy) \ No newline at end of file +- [Spring Security – @PreFilter and @PostFilter](https://www.baeldung.com/spring-security-prefilter-postfilter) +- [Spring Boot Authentication Auditing Support](https://www.baeldung.com/spring-boot-authentication-audit) +- [Introduction to Spring Method Security](https://www.baeldung.com/spring-security-method-security) +- [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy) + +### @PreFilter and @PostFilter annotations + +#### Build the Project + +`mvn clean install` diff --git a/spring-security-cors/README.md b/spring-security-cors/README.md index 2ab5e33ee3..c9e00e04d7 100644 --- a/spring-security-cors/README.md +++ b/spring-security-cors/README.md @@ -1,3 +1,7 @@ +## Spring Security CORS + +This module contains articles about Spring Security with CORS (Cross Origin Requests) + ## Relevant Articles - [Fixing 401s with CORS Preflights and Spring Security](https://www.baeldung.com/spring-security-cors-preflight) diff --git a/spring-security-kerberos/README.md b/spring-security-kerberos/README.md index 1b77c380db..a868fb86b7 100644 --- a/spring-security-kerberos/README.md +++ b/spring-security-kerberos/README.md @@ -1,10 +1,13 @@ -## @PreFilter and @PostFilter annotations +## Spring Security Kerberos + +This module contains articles about Spring Security Kerberos + +### Relevant Articles: + +- [Introduction to SPNEGO/Kerberos Authentication in Spring](https://www.baeldung.com/spring-security-kerberos) + +### @PreFilter and @PostFilter annotations ### Build the Project ### -``` -mvn clean install -``` - -### Relevant Articles: -- [Introduction to SPNEGO/Kerberos Authentication in Spring](https://www.baeldung.com/spring-security-kerberos) +`mvn clean install` \ No newline at end of file diff --git a/spring-security-kerberos/pom.xml b/spring-security-kerberos/pom.xml index d98d0ff508..437e8566bb 100644 --- a/spring-security-kerberos/pom.xml +++ b/spring-security-kerberos/pom.xml @@ -28,17 +28,17 @@ org.springframework.security.kerberos spring-security-kerberos-core - 1.0.1.RELEASE + ${spring-security-kerberos.version} org.springframework.security.kerberos spring-security-kerberos-web - 1.0.1.RELEASE + ${spring-security-kerberos.version} org.springframework.security.kerberos spring-security-kerberos-client - 1.0.1.RELEASE + ${spring-security-kerberos.version} @@ -61,4 +61,8 @@
+ + + 1.0.1.RELEASE + diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD deleted file mode 100644 index 20036283a3..0000000000 --- a/spring-security-mvc-boot/README.MD +++ /dev/null @@ -1,15 +0,0 @@ -### The Course -The "REST With Spring" Classes: http://github.learnspringsecurity.com - -### Relevant Articles: -- [A Custom Security Expression with Spring Security](http://www.baeldung.com/spring-security-create-new-custom-security-expression) -- [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) -- [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) -- [Two Login Pages with Spring Security](http://www.baeldung.com/spring-security-two-login-pages) -- [Multiple Entry Points in Spring Security](http://www.baeldung.com/spring-security-multiple-entry-points) -- [Multiple Authentication Providers in Spring Security](http://www.baeldung.com/spring-security-multiple-auth-providers) -- [Granted Authority Versus Role in Spring Security](http://www.baeldung.com/spring-security-granted-authority-vs-role) -- [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security) -- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range) -- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters) -- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate) diff --git a/spring-security-mvc-boot/README.md b/spring-security-mvc-boot/README.md new file mode 100644 index 0000000000..7dcfe4d70f --- /dev/null +++ b/spring-security-mvc-boot/README.md @@ -0,0 +1,19 @@ +## Spring Boot Security MVC + +This module contains articles about Spring Security with Spring MVC in Boot applications + +### The Course +The "REST With Spring" Classes: http://github.learnspringsecurity.com + +### Relevant Articles: +- [A Custom Security Expression with Spring Security](https://www.baeldung.com/spring-security-create-new-custom-security-expression) +- [Custom AccessDecisionVoters in Spring Security](https://www.baeldung.com/spring-security-custom-voter) +- [Spring Security: Authentication with a Database-backed UserDetailsService](https://www.baeldung.com/spring-security-authentication-with-a-database) +- [Two Login Pages with Spring Security](https://www.baeldung.com/spring-security-two-login-pages) +- [Multiple Entry Points in Spring Security](https://www.baeldung.com/spring-security-multiple-entry-points) +- [Multiple Authentication Providers in Spring Security](https://www.baeldung.com/spring-security-multiple-auth-providers) +- [Granted Authority Versus Role in Spring Security](https://www.baeldung.com/spring-security-granted-authority-vs-role) +- [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security) +- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range) +- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters) +- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate) diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md b/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md new file mode 100644 index 0000000000..a7cdfec7d8 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication) diff --git a/spring-security-mvc-custom/README.md b/spring-security-mvc-custom/README.md index ca0731a0c3..1a131f4c23 100644 --- a/spring-security-mvc-custom/README.md +++ b/spring-security-mvc-custom/README.md @@ -1,18 +1,18 @@ -========= +## Spring Security MVC Custom -## Spring Security Login Example Project +This module contains articles about Spring Security with custom MVC applications ###The Course The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security Remember Me](http://www.baeldung.com/spring-security-remember-me) -- [Redirect to different pages after Login with Spring Security](http://www.baeldung.com/spring_redirect_after_login) -- [Changing Spring Model Parameters with Handler Interceptor](http://www.baeldung.com/spring-model-parameters-with-handler-interceptor) -- [Introduction to Spring MVC HandlerInterceptor](http://www.baeldung.com/spring-mvc-handlerinterceptor) -- [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](http://www.baeldung.com/spring-mvc-custom-handler-interceptor) -- [A Guide to CSRF Protection in Spring Security](http://www.baeldung.com/spring-security-csrf) -- [How to Manually Authenticate User with Spring Security](http://www.baeldung.com/manually-set-user-authentication-spring-security) +- [Spring Security Remember Me](https://www.baeldung.com/spring-security-remember-me) +- [Redirect to different pages after Login with Spring Security](https://www.baeldung.com/spring_redirect_after_login) +- [Changing Spring Model Parameters with Handler Interceptor](https://www.baeldung.com/spring-model-parameters-with-handler-interceptor) +- [Introduction to Spring MVC HandlerInterceptor](https://www.baeldung.com/spring-mvc-handlerinterceptor) +- [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](https://www.baeldung.com/spring-mvc-custom-handler-interceptor) +- [A Guide to CSRF Protection in Spring Security](https://www.baeldung.com/spring-security-csrf) +- [How to Manually Authenticate User with Spring Security](https://www.baeldung.com/manually-set-user-authentication-spring-security) ### Build the Project ``` diff --git a/spring-security-mvc-digest-auth/README.md b/spring-security-mvc-digest-auth/README.md index be0bf0a675..0d36dbfd63 100644 --- a/spring-security-mvc-digest-auth/README.md +++ b/spring-security-mvc-digest-auth/README.md @@ -1,11 +1,11 @@ -========= +## Spring Security with Digest Authentication -## Spring Security with Digest Authentication Example Project +This module contains articles about digest authentication with Spring Security ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: -- [Spring Security Digest Authentication](http://www.baeldung.com/spring-security-digest-authentication) -- [RestTemplate with Digest Authentication](http://www.baeldung.com/resttemplate-digest-authentication) +- [Spring Security Digest Authentication](https://www.baeldung.com/spring-security-digest-authentication) +- [RestTemplate with Digest Authentication](https://www.baeldung.com/resttemplate-digest-authentication) diff --git a/spring-security-mvc-jsonview/README.md b/spring-security-mvc-jsonview/README.md index 35c806e856..0e28d4c292 100644 --- a/spring-security-mvc-jsonview/README.md +++ b/spring-security-mvc-jsonview/README.md @@ -1,3 +1,7 @@ +## Spring Security MVC Json View + +This module contains articles about Spring Security with JSON + ### Relevant Articles: - [Filtering Jackson JSON Output Based on Spring Security Role](https://www.baeldung.com/spring-security-role-filter-json) diff --git a/spring-security-mvc-ldap/README.md b/spring-security-mvc-ldap/README.md index 6f03143183..3230c0398a 100644 --- a/spring-security-mvc-ldap/README.md +++ b/spring-security-mvc-ldap/README.md @@ -1,12 +1,13 @@ +## Spring Security LDAP -## Spring Security with LDAP Example Project +This module contains articles about Spring Security LDAP ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: -- [Spring Security – security none, filters none, access permitAll](http://www.baeldung.com/security-none-filters-none-access-permitAll) -- [Intro to Spring Security LDAP](http://www.baeldung.com/spring-security-ldap) +- [Spring Security – security none, filters none, access permitAll](https://www.baeldung.com/security-none-filters-none-access-permitAll) +- [Intro to Spring Security LDAP](https://www.baeldung.com/spring-security-ldap) ### Notes - the project uses Spring Boot - simply run 'SampleLDAPApplication.java' to start up Spring Boot with a Tomcat container and embedded LDAP server. diff --git a/spring-security-mvc-login/README.md b/spring-security-mvc-login/README.md index 983d949cb8..5d92a8e1b4 100644 --- a/spring-security-mvc-login/README.md +++ b/spring-security-mvc-login/README.md @@ -1,18 +1,18 @@ -========= +## Spring Security Login -## Spring Security Login Example Project +This module contains articles about login mechanisms with Spring Security -###The Course +### The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security Form Login](http://www.baeldung.com/spring-security-login) -- [Spring Security Logout](http://www.baeldung.com/spring-security-logout) -- [Spring Security Expressions – hasRole Example](http://www.baeldung.com/spring-security-expressions-basic) -- [Spring HTTP/HTTPS Channel Security](http://www.baeldung.com/spring-channel-security-https) -- [Spring Security – Customize the 403 Forbidden/Access Denied Page](http://www.baeldung.com/spring-security-custom-access-denied-page) -- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) -- [Spring Security Custom AuthenticationFailureHandler](http://www.baeldung.com/spring-security-custom-authentication-failure-handler) +- [Spring Security Form Login](https://www.baeldung.com/spring-security-login) +- [Spring Security Logout](https://www.baeldung.com/spring-security-logout) +- [Spring Security Expressions – hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) +- [Spring HTTP/HTTPS Channel Security](https://www.baeldung.com/spring-channel-security-https) +- [Spring Security – Customize the 403 Forbidden/Access Denied Page](https://www.baeldung.com/spring-security-custom-access-denied-page) +- [Spring Security – Redirect to the Previous URL After Login](https://www.baeldung.com/spring-security-redirect-login) +- [Spring Security Custom AuthenticationFailureHandler](https://www.baeldung.com/spring-security-custom-authentication-failure-handler) ### Build the Project ``` diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java similarity index 98% rename from spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java rename to spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java index 08a83f8633..15fa06aa3e 100644 --- a/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java index b7d959bf36..01cb8e7b67 100644 --- a/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java +++ b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java @@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.SecSecurityConfig; +import com.baeldung.security.config.SecSecurityConfig; import javax.servlet.Filter; diff --git a/spring-security-mvc-persisted-remember-me/README.md b/spring-security-mvc-persisted-remember-me/README.md index db2ae890f9..e3003e89e2 100644 --- a/spring-security-mvc-persisted-remember-me/README.md +++ b/spring-security-mvc-persisted-remember-me/README.md @@ -1,12 +1,12 @@ -========= +## Spring Security Persisted Remember Me -## Spring Security Persisted Remember Me Example Project +This module contains articles about 'remember me' with Spring Security ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security – Persistent Remember Me](http://www.baeldung.com/spring-security-persistent-remember-me) +- [Spring Security – Persistent Remember Me](https://www.baeldung.com/spring-security-persistent-remember-me) ### Build the Project ``` diff --git a/spring-security-mvc-socket/README.md b/spring-security-mvc-socket/README.md index d3f28af387..d134d19c84 100644 --- a/spring-security-mvc-socket/README.md +++ b/spring-security-mvc-socket/README.md @@ -1,11 +1,17 @@ +## Spring Security MVC Socket + +This module contains articles about WebSockets with Spring Security + +### Relevant Articles: + +- [Intro to Security and WebSockets](https://www.baeldung.com/spring-security-websockets) +- [Spring WebSockets: Build an User Chat](https://www.baeldung.com/spring-websockets-send-message-to-user) +- [REST vs WebSockets](https://www.baeldung.com/rest-vs-websockets) + +### Running This Project: + To build the project, run the command: mvn clean install. This will build a war file in the target folder that you can deploye on a server like Tomcat. Alternatively, run the project from an IDE. To login, use credentials from the data.sql file in src/main/resource, eg: user/password. - - -### Relevant Articles: -- [Intro to Security and WebSockets](http://www.baeldung.com/spring-security-websockets) -- [Spring WebSockets: Build an User Chat](https://www.baeldung.com/spring-websockets-send-message-to-user) -- [REST vs WebSockets](https://www.baeldung.com/rest-vs-websockets) diff --git a/spring-security-mvc/README.md b/spring-security-mvc/README.md index ce40ed5f5f..a458127c61 100644 --- a/spring-security-mvc/README.md +++ b/spring-security-mvc/README.md @@ -1,13 +1,13 @@ -========= +## Spring Security MVC -## Spring Security Login Example Project +This module contains articles about Spring Security in MVC applications ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [HttpSessionListener Example – Monitoring](http://www.baeldung.com/httpsessionlistener_with_metrics) -- [Control the Session with Spring Security](http://www.baeldung.com/spring-security-session) +- [HttpSessionListener Example – Monitoring](https://www.baeldung.com/httpsessionlistener_with_metrics) +- [Control the Session with Spring Security](https://www.baeldung.com/spring-security-session) ### Build the Project diff --git a/spring-security-mvc/src/main/java/com/baeldung/SpringSessionApplication.java b/spring-security-mvc/src/main/java/com/baeldung/session/SpringSessionApplication.java similarity index 91% rename from spring-security-mvc/src/main/java/com/baeldung/SpringSessionApplication.java rename to spring-security-mvc/src/main/java/com/baeldung/session/SpringSessionApplication.java index c2a4b35df0..ec1ba8dcd9 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/SpringSessionApplication.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/SpringSessionApplication.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.session; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-mvc/src/main/java/com/baeldung/security/SessionFilter.java b/spring-security-mvc/src/main/java/com/baeldung/session/filter/SessionFilter.java similarity index 97% rename from spring-security-mvc/src/main/java/com/baeldung/security/SessionFilter.java rename to spring-security-mvc/src/main/java/com/baeldung/session/filter/SessionFilter.java index f4f876af9c..c30bfa5506 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/security/SessionFilter.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/filter/SessionFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.security; +package com.baeldung.session.filter; import java.io.IOException; import java.util.Arrays; diff --git a/spring-security-mvc/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java similarity index 98% rename from spring-security-mvc/src/main/java/com/baeldung/spring/SecSecurityConfig.java rename to spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java index a922ba6f7f..35b53a0e7f 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.session.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-mvc/src/main/java/com/baeldung/web/SessionRestController.java b/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java similarity index 93% rename from spring-security-mvc/src/main/java/com/baeldung/web/SessionRestController.java rename to spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java index 1353ee25d0..82199a9e4e 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/web/SessionRestController.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java @@ -1,4 +1,4 @@ -package com.baeldung.web; +package com.baeldung.session.web; import javax.servlet.http.HttpSession; diff --git a/spring-security-mvc/src/main/java/com/baeldung/spring/MvcConfig.java b/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MvcConfig.java similarity index 96% rename from spring-security-mvc/src/main/java/com/baeldung/spring/MvcConfig.java rename to spring-security-mvc/src/main/java/com/baeldung/session/web/config/MvcConfig.java index 38a4f3f81b..4db6d07872 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/spring/MvcConfig.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MvcConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.session.web.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; diff --git a/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 8e53a6371a..ac9da5ca60 100644 --- a/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -5,8 +5,10 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.session.SpringSessionApplication; + @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = SpringSessionApplication.class) public class SpringContextIntegrationTest { @Test diff --git a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java similarity index 64% rename from spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java index 7f906bdbcd..f1c3801c8a 100644 --- a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java @@ -1,15 +1,15 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.Application; +import com.baeldung.session.SpringSessionApplication; @RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class SpringContextIntegrationTest { +@SpringBootTest(classes = SpringSessionApplication.class) +public class SpringContextTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-security-openid/README.md b/spring-security-openid/README.md index 8c65c09f2f..1f856fe191 100644 --- a/spring-security-openid/README.md +++ b/spring-security-openid/README.md @@ -1,16 +1,21 @@ +## Spring Security OpenID + +This module contains articles about OpenID with Spring Security + ### Relevant articles -- [Spring Security and OpenID Connect](http://www.baeldung.com/spring-security-openid-connect) +- [Spring Security and OpenID Connect](https://www.baeldung.com/spring-security-openid-connect) - -## OpenID Connect with Spring Security +### OpenID Connect with Spring Security ### Run the Project + ``` mvn spring-boot:run ``` ### Obtain Google App - Client ID, Secret + - You need to get client id and client secret by creating a new project at [Google Developer Console](https://console.developers.google.com/project/_/apiui/credential?pli=1) - Make sure to add OAuth2 credentials by selecting Add credentials > OAuth 2.0 client ID - Make sure you set redirect URI to http://localhost:8081/google-login diff --git a/spring-security-react/README.md b/spring-security-react/README.md index 1a845f0daa..6c9e1dad7a 100644 --- a/spring-security-react/README.md +++ b/spring-security-react/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security React -## Spring Security React Example Project +This module contains articles about Spring Security with ReactJS ### The Course @@ -8,7 +8,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -* [Spring Security Login Page with React](http://www.baeldung.com/spring-security-login-react) +* [Spring Security Login Page with React](https://www.baeldung.com/spring-security-login-react) ### Build the Project diff --git a/spring-security-rest-basic-auth/README.md b/spring-security-rest-basic-auth/README.md index b905824161..d12427a106 100644 --- a/spring-security-rest-basic-auth/README.md +++ b/spring-security-rest-basic-auth/README.md @@ -1,11 +1,12 @@ -========= +## Spring Security REST Basic Authentication -## REST API with Basic Authentication - Example Project +This module contains articles about basic authentication in RESTful APIs with Spring Security ###The Course + The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Basic Authentication with the RestTemplate](http://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring) -- [A Custom Filter in the Spring Security Filter Chain](http://www.baeldung.com/spring-security-custom-filter) -- [Spring Security Basic Authentication](http://www.baeldung.com/spring-security-basic-authentication) +- [Basic Authentication with the RestTemplate](https://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring) +- [A Custom Filter in the Spring Security Filter Chain](https://www.baeldung.com/spring-security-custom-filter) +- [Spring Security Basic Authentication](https://www.baeldung.com/spring-security-basic-authentication) diff --git a/spring-security-rest-custom/README.md b/spring-security-rest-custom/README.md index d7cb31e784..15cbc22b5f 100644 --- a/spring-security-rest-custom/README.md +++ b/spring-security-rest-custom/README.md @@ -1,11 +1,11 @@ -========= +## Spring Security REST Custom -## Spring Security for REST Example Project +This module contains articles about REST APIs with Spring Security ###The Course The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security Authentication Provider](http://www.baeldung.com/spring-security-authentication-provider) -- [Retrieve User Information in Spring Security](http://www.baeldung.com/get-user-in-spring-security) +- [Spring Security Authentication Provider](https://www.baeldung.com/spring-security-authentication-provider) +- [Retrieve User Information in Spring Security](https://www.baeldung.com/get-user-in-spring-security) - [Spring Security – Run-As Authentication](https://www.baeldung.com/spring-security-run-as-auth) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index f450a514b2..d61a52070c 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security REST -## Spring Security for REST Example Project +This module contains articles about REST APIs with Spring Security ### Courses The "REST With Spring" Classes: http://bit.ly/restwithspring @@ -8,10 +8,10 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring REST Service Security](http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/) -- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) -- [Custom Error Message Handling for REST API](http://www.baeldung.com/global-error-handler-in-a-spring-rest-api) -- [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) -- [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security) -- [Intro to Spring Security Expressions](http://www.baeldung.com/spring-security-expressions) -- [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) +- [Spring REST Service Security](https://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/) +- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) +- [Custom Error Message Handling for REST API](https://www.baeldung.com/global-error-handler-in-a-spring-rest-api) +- [Spring Security Context Propagation with @Async](https://www.baeldung.com/spring-security-async-principal-propagation) +- [Servlet 3 Async Support with Spring MVC and Spring Security](https://www.baeldung.com/spring-mvc-async-security) +- [Intro to Spring Security Expressions](https://www.baeldung.com/spring-security-expressions) +- [Spring Security for a REST API](https://www.baeldung.com/securing-a-restful-web-service-with-spring-security) diff --git a/spring-security-rest/src/main/java/org/baeldung/web/ApiError.java b/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java similarity index 97% rename from spring-security-rest/src/main/java/org/baeldung/web/ApiError.java rename to spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java index e1c58da64a..8a1ddd8882 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/ApiError.java +++ b/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package org.baeldung.errorhandling; import java.util.Arrays; import java.util.List; diff --git a/spring-security-rest/src/main/java/org/baeldung/web/CustomRestExceptionHandler.java b/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java similarity index 99% rename from spring-security-rest/src/main/java/org/baeldung/web/CustomRestExceptionHandler.java rename to spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java index 71b1a4775e..cd4d58e60c 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/CustomRestExceptionHandler.java +++ b/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package org.baeldung.errorhandling; import java.util.ArrayList; import java.util.List; diff --git a/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java b/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java similarity index 96% rename from spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java rename to spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java index 86beeb46a9..8d1db5736f 100644 --- a/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java +++ b/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java @@ -1,8 +1,10 @@ -package org.baeldung.web; +package org.baeldung.errorhandling; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import org.baeldung.errorhandling.ApiError; +import org.baeldung.web.TestConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.http.HttpStatus; diff --git a/spring-security-sso/README.md b/spring-security-sso/README.md index 88e3fbb2f7..23b53521be 100644 --- a/spring-security-sso/README.md +++ b/spring-security-sso/README.md @@ -1,3 +1,7 @@ +## Spring Security Single Sign On + +This module contains modules about single-sign-on with Spring Security + ### Relevant Articles: -- [Simple Single Sign-On with Spring Security OAuth2](http://www.baeldung.com/sso-spring-security-oauth2) +- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2) - [Spring Security Kerberos Integration](https://www.baeldung.com/spring-security-kerberos-integration) diff --git a/spring-security-stormpath/README.md b/spring-security-stormpath/README.md index f83882112f..971d4cc858 100644 --- a/spring-security-stormpath/README.md +++ b/spring-security-stormpath/README.md @@ -1,3 +1,7 @@ +## Spring Security Stormpath + +This module contains articles about Spring Security with Stormpath + ### Relevant articles -- [Spring Security with Stormpath](http://www.baeldung.com/spring-security-stormpath) +- [Spring Security with Stormpath](https://www.baeldung.com/spring-security-stormpath) diff --git a/spring-security-thymeleaf/README.MD b/spring-security-thymeleaf/README.MD index 36007bce62..ad533faefd 100644 --- a/spring-security-thymeleaf/README.MD +++ b/spring-security-thymeleaf/README.MD @@ -1,6 +1,7 @@ -This module is for Spring Security Thymeleaf tutorial. -Jira BAEL-1556 +## Spring Security Thymeleaf + +This module contains articles about Spring Security with Thymeleaf. ### Relevant Articles: -- [Spring Security with Thymeleaf](http://www.baeldung.com/spring-security-thymeleaf) +- [Spring Security with Thymeleaf](https://www.baeldung.com/spring-security-thymeleaf) diff --git a/spring-security-x509/README.md b/spring-security-x509/README.md index 2a4b84eae6..b1eb0debf5 100644 --- a/spring-security-x509/README.md +++ b/spring-security-x509/README.md @@ -1,2 +1,6 @@ -Relevant Articles: -- [X.509 Authentication in Spring Security](http://www.baeldung.com/x-509-authentication-in-spring-security) +## Spring Security X.509 + +This module contains articles about X.509 authentication with Spring Security + +### Relevant Articles: +- [X.509 Authentication in Spring Security](https://www.baeldung.com/x-509-authentication-in-spring-security) diff --git a/spring-session/README.md b/spring-session/README.md index c9875beadf..65040ec734 100644 --- a/spring-session/README.md +++ b/spring-session/README.md @@ -1,6 +1,6 @@ -========= +## Spring Session -## Spring Session Examples +This module contains articles about Spring Session ### Relevant Articles: - [Guide to Spring Session](https://www.baeldung.com/spring-session) diff --git a/spring-session/spring-session-jdbc/README.md b/spring-session/spring-session-jdbc/README.md index 94fd1cd3e7..a31ee044e8 100644 --- a/spring-session/spring-session-jdbc/README.md +++ b/spring-session/spring-session-jdbc/README.md @@ -1,4 +1,7 @@ -This module is for Spring Session with JDBC tutorial. -Jira BAEL-1911 +## Spring Session with JDBC + +This module contains articles about Spring Session with JDBC. ### Relevant Articles: + +- [Spring Session with JDBC](https://www.baeldung.com/spring-session-jdbc) diff --git a/spring-session/spring-session-mongodb/pom.xml b/spring-session/spring-session-mongodb/pom.xml index dc055ff32d..b9e06615de 100644 --- a/spring-session/spring-session-mongodb/pom.xml +++ b/spring-session/spring-session-mongodb/pom.xml @@ -40,6 +40,12 @@ spring-boot-starter-test test + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + test +
diff --git a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 16b7404f57..1acc6a5cb1 100644 --- a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringSessionMongoDBApplication.class) +@SpringBootTest(classes = SpringSessionMongoDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class SpringContextIntegrationTest { @Test diff --git a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java similarity index 71% rename from spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java index b41f2b0338..cc935b8cfb 100644 --- a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java @@ -7,8 +7,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringSessionMongoDBApplication.class) -public class SpringContextLiveTest { +@SpringBootTest(classes = SpringSessionMongoDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class SpringContextTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-session/spring-session-mongodb/src/test/resources/application.properties b/spring-session/spring-session-mongodb/src/test/resources/application.properties new file mode 100644 index 0000000000..4ee830556a --- /dev/null +++ b/spring-session/spring-session-mongodb/src/test/resources/application.properties @@ -0,0 +1,2 @@ +#To use a randomly allocated free port during tests to avoid port conflict across tests +spring.data.mongodb.port=0 diff --git a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index a62e728826..0000000000 --- a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.spring.session.SessionWebApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SessionWebApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java index b23ce7dbbb..3a4f14e9e6 100644 --- a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -7,6 +7,10 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.spring.session.SessionWebApplication; +/** + * This live test requires: + * redis instance running on the environment + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SessionWebApplication.class) public class SpringContextLiveTest { diff --git a/spring-sleuth/README.md b/spring-sleuth/README.md index 47aa126939..ebaebde6c9 100644 --- a/spring-sleuth/README.md +++ b/spring-sleuth/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Spring Sleuth -- [Spring Cloud Sleuth in a Monolith Application](http://www.baeldung.com/spring-cloud-sleuth-single-application) +This module contains articles about Spring Cloud Sleuth + +### Relevant articles: + +- [Spring Cloud Sleuth in a Monolith Application](https://www.baeldung.com/spring-cloud-sleuth-single-application) diff --git a/spring-soap/README.md b/spring-soap/README.md index 8d96350e1e..c23f0bc6f0 100644 --- a/spring-soap/README.md +++ b/spring-soap/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Spring SOAP + +This module contains articles about SOAP APIs with Spring + +### Relevant articles: - [Creating a SOAP Web Service with Spring](https://www.baeldung.com/spring-boot-soap-web-service) diff --git a/spring-social-login/README.md b/spring-social-login/README.md index f745a90acb..2d97584e62 100644 --- a/spring-social-login/README.md +++ b/spring-social-login/README.md @@ -1,2 +1,6 @@ +## Spring Social + +This module contains articles about Spring Social + ### Relevant Articles: -- [A Secondary Facebook Login with Spring Social](http://www.baeldung.com/facebook-authentication-with-spring-security-and-social) +- [A Secondary Facebook Login with Spring Social](https://www.baeldung.com/facebook-authentication-with-spring-security-and-social) diff --git a/spring-spel/README.md b/spring-spel/README.md index d7e69e114c..2a1d900e38 100644 --- a/spring-spel/README.md +++ b/spring-spel/README.md @@ -1,2 +1,6 @@ +## Spring Expression Language + +This module contains articles about the Spring Expression Language (SpEL) + ### Relevant Articles: -- [Spring Expression Language Guide](http://www.baeldung.com/spring-expression-language) +- [Spring Expression Language Guide](https://www.baeldung.com/spring-expression-language) diff --git a/spring-state-machine/README.md b/spring-state-machine/README.md index a2668fb650..dadb628572 100644 --- a/spring-state-machine/README.md +++ b/spring-state-machine/README.md @@ -1,3 +1,7 @@ +## Spring State Machine + +This module contains articles about Spring State Machine + ### Relevant articles -- [A Guide to the Spring State Machine Project](http://www.baeldung.com/spring-state-machine) +- [A Guide to the Spring State Machine Project](https://www.baeldung.com/spring-state-machine) diff --git a/spring-static-resources/README.md b/spring-static-resources/README.md index 64f017b5dd..206421ed0e 100644 --- a/spring-static-resources/README.md +++ b/spring-static-resources/README.md @@ -1,5 +1,9 @@ +## Spring Static Resources + +This module contains articles about static resources with Spring + ### Relevant Articles: -- [Cachable Static Assets with Spring MVC](http://www.baeldung.com/cachable-static-assets-with-spring-mvc) -- [Minification of JS and CSS Assets with Maven](http://www.baeldung.com/maven-minification-of-js-and-css-assets) -- [Serve Static Resources with Spring](http://www.baeldung.com/spring-mvc-static-resources) +- [Cachable Static Assets with Spring MVC](https://www.baeldung.com/cachable-static-assets-with-spring-mvc) +- [Minification of JS and CSS Assets with Maven](https://www.baeldung.com/maven-minification-of-js-and-css-assets) +- [Serve Static Resources with Spring](https://www.baeldung.com/spring-mvc-static-resources) - [Load a Resource as a String in Spring](https://www.baeldung.com/spring-load-resource-as-string) diff --git a/spring-swagger-codegen/README.md b/spring-swagger-codegen/README.md index ee6b240c30..e375ae7594 100644 --- a/spring-swagger-codegen/README.md +++ b/spring-swagger-codegen/README.md @@ -1,3 +1,7 @@ +## Spring Swagger CodeGen + +This module contains articles about Spring with Swagger CodeGen + ### Relevant articles -- [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen) +- [Generate Spring Boot REST Client with Swagger](https://www.baeldung.com/spring-boot-rest-client-swagger-codegen) diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md b/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md index 455a69b2f3..cffab6b9c7 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md @@ -1,4 +1,6 @@ -# spring-swagger-codegen-api-client +## Spring Swagger Codegen API Client + +This module contains the code for [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen). ## Requirements diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/README.md b/spring-swagger-codegen/spring-swagger-codegen-app/README.md new file mode 100644 index 0000000000..1cb9e35d99 --- /dev/null +++ b/spring-swagger-codegen/spring-swagger-codegen-app/README.md @@ -0,0 +1,3 @@ +## Spring Swagger Codegen App + +This module contains the code for [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen). diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 082a65f55b..329ef8580c 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -1,31 +1,32 @@ -========= +## Spring Thymeleaf -## Spring Thymeleaf Example Project +This module contains articles about Spring with Thymeleaf ### Relevant Articles: -- [Introduction to Using Thymeleaf in Spring](http://www.baeldung.com/thymeleaf-in-spring-mvc) -- [CSRF Protection with Spring MVC and Thymeleaf](http://www.baeldung.com/csrf-thymeleaf-with-spring-security) -- [Thymeleaf: Custom Layout Dialect](http://www.baeldung.com/thymeleaf-spring-layouts) -- [Spring and Thymeleaf 3: Expressions](http://www.baeldung.com/spring-thymeleaf-3-expressions) -- [Spring MVC + Thymeleaf 3.0: New Features](http://www.baeldung.com/spring-thymeleaf-3) -- [How to Work with Dates in Thymeleaf](http://www.baeldung.com/dates-in-thymeleaf) -- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) -- [Working with Boolean in Thymeleaf](http://www.baeldung.com/thymeleaf-boolean) -- [Working with Fragments in Thymeleaf](http://www.baeldung.com/spring-thymeleaf-fragments) -- [Conditionals in Thymeleaf](http://www.baeldung.com/spring-thymeleaf-conditionals) -- [Iteration in Thymeleaf](http://www.baeldung.com/thymeleaf-iteration) -- [Working With Arrays in Thymeleaf](http://www.baeldung.com/thymeleaf-arrays) -- [Spring with Thymeleaf Pagination for a List](http://www.baeldung.com/spring-thymeleaf-pagination) -- [Working with Select and Option in Thymeleaf](http://www.baeldung.com/thymeleaf-select-option) +- [Introduction to Using Thymeleaf in Spring](https://www.baeldung.com/thymeleaf-in-spring-mvc) +- [CSRF Protection with Spring MVC and Thymeleaf](https://www.baeldung.com/csrf-thymeleaf-with-spring-security) +- [Thymeleaf: Custom Layout Dialect](https://www.baeldung.com/thymeleaf-spring-layouts) +- [Spring and Thymeleaf 3: Expressions](https://www.baeldung.com/spring-thymeleaf-3-expressions) +- [Spring MVC + Thymeleaf 3.0: New Features](https://www.baeldung.com/spring-thymeleaf-3) +- [How to Work with Dates in Thymeleaf](https://www.baeldung.com/dates-in-thymeleaf) +- [How to Create an Executable JAR with Maven](https://www.baeldung.com/executable-jar-with-maven) +- [Working with Boolean in Thymeleaf](https://www.baeldung.com/thymeleaf-boolean) +- [Working with Fragments in Thymeleaf](https://www.baeldung.com/spring-thymeleaf-fragments) +- [Conditionals in Thymeleaf](https://www.baeldung.com/spring-thymeleaf-conditionals) +- [Iteration in Thymeleaf](https://www.baeldung.com/thymeleaf-iteration) +- [Working With Arrays in Thymeleaf](https://www.baeldung.com/thymeleaf-arrays) +- [Spring with Thymeleaf Pagination for a List](https://www.baeldung.com/spring-thymeleaf-pagination) +- [Working with Select and Option in Thymeleaf](https://www.baeldung.com/thymeleaf-select-option) - [Working With Custom HTML Attributes in Thymeleaf](https://www.baeldung.com/thymeleaf-custom-html-attributes) - [Spring Request Parameters with Thymeleaf](https://www.baeldung.com/spring-thymeleaf-request-parameters) +- [[next -->]](/spring-thymeleaf-2) ### Build the Project mvn clean install - ### Run the Project + mvn cargo:run - **note**: starts on port '8082' diff --git a/spring-vault/README.md b/spring-vault/README.md index 8db065a3dd..9e1d14ba6b 100644 --- a/spring-vault/README.md +++ b/spring-vault/README.md @@ -1,2 +1,7 @@ +## Spring Vault + +This module contains articles about Spring Vault + ### Relevant Articles: + - [Spring Vault](https://www.baeldung.com/spring-vault) diff --git a/spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index a2d727ea79..0000000000 --- a/spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.springvault.SpringVaultApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringVaultApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java index 1b3db59ecb..60dc119f13 100644 --- a/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -6,6 +6,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * vault server up and running on the environment + * + *
+ * For more info on setting up the vault server: + * https://www.baeldung.com/vault + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringVaultApplication.class) public class SpringContextLiveTest { diff --git a/spring-vault/src/test/resources/application.properties b/spring-vault/src/test/resources/application.properties new file mode 100644 index 0000000000..709574239b --- /dev/null +++ b/spring-vault/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-vertx/README.md b/spring-vertx/README.md index 05d059e1b2..e310079ff4 100644 --- a/spring-vertx/README.md +++ b/spring-vertx/README.md @@ -1,2 +1,6 @@ +## Spring Vert.x + +This module contains articles about Spring with Vert.x + ### Relevant Articles: -- [Vert.x Spring Integration](http://www.baeldung.com/spring-vertx) +- [Vert.x Spring Integration](https://www.baeldung.com/spring-vertx) diff --git a/spring-webflux-amqp/README.md b/spring-webflux-amqp/README.md index 5cd3391c3e..20ddbe469a 100644 --- a/spring-webflux-amqp/README.md +++ b/spring-webflux-amqp/README.md @@ -1,4 +1,7 @@ -### Relevant Articles: -================================ +## Spring WebFlux AMQP -- [Spring AMQP in Reactive Applications](http://www.baeldung.com/spring-amqp-reactive) +This module contains articles about Spring WebFlux with AMQP + +### Relevant Articles: + +- [Spring AMQP in Reactive Applications](https://www.baeldung.com/spring-amqp-reactive) diff --git a/spring-webflux-amqp/src/main/resources/application.yml b/spring-webflux-amqp/src/main/resources/application.yml index 3f527ce4c5..702aaba357 100755 --- a/spring-webflux-amqp/src/main/resources/application.yml +++ b/spring-webflux-amqp/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: rabbitmq: - host: 192.168.99.100 + host: localhost port: 5672 username: guest password: guest diff --git a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 35efff49c2..0000000000 --- a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.amqp.SpringWebfluxAmqpApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringWebfluxAmqpApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java index effe8d2cfa..4d9f658cdc 100644 --- a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -6,6 +6,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * rabbitmq instance running on the environment + * + *
+ * To run rabbitmq using docker image: + * (e.g. `docker run -d --name rabbitmq -p 5672:5672 rabbitmq:3`) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringWebfluxAmqpApplication.class) public class SpringContextLiveTest { diff --git a/spring-zuul/README.md b/spring-zuul/README.md index 41a77f70c8..e1067ebb9f 100644 --- a/spring-zuul/README.md +++ b/spring-zuul/README.md @@ -1,7 +1,6 @@ -========= - -## Spring REST with a Zuul +## Spring Zuul +This module contains articles about Spring with Netflix Zuul ### Relevant Articles: -- [Spring REST with a Zuul Proxy](http://www.baeldung.com/spring-rest-with-zuul-proxy) +- [Spring REST with a Zuul Proxy](https://www.baeldung.com/spring-rest-with-zuul-proxy) diff --git a/static-analysis/README.md b/static-analysis/README.md index e4d4bc7bfc..235b79853b 100644 --- a/static-analysis/README.md +++ b/static-analysis/README.md @@ -1,4 +1,8 @@ +## Static Analysis + +This module contains articles about static program analysis + ## Relevant articles: -- [Introduction to PMD](http://www.baeldung.com/pmd) -- [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](http://www.baeldung.com/java-static-analysis-tools) +- [Introduction to PMD](https://www.baeldung.com/pmd) +- [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](https://www.baeldung.com/java-static-analysis-tools) diff --git a/stripe/README.md b/stripe/README.md index 8a44ff9d33..9e41dcf945 100644 --- a/stripe/README.md +++ b/stripe/README.md @@ -1,8 +1,8 @@ -### Stripe API for Java Sample Project +### Stripe -This is Spring Boot project that displays a checkout form and charges a credit card using the Stripe API for Java. +This module contains articles about Stripe ### Relevant articles -- [Introduction to the Stripe API for Java](http://www.baeldung.com/java-stripe-api) +- [Introduction to the Stripe API for Java](https://www.baeldung.com/java-stripe-api) diff --git a/structurizr/README.md b/structurizr/README.md index e596dfa458..15331228bd 100644 --- a/structurizr/README.md +++ b/structurizr/README.md @@ -1,2 +1,6 @@ +## Structurizr + +This module contains articles about Structurizr + ### Relevant Articles: -- [Intro to Structurizr](http://www.baeldung.com/structurizr) +- [Intro to Structurizr](https://www.baeldung.com/structurizr) diff --git a/struts-2/README.md b/struts-2/README.md index 8a1425ccb5..d15b94f662 100644 --- a/struts-2/README.md +++ b/struts-2/README.md @@ -1,3 +1,7 @@ +## Struts 2 + +This module contains articles about Struts 2 + ### Relevant articles -- [A Quick Struts 2 Intro](http://www.baeldung.com/struts-2-intro) +- [A Quick Struts 2 Intro](https://www.baeldung.com/struts-2-intro) diff --git a/tensorflow-java/README.md b/tensorflow-java/README.md index f826375ac1..b96e4a83db 100644 --- a/tensorflow-java/README.md +++ b/tensorflow-java/README.md @@ -1,3 +1,7 @@ +## Tensorflow + +This module contains articles about Tensorflow + ## Relevant articles: - [Introduction to Tensorflow for Java](https://www.baeldung.com/tensorflow-java) diff --git a/testing-modules/README.md b/testing-modules/README.md index d534e5cea6..c6098d1210 100644 --- a/testing-modules/README.md +++ b/testing-modules/README.md @@ -1,5 +1,3 @@ - ## Testing Modules -This is a aggregator module containing several modules focused on testing libraries. - +This is an aggregator module containing multiple modules focused on testing libraries. diff --git a/testing-modules/assertion-libraries/README.md b/testing-modules/assertion-libraries/README.md new file mode 100644 index 0000000000..d69457fdeb --- /dev/null +++ b/testing-modules/assertion-libraries/README.md @@ -0,0 +1,13 @@ + +## Relevant Articles + +- [AssertJ’s Java 8 Features](http://www.baeldung.com/assertJ-java-8-features) +- [AssertJ for Guava](http://www.baeldung.com/assertJ-for-guava) +- [Introduction to AssertJ](http://www.baeldung.com/introduction-to-assertj) +- [Testing with Google Truth](http://www.baeldung.com/google-truth) +- [Testing with JGoTesting](http://www.baeldung.com/jgotesting) +- [Guide to JSpec](http://www.baeldung.com/jspec) +- [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion) +- [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions) +- [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) + diff --git a/testing-modules/assertion-libraries/pom.xml b/testing-modules/assertion-libraries/pom.xml new file mode 100644 index 0000000000..9d60d42533 --- /dev/null +++ b/testing-modules/assertion-libraries/pom.xml @@ -0,0 +1,75 @@ + + 4.0.0 + com.baeldung + assertion-libraries + 0.1-SNAPSHOT + assertion-libraries + + + com.baeldung + testing-modules + 1.0.0-SNAPSHOT + + + + + com.google.truth + truth + ${truth.version} + + + com.google.truth.extensions + truth-java8-extension + ${truth.version} + test + + + org.assertj + assertj-guava + ${assertj-guava.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + org.javalite + javalite-common + ${javalite.version} + + + org.jgotesting + jgotesting + ${jgotesting.version} + test + + + + + + + org.assertj + assertj-assertions-generator-maven-plugin + ${assertj-generator.version} + + + com.baeldung.testing.assertj.custom.Person + + + + + + + + 0.32 + 3.1.0 + 3.9.0 + 2.1.0 + 1.4.13 + 0.12 + + + diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java similarity index 88% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java index 7a1c158500..6c049e1a10 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; public class Dog { private String name; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java similarity index 88% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java index a0b3d0daac..baf3c2df52 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; public class Member { private String name; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java similarity index 88% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java index 43e9ff8884..09b16b4f5b 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; public class Person { private String name; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java similarity index 93% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java index 34afc480e4..5506a56b51 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; import java.util.ArrayList; import java.util.List; diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java similarity index 97% rename from testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java index fe857dd265..2b5ffde19f 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.truth; +package com.baeldung.truth; import java.util.Arrays; import java.util.List; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java similarity index 97% rename from testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java rename to testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java index 2fd84085a0..b478043ad8 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.truth; +package com.baeldung.truth; import com.google.common.truth.ComparableSubject; import com.google.common.truth.FailureStrategy; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java index 6fa09d8dfc..ec2d93500f 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import static org.assertj.core.api.Assertions.allOf; import static org.assertj.core.api.Assertions.anyOf; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java index 6836bb79c5..73b9b373a1 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import org.assertj.core.util.Maps; import org.junit.Ignore; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java index 2056d7e61a..6a552aee78 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import com.google.common.base.Optional; import com.google.common.collect.ArrayListMultimap; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java index 7ec6d0caa7..a2f58d677d 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import org.junit.Test; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java similarity index 91% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java index 4c09311bac..98f50568a8 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java @@ -1,6 +1,6 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; -import static com.baeldung.testing.assertj.custom.Assertions.assertThat; +import static com.baeldung.assertj.custom.Assertions.assertThat; import static org.junit.Assert.fail; import org.junit.Rule; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java similarity index 81% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java index fcffb8fc6c..3e1021851e 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; public class Assertions { public static PersonAssert assertThat(Person actual) { diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java similarity index 95% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java index d6cc585e96..5be093644a 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; import org.assertj.core.api.AbstractAssert; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java similarity index 94% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java index 07a5be1118..ab93f8eac7 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.exceptions; +package com.baeldung.assertj.exceptions; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java similarity index 97% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java index 973b921654..4d4e2aedfc 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.exceptions; +package com.baeldung.assertj.exceptions; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThat; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java similarity index 99% rename from testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java rename to testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java index 5be27db9db..b7919a29ca 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.truth; +package com.baeldung.truth; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -6,7 +6,7 @@ import com.google.common.collect.Range; import com.google.common.collect.Table; import com.google.common.collect.TreeBasedTable; import com.google.common.collect.TreeMultiset; -import static com.baeldung.testing.truth.UserSubject.*; +import static com.baeldung.truth.UserSubject.*; import static com.google.common.truth.Truth.*; import static com.google.common.truth.Truth8.*; import java.math.BigDecimal; diff --git a/testing-modules/easy-random/pom.xml b/testing-modules/easy-random/pom.xml index 93c0027f8f..d80927c3e8 100644 --- a/testing-modules/easy-random/pom.xml +++ b/testing-modules/easy-random/pom.xml @@ -17,8 +17,12 @@ org.jeasy easy-random-core - 4.0.0 + ${easy-random-core.version}
+ + 4.0.0 + + \ No newline at end of file diff --git a/testing-modules/easymock/README.md b/testing-modules/easymock/README.md new file mode 100644 index 0000000000..c24ffa9099 --- /dev/null +++ b/testing-modules/easymock/README.md @@ -0,0 +1,3 @@ +## Relevant Articles + +- [Mocking a Void Method with EasyMock](https://www.baeldung.com/easymock-mocking-void-method) diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml index e708d939e4..37693ebfee 100644 --- a/testing-modules/gatling/pom.xml +++ b/testing-modules/gatling/pom.xml @@ -1,136 +1,136 @@ - - - 4.0.0 - org.baeldung - gatling - 1.0-SNAPSHOT - gatling - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../ - - - - - - io.gatling - gatling-app - ${gatling.version} - - - io.gatling - gatling-recorder - ${gatling.version} - - - io.gatling.highcharts - gatling-charts-highcharts - ${gatling.version} - - - org.scala-lang - scala-library - ${scala.version} - - - - - - - io.gatling.highcharts - gatling-charts-highcharts - - - io.gatling - gatling-app - - - io.gatling - gatling-recorder - - - org.scala-lang - scala-library - - - - - src/test/scala - - - - net.alchim31.maven - scala-maven-plugin - ${scala-maven-plugin.version} - - - - - - net.alchim31.maven - scala-maven-plugin - - - - testCompile - - - - - -Ydelambdafy:method - -target:jvm-1.8 - -deprecation - -feature - -unchecked - -language:implicitConversions - -language:postfixOps - - - - - - - - - - - simulation - - - - io.gatling - gatling-maven-plugin - ${gatling-maven-plugin.version} - - - test - - execute - - - true - - - - - - - - - - - 1.8 - 1.8 - UTF-8 - 2.12.6 - 2.3.1 - 3.2.2 - 2.2.4 - - - + + + 4.0.0 + org.baeldung + gatling + 1.0-SNAPSHOT + gatling + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + io.gatling + gatling-app + ${gatling.version} + + + io.gatling + gatling-recorder + ${gatling.version} + + + io.gatling.highcharts + gatling-charts-highcharts + ${gatling.version} + + + org.scala-lang + scala-library + ${scala.version} + + + + + + + io.gatling.highcharts + gatling-charts-highcharts + + + io.gatling + gatling-app + + + io.gatling + gatling-recorder + + + org.scala-lang + scala-library + + + + + src/test/scala + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin.version} + + + + + + net.alchim31.maven + scala-maven-plugin + + + + testCompile + + + + + -Ydelambdafy:method + -target:jvm-1.8 + -deprecation + -feature + -unchecked + -language:implicitConversions + -language:postfixOps + + + + + + + + + + + simulation + + + + io.gatling + gatling-maven-plugin + ${gatling-maven-plugin.version} + + + test + + execute + + + true + + + + + + + + + + + 1.8 + 1.8 + UTF-8 + 2.12.6 + 2.3.1 + 3.2.2 + 2.2.4 + + + diff --git a/testing-modules/gatling/src/test/scala/Engine.scala b/testing-modules/gatling/src/test/scala/Engine.scala index 32c85fbe45..c2884fc218 100644 --- a/testing-modules/gatling/src/test/scala/Engine.scala +++ b/testing-modules/gatling/src/test/scala/Engine.scala @@ -1,13 +1,13 @@ -import io.gatling.app.Gatling -import io.gatling.core.config.GatlingPropertiesBuilder - -object Engine extends App { - - val props = new GatlingPropertiesBuilder - props.dataDirectory(IDEPathHelper.dataDirectory.toString) - props.resultsDirectory(IDEPathHelper.resultsDirectory.toString) - props.bodiesDirectory(IDEPathHelper.bodiesDirectory.toString) - props.binariesDirectory(IDEPathHelper.mavenBinariesDirectory.toString) - - Gatling.fromMap(props.build) -} +import io.gatling.app.Gatling +import io.gatling.core.config.GatlingPropertiesBuilder + +object Engine extends App { + + val props = new GatlingPropertiesBuilder + props.dataDirectory(IDEPathHelper.dataDirectory.toString) + props.resultsDirectory(IDEPathHelper.resultsDirectory.toString) + props.bodiesDirectory(IDEPathHelper.bodiesDirectory.toString) + props.binariesDirectory(IDEPathHelper.mavenBinariesDirectory.toString) + + Gatling.fromMap(props.build) +} diff --git a/testing-modules/gatling/src/test/scala/IDEPathHelper.scala b/testing-modules/gatling/src/test/scala/IDEPathHelper.scala index 0abf6a42ef..9fb1d7d5c8 100644 --- a/testing-modules/gatling/src/test/scala/IDEPathHelper.scala +++ b/testing-modules/gatling/src/test/scala/IDEPathHelper.scala @@ -1,22 +1,22 @@ -import java.nio.file.Path - -import io.gatling.commons.util.PathHelper._ - -object IDEPathHelper { - - val gatlingConfUrl: Path = getClass.getClassLoader.getResource("gatling.conf").toURI - val projectRootDir = gatlingConfUrl.ancestor(3) - - val mavenSourcesDirectory = projectRootDir / "src" / "test" / "scala" - val mavenResourcesDirectory = projectRootDir / "src" / "test" / "resources" - val mavenTargetDirectory = projectRootDir / "target" - val mavenBinariesDirectory = mavenTargetDirectory / "test-classes" - - val dataDirectory = mavenResourcesDirectory / "data" - val bodiesDirectory = mavenResourcesDirectory / "bodies" - - val recorderOutputDirectory = mavenSourcesDirectory - val resultsDirectory = mavenTargetDirectory / "gatling" - - val recorderConfigFile = mavenResourcesDirectory / "recorder.conf" -} +import java.nio.file.Path + +import io.gatling.commons.util.PathHelper._ + +object IDEPathHelper { + + val gatlingConfUrl: Path = getClass.getClassLoader.getResource("gatling.conf").toURI + val projectRootDir = gatlingConfUrl.ancestor(3) + + val mavenSourcesDirectory = projectRootDir / "src" / "test" / "scala" + val mavenResourcesDirectory = projectRootDir / "src" / "test" / "resources" + val mavenTargetDirectory = projectRootDir / "target" + val mavenBinariesDirectory = mavenTargetDirectory / "test-classes" + + val dataDirectory = mavenResourcesDirectory / "data" + val bodiesDirectory = mavenResourcesDirectory / "bodies" + + val recorderOutputDirectory = mavenSourcesDirectory + val resultsDirectory = mavenTargetDirectory / "gatling" + + val recorderConfigFile = mavenResourcesDirectory / "recorder.conf" +} diff --git a/testing-modules/gatling/src/test/scala/Recorder.scala b/testing-modules/gatling/src/test/scala/Recorder.scala index 6ad320618b..9c38e52f12 100644 --- a/testing-modules/gatling/src/test/scala/Recorder.scala +++ b/testing-modules/gatling/src/test/scala/Recorder.scala @@ -1,12 +1,12 @@ -import io.gatling.recorder.GatlingRecorder -import io.gatling.recorder.config.RecorderPropertiesBuilder - -object Recorder extends App { - - val props = new RecorderPropertiesBuilder - props.simulationOutputFolder(IDEPathHelper.recorderOutputDirectory.toString) - props.simulationPackage("org.baeldung") - props.bodiesFolder(IDEPathHelper.bodiesDirectory.toString) - - GatlingRecorder.fromMap(props.build, Some(IDEPathHelper.recorderConfigFile)) -} +import io.gatling.recorder.GatlingRecorder +import io.gatling.recorder.config.RecorderPropertiesBuilder + +object Recorder extends App { + + val props = new RecorderPropertiesBuilder + props.simulationOutputFolder(IDEPathHelper.recorderOutputDirectory.toString) + props.simulationPackage("org.baeldung") + props.bodiesFolder(IDEPathHelper.bodiesDirectory.toString) + + GatlingRecorder.fromMap(props.build, Some(IDEPathHelper.recorderConfigFile)) +} diff --git a/testing-modules/groovy-spock/report-2019-03-29.json b/testing-modules/groovy-spock/report-2019-03-29.json deleted file mode 100644 index 85f0b261fb..0000000000 --- a/testing-modules/groovy-spock/report-2019-03-29.json +++ /dev/null @@ -1,402 +0,0 @@ -loadLogFile([{ - "package": "mocks", - "name": "ExampleSpockTest", - "start": 1553898111660, - "features": [ - { - "name": "should calculate character occurrences in given string", - "start": 1553898111662, - "end": 1553898111699, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898111709, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "mocks", - "name": "ItemServiceTest", - "start": 1553898111714, - "features": [ - { - "name": "should spy on EventPublisher method call", - "start": 1553898111714, - "output": [ - "I've published: item-id\n" - ], - "end": 1553898112250, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return items", - "start": 1553898112250, - "end": 1553898112260, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should publish events about new non-empty saved offers", - "start": 1553898112260, - "end": 1553898112267, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return different items for different ids lists", - "start": 1553898112267, - "end": 1553898112280, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should throw ExternalItemProviderException when ItemProvider fails", - "start": 1553898112281, - "end": 1553898112294, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return different items on subsequent call", - "start": 1553898112294, - "narrative": "When method is called for the first time\nThen empty list is returned\nWhen method is called for the second time\nThen item with id=1 is returned\nWhen method is called for the thirdtime\nThen item with id=2 is returned", - "end": 1553898112298, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return items sorted by name", - "start": 1553898112299, - "end": 1553898112307, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112310, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "FirstSpecification", - "name": "FirstSpecification", - "start": 1553898112314, - "features": [ - { - "name": "Should verify notify was called", - "start": 1553898112314, - "end": 1553898112324, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should return true value for mock", - "start": 1553898112325, - "end": 1553898112344, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should return default value for mock", - "start": 1553898112344, - "end": 1553898112347, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "numbers to the power of two", - "start": 1553898112347, - "end": 1553898112358, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should get an index out of bounds when removing a non-existent item", - "start": 1553898112358, - "end": 1553898112364, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should be able to remove from list", - "start": 1553898112364, - "end": 1553898112366, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "two plus two should equal four", - "start": 1553898112366, - "end": 1553898112368, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "one plus one should equal two", - "start": 1553898112368, - "end": 1553898112391, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112394, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IgnoreTest", - "start": 1553898112395, - "end": 1553898112395, - "result": "skipped" -}]) - -loadLogFile([{ - "package": "extensions", - "name": "RetryTest", - "start": 1553898112403, - "end": 1553898112405, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "This title is easy to read for humans", - "start": 1553898112407, - "end": 1553898112408, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "SeeTest", - "start": 1553898112409, - "end": 1553898112411, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "StepwiseTest", - "start": 1553898112422, - "end": 1553898112423, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "NarrativeDescriptionTest", - "start": 1553898112427, - "narrative": "as a user\n i want to save favourite items \n and then get the list of them", - "end": 1553898112433, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "SubjectTest", - "start": 1553898112434, - "end": 1553898112436, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IgnoreRestTest", - "start": 1553898112437, - "end": 1553898112437, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "StackTraceTest", - "start": 1553898112438, - "features": [ - { - "name": "stacktrace", - "start": 1553898112438, - "exceptions": [ - "java.lang.RuntimeException: blabla\n\tat extensions.StackTraceTest.stacktrace(StackTraceTest.groovy:10)\n" - ], - "end": 1553898112455, - "result": "failed", - "attachments": [ - - ] - } - ], - "end": 1553898112470, - "result": "failed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IgnoreIfTest", - "start": 1553898112471, - "end": 1553898112472, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "RequiresTest", - "start": 1553898112473, - "features": [ - { - "name": "I will run only on Windows", - "start": 1553898112474, - "end": 1553898112474, - "result": "skipped" - } - ], - "end": 1553898112476, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IssueTest", - "start": 1553898112477, - "features": [ - { - "name": "I'm using Spock configuration file", - "start": 1553898112477, - "tags": [ - { - "name": "Bug LO-1000", - "key": "issue", - "value": "LO-1000", - "url": "http:\/\/jira.org\/issues\/LO-1000" - } - ], - "end": 1553898112489, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112490, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "TimeoutTest", - "start": 1553898112491, - "features": [ - { - "name": "I will fail after 200 millis", - "start": 1553898112491, - "end": 1553898112514, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112517, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "RestoreSystemPropertiesTest", - "start": 1553898112518, - "features": [ - { - "name": "all environment variables will be saved before execution and restored after tests", - "start": 1553898112518, - "end": 1553898112532, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112539, - "result": "passed", - "attachments": [ - - ] -}]) - diff --git a/testing-modules/hamcrest/README.md b/testing-modules/hamcrest/README.md new file mode 100644 index 0000000000..f2ff6b996d --- /dev/null +++ b/testing-modules/hamcrest/README.md @@ -0,0 +1,12 @@ +## Hamcrest + +This module contains articles about Hamcrest + +### Relevant articles +- [Hamcrest Text Matchers](https://www.baeldung.com/hamcrest-text-matchers) +- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) +- [Hamcrest Object Matchers](https://www.baeldung.com/hamcrest-object-matchers) +- [Hamcrest Bean Matchers](https://www.baeldung.com/hamcrest-bean-matchers) +- [Hamcrest Number Matchers](https://www.baeldung.com/hamcrest-number-matchers) +- [Hamcrest Common Core Matchers](https://www.baeldung.com/hamcrest-core-matchers) +- [Hamcrest Custom Matchers](https://www.baeldung.com/hamcrest-custom-matchers) diff --git a/testing-modules/hamcrest/pom.xml b/testing-modules/hamcrest/pom.xml new file mode 100644 index 0000000000..2136702b3a --- /dev/null +++ b/testing-modules/hamcrest/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + com.baeldung + hamcrest + 0.0.1-SNAPSHOT + hamcrest + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.hamcrest + java-hamcrest + ${hamcrest.version} + test + + + + + 2.0.0.0 + + diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/City.java similarity index 94% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java rename to testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/City.java index d6369189c1..cc4fba8154 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java +++ b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/City.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest.objectmatchers; public class City extends Location { String name; diff --git a/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java new file mode 100644 index 0000000000..bb9c369c60 --- /dev/null +++ b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java @@ -0,0 +1,4 @@ +package com.baeldung.hamcrest.objectmatchers; + +public class Location { +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestBeansUnitTest.java similarity index 86% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestBeansUnitTest.java index e7eb9bda1b..7f0c5290ba 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestBeansUnitTest.java @@ -1,5 +1,6 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; +import com.baeldung.hamcrest.objectmatchers.City; import org.junit.Test; import java.beans.PropertyDescriptor; @@ -8,13 +9,7 @@ import java.util.List; import static java.util.stream.Collectors.toList; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasProperty; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.hamcrest.Matchers.samePropertyValuesAs; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.*; import static org.hamcrest.beans.PropertyUtil.getPropertyDescriptor; import static org.hamcrest.beans.PropertyUtil.propertyDescriptorsFor; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java similarity index 99% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java index d66ed98e8d..5da6a77144 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import com.google.common.collect.Lists; @@ -145,7 +145,6 @@ public class HamcrestCoreMatchersUnitTest { @Test public void givenString_WhenContainsStringIgnoringCase_ThenCorrect() { - // GIVEN String testString = "hamcrest core"; @@ -164,7 +163,6 @@ public class HamcrestCoreMatchersUnitTest { assertThat(list, hasItem(isA(String.class))); } - @Test public void givenTestInput_WhenUsingHasItemsInCollection() { @@ -223,7 +221,6 @@ public class HamcrestCoreMatchersUnitTest { assertThat(testString, either(startsWith("Bael")).or(containsString("Core"))); } - @Test public void givenTestInput_WhenUsingEveryItemForMatchInCollection() { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestFileUnitTest.java similarity index 72% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestFileUnitTest.java index 9973e325d6..73e2da52b5 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestFileUnitTest.java @@ -1,22 +1,13 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; -import static org.hamcrest.core.StringContains.containsString; -import static org.hamcrest.io.FileMatchers.aFileNamed; -import static org.hamcrest.io.FileMatchers.aFileWithAbsolutePath; -import static org.hamcrest.io.FileMatchers.aFileWithCanonicalPath; -import static org.hamcrest.io.FileMatchers.aFileWithSize; -import static org.hamcrest.io.FileMatchers.aReadableFile; -import static org.hamcrest.io.FileMatchers.aWritableFile; -import static org.hamcrest.io.FileMatchers.anExistingDirectory; -import static org.hamcrest.io.FileMatchers.anExistingFile; -import static org.hamcrest.io.FileMatchers.anExistingFileOrDirectory; -import static org.hamcrest.number.OrderingComparison.greaterThan; -import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; -import static org.junit.Assert.assertThat; +import org.junit.Test; import java.io.File; -import org.junit.Test; +import static org.hamcrest.io.FileMatchers.*; +import static org.hamcrest.number.OrderingComparison.greaterThan; +import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; +import static org.junit.Assert.assertThat; public class HamcrestFileUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestNumberUnitTest.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestNumberUnitTest.java index fbba6b94d2..d2b3392537 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestNumberUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import org.junit.Test; @@ -6,15 +6,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.closeTo; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.lessThan; -import static org.hamcrest.Matchers.lessThanOrEqualTo; -import static org.hamcrest.Matchers.comparesEqualTo; -import static org.hamcrest.Matchers.notANumber; +import static org.hamcrest.Matchers.*; public class HamcrestNumberUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestObjectUnitTest.java similarity index 81% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestObjectUnitTest.java index 8d30ff297b..c07fc422f6 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestObjectUnitTest.java @@ -1,14 +1,11 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; +import com.baeldung.hamcrest.objectmatchers.City; +import com.baeldung.hamcrest.objectmatchers.Location; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasToString; -import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.hamcrest.Matchers.emptyOrNullString; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.typeCompatibleWith; -import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.*; public class HamcrestObjectUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestTextUnitTest.java similarity index 99% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestTextUnitTest.java index e336b1bba3..593fdf82b6 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestTextUnitTest.java @@ -1,4 +1,6 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; + +import org.junit.Test; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringContains.containsStringIgnoringCase; @@ -16,8 +18,6 @@ import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder; import static org.junit.Assert.assertThat; -import org.junit.Test; - public class HamcrestTextUnitTest { @Test diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/HamcrestCustomUnitTest.java similarity index 82% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/HamcrestCustomUnitTest.java index 6cc8692bc7..62c68d4561 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/HamcrestCustomUnitTest.java @@ -1,10 +1,10 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest.custommatchers; import org.junit.Test; -import static org.baeldung.hamcrest.custommatchers.IsDivisibleBy.divisibleBy; -import static org.baeldung.hamcrest.custommatchers.IsOnlyDigits.onlyDigits; -import static org.baeldung.hamcrest.custommatchers.IsUppercase.uppercase; +import static com.baeldung.hamcrest.custommatchers.IsDivisibleBy.divisibleBy; +import static com.baeldung.hamcrest.custommatchers.IsOnlyDigits.onlyDigits; +import static com.baeldung.hamcrest.custommatchers.IsUppercase.uppercase; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsDivisibleBy.java similarity index 93% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsDivisibleBy.java index ea12ce0006..f865523be4 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsDivisibleBy.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest.custommatchers; +package com.baeldung.hamcrest.custommatchers; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsOnlyDigits.java similarity index 92% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsOnlyDigits.java index 7515dfbf6d..f113c92983 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsOnlyDigits.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest.custommatchers; +package com.baeldung.hamcrest.custommatchers; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsUppercase.java similarity index 91% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsUppercase.java index 859e7006b7..4ffacd939c 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsUppercase.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest.custommatchers; +package com.baeldung.hamcrest.custommatchers; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/testing-modules/mockito/src/test/resources/test1.in b/testing-modules/hamcrest/src/test/resources/test1.in similarity index 100% rename from testing-modules/mockito/src/test/resources/test1.in rename to testing-modules/hamcrest/src/test/resources/test1.in diff --git a/testing-modules/junit-4/README.md b/testing-modules/junit-4/README.md index 4d4588912b..d19a0a1e47 100644 --- a/testing-modules/junit-4/README.md +++ b/testing-modules/junit-4/README.md @@ -1,3 +1,6 @@ ### Relevant Articles - [Guide to JUnit 4 Rules](https://www.baeldung.com/junit-4-rules) +- [Custom JUnit 4 Test Runners](http://www.baeldung.com/junit-4-custom-runners) +- [Introduction to JUnitParams](http://www.baeldung.com/junit-params) +- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) diff --git a/testing-modules/junit-4/pom.xml b/testing-modules/junit-4/pom.xml index 272a9380b5..be0f51ea23 100644 --- a/testing-modules/junit-4/pom.xml +++ b/testing-modules/junit-4/pom.xml @@ -15,4 +15,17 @@ ../../ + + + pl.pragmatists + JUnitParams + ${jUnitParams.version} + test + + + + + 1.1.0 + + diff --git a/testing-modules/testing/src/main/java/com/baeldung/junit/Calculator.java b/testing-modules/junit-4/src/main/java/com/baeldung/junit/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/junit/Calculator.java rename to testing-modules/junit-4/src/main/java/com/baeldung/junit/Calculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java b/testing-modules/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java rename to testing-modules/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/AdditionUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/AdditionUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/AdditionUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/AdditionUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/BlockingTestRunner.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/BlockingTestRunner.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/CalculatorUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/CalculatorUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/CalculatorUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/CalculatorUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/SubstractionUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SubstractionUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/SubstractionUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/SubstractionUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/SuiteUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SuiteUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/SuiteUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/SuiteUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/TestRunner.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/TestRunner.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/TestRunner.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junit/TestRunner.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java b/testing-modules/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/MyTestSuite.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/MyTestSuite.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java diff --git a/testing-modules/testing/src/test/resources/JunitParamsTestParameters.csv b/testing-modules/junit-4/src/test/resources/JunitParamsTestParameters.csv similarity index 100% rename from testing-modules/testing/src/test/resources/JunitParamsTestParameters.csv rename to testing-modules/junit-4/src/test/resources/JunitParamsTestParameters.csv diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java similarity index 93% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java index 002aae34a8..1b1c70d824 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.exception; +package com.baeldung.assertexception; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java similarity index 91% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java index afe4af8c4a..62736b0800 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.migration.junit4; +package com.baeldung.assertexception.migration.junit4; import org.junit.Rule; import org.junit.Test; diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java index d3b6a52726..2595f2b13c 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java @@ -1,18 +1,22 @@ package com.baeldung.example; -import com.baeldung.junit.tags.example.Employee; -import com.baeldung.junit.tags.example.EmployeeDAO; -import com.baeldung.junit.tags.example.SpringJdbcConfig; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import com.baeldung.junit.tags.example.Employee; +import com.baeldung.junit.tags.example.EmployeeDAO; +import com.baeldung.junit.tags.example.SpringJdbcConfig; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { SpringJdbcConfig.class }, loader = AnnotationConfigContextLoader.class) +@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD) public class EmployeeDAOIntegrationTest { @Autowired diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java index bcd76cb4c2..7f0720b96d 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java @@ -1,8 +1,5 @@ package com.baeldung.tags; -import com.baeldung.junit.tags.example.Employee; -import com.baeldung.junit.tags.example.EmployeeDAO; -import com.baeldung.junit.tags.example.SpringJdbcConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -13,12 +10,19 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import com.baeldung.junit.tags.example.Employee; +import com.baeldung.junit.tags.example.EmployeeDAO; +import com.baeldung.junit.tags.example.SpringJdbcConfig; + @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { SpringJdbcConfig.class }, loader = AnnotationConfigContextLoader.class) +@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD) public class EmployeeDAOIntegrationTest { @Autowired diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md index 14e018a5f9..ede60c45a9 100644 --- a/testing-modules/junit-5/README.md +++ b/testing-modules/junit-5/README.md @@ -1,14 +1,8 @@ ### Relevant Articles: -- [A Guide to @RepeatedTest in Junit 5](http://www.baeldung.com/junit-5-repeated-test) -- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) -- [A Guide to JUnit 5 Extensions](http://www.baeldung.com/junit-5-extensions) -- [Inject Parameters into JUnit Jupiter Unit Tests](http://www.baeldung.com/junit-5-parameters) -- [Mockito and JUnit 5 – Using ExtendWith](http://www.baeldung.com/mockito-junit-5-extension) -- [JUnit5 Programmatic Extension Registration with @RegisterExtension](http://www.baeldung.com/junit-5-registerextension-annotation) -- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order) +- [A Guide to JUnit 5 Extensions](https://www.baeldung.com/junit-5-extensions) +- [Inject Parameters into JUnit Jupiter Unit Tests](https://www.baeldung.com/junit-5-parameters) +- [Mockito and JUnit 5 – Using ExtendWith](https://www.baeldung.com/mockito-junit-5-extension) +- [The Order of Tests in JUnit](https://www.baeldung.com/junit-5-test-order) - [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) - [Testing an Abstract Class With JUnit](https://www.baeldung.com/junit-test-abstract-class) -- [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng) -- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) -- [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution) -- [Assertions in JUnit 4 and JUnit 5](http://www.baeldung.com/junit-assertions) +- [Guide to Dynamic Tests in JUnit 5](https://www.baeldung.com/junit5-dynamic-tests) diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index b3074635a7..96944b4dc6 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -26,11 +26,6 @@ junit-jupiter-engine ${junit.jupiter.version} - - org.junit.jupiter - junit-jupiter-params - ${junit.jupiter.version} - org.junit.jupiter junit-jupiter-api diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/DynamicTestsUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java rename to testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/DynamicTestsUnitTest.java index b684f3603f..8b3087497b 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/DynamicTestsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.dynamictests; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -17,10 +17,8 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.function.ThrowingConsumer; -import com.baeldung.helpers.Employee; -import com.baeldung.helpers.EmployeeDao; -public class DynamicTestsExample { +public class DynamicTestsUnitTest { @TestFactory Collection dynamicTestsWithCollection() { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java new file mode 100644 index 0000000000..4b58a71135 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java @@ -0,0 +1,38 @@ +package com.baeldung.dynamictests; + +public class Employee { + + private long id; + private String firstName; + + public Employee(long id) { + this.id = id; + this.firstName = ""; + } + + public Employee(long id, String firstName) { + this.id = id; + this.firstName = firstName; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @Override + public String toString() { + return "Employee [id=" + id + ", firstName=" + firstName + "]"; + } +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java new file mode 100644 index 0000000000..4e2d9a5140 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java @@ -0,0 +1,16 @@ +package com.baeldung.dynamictests; + +public class EmployeeDao { + + public Employee save(long id) { + return new Employee(id); + } + + public Employee save(long id, String firstName) { + return new Employee(id, firstName); + } + + public Employee update(Employee employee) { + return employee; + } +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java index d4195e3b12..e13b4e24be 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java @@ -1,126 +1,126 @@ -package com.baeldung.junit5.mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.stubbing.Answer; - -import com.baeldung.junit5.mockito.repository.MailClient; -import com.baeldung.junit5.mockito.repository.SettingRepository; -import com.baeldung.junit5.mockito.repository.UserRepository; -import com.baeldung.junit5.mockito.service.DefaultUserService; -import com.baeldung.junit5.mockito.service.Errors; -import com.baeldung.junit5.mockito.service.UserService; - -@ExtendWith(MockitoExtension.class) -@RunWith(JUnitPlatform.class) -public class UserServiceUnitTest { - - UserService userService; - SettingRepository settingRepository; - @Mock UserRepository userRepository; - @Mock MailClient mailClient; - - User user; - - @BeforeEach - void init(@Mock SettingRepository settingRepository) { - userService = new DefaultUserService(userRepository, settingRepository, mailClient); - lenient().when(settingRepository.getUserMinAge()).thenReturn(10); - when(settingRepository.getUserNameMinLength()).thenReturn(4); - lenient().when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(false); - this.settingRepository = settingRepository; - } - - @Test - void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) { - // Given - user = new User("Jerry", 12); - when(userRepository.insert(any(User.class))).then(new Answer() { - int sequence = 1; - - @Override - public User answer(InvocationOnMock invocation) throws Throwable { - User user = (User) invocation.getArgument(0); - user.setId(sequence++); - return user; - } - }); - - userService = new DefaultUserService(userRepository, settingRepository, mailClient); - - // When - User insertedUser = userService.register(user); - - // Then - verify(userRepository).insert(user); - Assertions.assertNotNull(user.getId()); - verify(mailClient).sendUserRegistrationMail(insertedUser); - } - - @Test - void givenShortName_whenSaveUser_thenGiveShortUsernameError() { - // Given - user = new User("tom", 12); - - // When - try { - userService.register(user); - fail("Should give an error"); - } catch(Exception ex) { - assertEquals(ex.getMessage(), Errors.USER_NAME_SHORT); - } - - // Then - verify(userRepository, never()).insert(user); - } - - @Test - void givenSmallAge_whenSaveUser_thenGiveYoungUserError() { - // Given - user = new User("jerry", 3); - - // When - try { - userService.register(user); - fail("Should give an error"); - } catch(Exception ex) { - assertEquals(ex.getMessage(), Errors.USER_AGE_YOUNG); - } - - // Then - verify(userRepository, never()).insert(user); - } - - @Test - void givenUserWithExistingName_whenSaveUser_thenGiveUsernameAlreadyExistsError() { - // Given - user = new User("jerry", 12); - Mockito.reset(userRepository); - when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(true); - - // When - try { - userService.register(user); - fail("Should give an error"); - } catch(Exception ex) { - assertEquals(ex.getMessage(), Errors.USER_NAME_DUPLICATE); - } - - // Then - verify(userRepository, never()).insert(user); - } - -} +package com.baeldung.junit5.mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; + +import com.baeldung.junit5.mockito.repository.MailClient; +import com.baeldung.junit5.mockito.repository.SettingRepository; +import com.baeldung.junit5.mockito.repository.UserRepository; +import com.baeldung.junit5.mockito.service.DefaultUserService; +import com.baeldung.junit5.mockito.service.Errors; +import com.baeldung.junit5.mockito.service.UserService; + +@ExtendWith(MockitoExtension.class) +@RunWith(JUnitPlatform.class) +public class UserServiceUnitTest { + + UserService userService; + SettingRepository settingRepository; + @Mock UserRepository userRepository; + @Mock MailClient mailClient; + + User user; + + @BeforeEach + void init(@Mock SettingRepository settingRepository) { + userService = new DefaultUserService(userRepository, settingRepository, mailClient); + lenient().when(settingRepository.getUserMinAge()).thenReturn(10); + when(settingRepository.getUserNameMinLength()).thenReturn(4); + lenient().when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(false); + this.settingRepository = settingRepository; + } + + @Test + void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) { + // Given + user = new User("Jerry", 12); + when(userRepository.insert(any(User.class))).then(new Answer() { + int sequence = 1; + + @Override + public User answer(InvocationOnMock invocation) throws Throwable { + User user = (User) invocation.getArgument(0); + user.setId(sequence++); + return user; + } + }); + + userService = new DefaultUserService(userRepository, settingRepository, mailClient); + + // When + User insertedUser = userService.register(user); + + // Then + verify(userRepository).insert(user); + Assertions.assertNotNull(user.getId()); + verify(mailClient).sendUserRegistrationMail(insertedUser); + } + + @Test + void givenShortName_whenSaveUser_thenGiveShortUsernameError() { + // Given + user = new User("tom", 12); + + // When + try { + userService.register(user); + fail("Should give an error"); + } catch(Exception ex) { + assertEquals(ex.getMessage(), Errors.USER_NAME_SHORT); + } + + // Then + verify(userRepository, never()).insert(user); + } + + @Test + void givenSmallAge_whenSaveUser_thenGiveYoungUserError() { + // Given + user = new User("jerry", 3); + + // When + try { + userService.register(user); + fail("Should give an error"); + } catch(Exception ex) { + assertEquals(ex.getMessage(), Errors.USER_AGE_YOUNG); + } + + // Then + verify(userRepository, never()).insert(user); + } + + @Test + void givenUserWithExistingName_whenSaveUser_thenGiveUsernameAlreadyExistsError() { + // Given + user = new User("jerry", 12); + Mockito.reset(userRepository); + when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(true); + + // When + try { + userService.register(user); + fail("Should give an error"); + } catch(Exception ex) { + assertEquals(ex.getMessage(), Errors.USER_NAME_DUPLICATE); + } + + // Then + verify(userRepository, never()).insert(user); + } + +} diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md new file mode 100644 index 0000000000..02d4cd652a --- /dev/null +++ b/testing-modules/junit5-annotations/README.md @@ -0,0 +1,9 @@ +## JUnit 5 Annotations + +This module contains articles about JUnit 5 Annotations + +### Relevant Articles: +- [A Guide to @RepeatedTest in JUnit 5](https://www.baeldung.com/junit-5-repeated-test) +- [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution) +- [JUnit5 Programmatic Extension Registration with @RegisterExtension](https://www.baeldung.com/junit-5-registerextension-annotation) +- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml new file mode 100644 index 0000000000..c8abfe909d --- /dev/null +++ b/testing-modules/junit5-annotations/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + junit5-annotations + 1.0-SNAPSHOT + junit5-annotations + Intro to JUnit 5 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + org.junit.platform + junit-platform-engine + ${junit.platform.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-params + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + + + org.apache.logging.log4j + log4j-core + ${log4j2.version} + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + + 5.4.2 + 1.4.2 + 2.8.2 + + + diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java new file mode 100644 index 0000000000..5de49e028b --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java @@ -0,0 +1,18 @@ +package com.baeldung.junit5.registerextension; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; + +public class LoggingExtension implements TestInstancePostProcessor { + + @Override + public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception { + Logger logger = LogManager.getLogger(testInstance.getClass()); + testInstance.getClass() + .getMethod("setLogger", Logger.class) + .invoke(testInstance, logger); + } + +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/RegisterExtensionSampleExtension.java similarity index 95% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java rename to testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/RegisterExtensionSampleExtension.java index 64f4d8fd3e..5339f98875 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/RegisterExtensionSampleExtension.java @@ -1,4 +1,4 @@ -package com.baeldung.extensions; +package com.baeldung.junit5.registerextension; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java similarity index 95% rename from testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java index 749d7064bc..f9121d8790 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.junit5; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -8,7 +8,7 @@ import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.RepetitionInfo; import org.junit.jupiter.api.TestInfo; -public class RepeatedTestExample { +public class RepeatedTestAnnotationUnitTest { @BeforeEach void beforeEachTest() { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java similarity index 98% rename from testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java index ec76bd1488..ddceb78cac 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.conditional; +package com.baeldung.junit5.conditional; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/BlankStringsArgumentsProvider.java similarity index 92% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/BlankStringsArgumentsProvider.java index 1d2c76d37b..6c626efa40 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/BlankStringsArgumentsProvider.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.provider.Arguments; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/EnumsUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/EnumsUnitTest.java index 0b2068dbf1..1e3bbcc772 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/EnumsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/LocalDateUnitTest.java similarity index 92% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/LocalDateUnitTest.java index 95487705f5..d411fcb7e2 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/LocalDateUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.converter.ConvertWith; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Numbers.java similarity index 72% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Numbers.java index 8a9b229aac..094da6de05 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Numbers.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; public class Numbers { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/NumbersUnitTest.java similarity index 89% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/NumbersUnitTest.java index b3a3371bb2..76ebf93f93 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/NumbersUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Person.java similarity index 92% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Person.java index 225f11ba29..c635b2e4da 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; class Person { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonAggregator.java similarity index 93% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonAggregator.java index df2ddc9e66..c899115df8 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonAggregator.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.params.aggregator.ArgumentsAccessor; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonUnitTest.java similarity index 96% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonUnitTest.java index b30ecc748e..62a2f32a63 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.aggregator.AggregateWith; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/SlashyDateConverter.java similarity index 95% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/SlashyDateConverter.java index 40773d29a9..d96fbce121 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/SlashyDateConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.params.converter.ArgumentConversionException; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringParams.java similarity index 78% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringParams.java index bc9f881bd4..022fb797a4 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringParams.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import java.util.stream.Stream; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Strings.java similarity index 74% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Strings.java index f8e29f6b7f..5ee29339d7 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Strings.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; class Strings { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringsUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringsUnitTest.java index 6aea7668f1..064f305295 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.*; @@ -44,7 +44,7 @@ class StringsUnitTest { } @ParameterizedTest - @MethodSource("com.baeldung.parameterized.StringParams#blankStrings") + @MethodSource("com.baeldung.junit5.parameterized.StringParams#blankStrings") void isBlank_ShouldReturnTrueForNullOrBlankStringsExternalSource(String input) { assertTrue(Strings.isBlank(input)); } diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableArgumentsProvider.java similarity index 96% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableArgumentsProvider.java index a96d01e854..af10860f6a 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableArgumentsProvider.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.provider.Arguments; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableSource.java similarity index 90% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableSource.java index 9c1d07c1be..11187a4865 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableSource.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.provider.ArgumentsSource; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/registerextension/RegisterExtensionUnitTest.java similarity index 86% rename from testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/registerextension/RegisterExtensionUnitTest.java index 721cfdb013..7b787f96d0 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/registerextension/RegisterExtensionUnitTest.java @@ -1,6 +1,6 @@ -package com.baeldung; +package com.baeldung.junit5.registerextension; -import com.baeldung.extensions.RegisterExtensionSampleExtension; +import com.baeldung.junit5.registerextension.RegisterExtensionSampleExtension; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/testing-modules/junit-5/src/test/resources/data.csv b/testing-modules/junit5-annotations/src/test/resources/data.csv similarity index 100% rename from testing-modules/junit-5/src/test/resources/data.csv rename to testing-modules/junit5-annotations/src/test/resources/data.csv diff --git a/testing-modules/junit5-migration/README.md b/testing-modules/junit5-migration/README.md index b97ff8255c..84e540b466 100644 --- a/testing-modules/junit5-migration/README.md +++ b/testing-modules/junit5-migration/README.md @@ -1,2 +1,10 @@ +## JUnit 5 migration -This is the code for the Junit 4 - Junit 5 Migration E-book. +This module contains articles about migrating to JUnit 5. + +The code for the JUnit 4 - JUnit 5 E-book is in `com.baeldung.junit4` and `com.baeldung.junit5`. + +### Relevant Articles: +- [JUnit 5 Migration](https://www.baeldung.com/junit-5-migration) +- [A Quick JUnit vs TestNG Comparison](https://www.baeldung.com/junit-vs-testng) +- [Assertions in JUnit 4 and JUnit 5](https://www.baeldung.com/junit-assertions) diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java b/testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/Calculator.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java rename to testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/Calculator.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java b/testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java rename to testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java similarity index 96% rename from testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java index b0209b01aa..7e74c2dace 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit; +package com.baeldung.junit5vsjunit4assertions; import org.junit.Test; @@ -10,7 +10,7 @@ import static org.junit.Assert.*; /** * Unit test that demonstrate the different assertions available within JUnit 4 */ -public class AssertionsUnitTest { +public class Junit4AssertionsUnitTest { @Test public void whenAssertingEquality_thenEqual() { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java similarity index 98% rename from testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java index f1f7c531f2..40b9143a71 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.junit5vsjunit4assertions; import static java.time.Duration.ofSeconds; import static java.util.Arrays.asList; @@ -32,7 +32,7 @@ import org.junit.jupiter.api.Test; * Unit test that demonstrate the different assertions available within JUnit 4 */ @DisplayName("Test case for assertions") -public class AssertionUnitTest { +public class Junit5AssertionsUnitTest { @Test @DisplayName("Arrays should be equals") diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index 5c9e8fc81a..1d1bd6af7c 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -1,5 +1,7 @@ ### Relevant articles -- [Mockito’s Java 8 Features](http://www.baeldung.com/mockito-2-java-8) -- [Lazy Verification with Mockito 2](http://www.baeldung.com/mockito-2-lazy-verification) +- [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8) +- [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) +- [Quick Guide to BDDMockito](https://www.baeldung.com/bdd-mockito) +- [Mockito – Using Spies](https://www.baeldung.com/mockito-spy) diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java similarity index 95% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java index e772b5e049..fd7f04870b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java @@ -1,104 +1,104 @@ -package org.baeldung.bddmockito; - -import static org.junit.Assert.fail; -import static org.mockito.BDDMockito.*; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; - - -public class BDDMockitoIntegrationTest { - - PhoneBookService phoneBookService; - PhoneBookRepository phoneBookRepository; - - String momContactName = "Mom"; - String momPhoneNumber = "01234"; - String xContactName = "x"; - String tooLongPhoneNumber = "01111111111111"; - - @Before - public void init() { - phoneBookRepository = Mockito.mock(PhoneBookRepository.class); - phoneBookService = new PhoneBookService(phoneBookRepository); - } - - @Test - public void givenValidContactName_whenSearchInPhoneBook_thenRetunPhoneNumber() { - given(phoneBookRepository.contains(momContactName)).willReturn(true); - given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) - .will((InvocationOnMock invocation) -> { - if(invocation.getArgument(0).equals(momContactName)) { - return momPhoneNumber; - } else { - return null; - } - }); - - String phoneNumber = phoneBookService.search(momContactName); - - then(phoneBookRepository).should().contains(momContactName); - then(phoneBookRepository).should().getPhoneNumberByContactName(momContactName); - Assert.assertEquals(phoneNumber, momPhoneNumber); - } - - @Test - public void givenInvalidContactName_whenSearch_thenRetunNull() { - given(phoneBookRepository.contains(xContactName)).willReturn(false); - - String phoneNumber = phoneBookService.search(xContactName); - - then(phoneBookRepository).should().contains(xContactName); - then(phoneBookRepository).should(never()).getPhoneNumberByContactName(xContactName); - Assert.assertEquals(phoneNumber, null); - } - - @Test - public void givenValidContactNameAndPhoneNumber_whenRegister_thenSucceed() { - given(phoneBookRepository.contains(momContactName)).willReturn(false); - - phoneBookService.register(momContactName, momPhoneNumber); - - verify(phoneBookRepository).insert(momContactName, momPhoneNumber); - } - - @Test - public void givenEmptyPhoneNumber_whenRegister_thenFail() { - given(phoneBookRepository.contains(momContactName)).willReturn(false); - - phoneBookService.register(xContactName, ""); - - then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); - } - - @Test - public void givenLongPhoneNumber_whenRegister_thenFail() { - given(phoneBookRepository.contains(xContactName)).willReturn(false); - willThrow(new RuntimeException()) - .given(phoneBookRepository).insert(any(String.class), eq(tooLongPhoneNumber)); - - try { - phoneBookService.register(xContactName, tooLongPhoneNumber); - fail("Should throw exception"); - } catch (RuntimeException ex) { } - - then(phoneBookRepository).should(never()).insert(momContactName, tooLongPhoneNumber); - } - - @Test - public void givenExistentContactName_whenRegister_thenFail() { - given(phoneBookRepository.contains(momContactName)) - .willThrow(new RuntimeException("Name already exist")); - - try { - phoneBookService.register(momContactName, momPhoneNumber); - fail("Should throw exception"); - } catch(Exception ex) { } - - then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); - } - -} +package com.baeldung.mockito.bddmockito; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; + +import static org.junit.Assert.fail; +import static org.mockito.BDDMockito.*; + + +public class BDDMockitoUnitTest { + + PhoneBookService phoneBookService; + PhoneBookRepository phoneBookRepository; + + String momContactName = "Mom"; + String momPhoneNumber = "01234"; + String xContactName = "x"; + String tooLongPhoneNumber = "01111111111111"; + + @Before + public void init() { + phoneBookRepository = Mockito.mock(PhoneBookRepository.class); + phoneBookService = new PhoneBookService(phoneBookRepository); + } + + @Test + public void givenValidContactName_whenSearchInPhoneBook_thenRetunPhoneNumber() { + given(phoneBookRepository.contains(momContactName)).willReturn(true); + given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) + .will((InvocationOnMock invocation) -> { + if(invocation.getArgument(0).equals(momContactName)) { + return momPhoneNumber; + } else { + return null; + } + }); + + String phoneNumber = phoneBookService.search(momContactName); + + then(phoneBookRepository).should().contains(momContactName); + then(phoneBookRepository).should().getPhoneNumberByContactName(momContactName); + Assert.assertEquals(phoneNumber, momPhoneNumber); + } + + @Test + public void givenInvalidContactName_whenSearch_thenRetunNull() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + + String phoneNumber = phoneBookService.search(xContactName); + + then(phoneBookRepository).should().contains(xContactName); + then(phoneBookRepository).should(never()).getPhoneNumberByContactName(xContactName); + Assert.assertEquals(phoneNumber, null); + } + + @Test + public void givenValidContactNameAndPhoneNumber_whenRegister_thenSucceed() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(momContactName, momPhoneNumber); + + verify(phoneBookRepository).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenEmptyPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(xContactName, ""); + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenLongPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + willThrow(new RuntimeException()) + .given(phoneBookRepository).insert(any(String.class), eq(tooLongPhoneNumber)); + + try { + phoneBookService.register(xContactName, tooLongPhoneNumber); + fail("Should throw exception"); + } catch (RuntimeException ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, tooLongPhoneNumber); + } + + @Test + public void givenExistentContactName_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)) + .willThrow(new RuntimeException("Name already exist")); + + try { + phoneBookService.register(momContactName, momPhoneNumber); + fail("Should throw exception"); + } catch(Exception ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java index b73a1d835c..dd44e5e3cc 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java @@ -1,26 +1,26 @@ -package org.baeldung.bddmockito; - -public interface PhoneBookRepository { - - /** - * Insert phone record - * @param name Contact name - * @param phone Phone number - */ - void insert(String name, String phone); - - /** - * Search for contact phone number - * @param name Contact name - * @return phone number - */ - String getPhoneNumberByContactName(String name); - - /** - * Check if the phonebook contains this contact - * @param name Contact name - * @return true if this contact name exists - */ - boolean contains(String name); - -} +package com.baeldung.mockito.bddmockito; + +public interface PhoneBookRepository { + + /** + * Insert phone record + * @param name Contact name + * @param phone Phone number + */ + void insert(String name, String phone); + + /** + * Search for contact phone number + * @param name Contact name + * @return phone number + */ + String getPhoneNumberByContactName(String name); + + /** + * Check if the phonebook contains this contact + * @param name Contact name + * @return true if this contact name exists + */ + boolean contains(String name); + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java similarity index 93% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java index 645884af02..b96cf4efb7 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java @@ -1,34 +1,34 @@ -package org.baeldung.bddmockito; - -public class PhoneBookService { - - private PhoneBookRepository phoneBookRepository; - - public PhoneBookService(PhoneBookRepository phoneBookRepository) { - this.phoneBookRepository = phoneBookRepository; - } - - /** - * Register a contact - * @param name Contact name - * @param phone Phone number - */ - public void register(String name, String phone) { - if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { - phoneBookRepository.insert(name, phone); - } - } - - /** - * Search for a phone number by contact name - * @param name Contact name - * @return Phone number - */ - public String search(String name) { - if(!name.isEmpty() && phoneBookRepository.contains(name)) { - return phoneBookRepository.getPhoneNumberByContactName(name); - } - return null; - } - -} +package com.baeldung.mockito.bddmockito; + +public class PhoneBookService { + + private PhoneBookRepository phoneBookRepository; + + public PhoneBookService(PhoneBookRepository phoneBookRepository) { + this.phoneBookRepository = phoneBookRepository; + } + + /** + * Register a contact + * @param name Contact name + * @param phone Phone number + */ + public void register(String name, String phone) { + if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { + phoneBookRepository.insert(name, phone); + } + } + + /** + * Search for a phone number by contact name + * @param name Contact name + * @return Phone number + */ + public String search(String name) { + if(!name.isEmpty() && phoneBookRepository.contains(name)) { + return phoneBookRepository.getPhoneNumberByContactName(name); + } + return null; + } + +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java similarity index 95% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java index 0e6921c7a1..c7a9d84191 100644 --- a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java @@ -1,16 +1,16 @@ -package com.baeldung.mockito.java8; - -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import java.util.List; +package com.baeldung.mockito.lazyverification; import org.junit.Test; import org.mockito.exceptions.base.MockitoAssertionError; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; +import java.util.List; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + public class LazyVerificationUnitTest { @Test diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java similarity index 96% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java index 306f53297a..ea12061fc6 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java @@ -1,11 +1,4 @@ -package org.baeldung.mockito.misusing; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; -import static org.junit.jupiter.api.Assertions.fail; - -import java.util.ArrayList; -import java.util.List; +package com.baeldung.mockito.spy; import org.junit.After; import org.junit.Test; @@ -13,6 +6,13 @@ import org.mockito.Mockito; import org.mockito.exceptions.misusing.NotAMockException; import org.mockito.internal.progress.ThreadSafeMockingProgress; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.fail; + public class MockitoMisusingUnitTest { @After diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java similarity index 96% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java index 118d50ea40..d4696e482b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java @@ -1,9 +1,4 @@ -package org.baeldung.mockito; - -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; +package com.baeldung.mockito.spy; import org.junit.Test; import org.junit.runner.RunWith; @@ -11,8 +6,13 @@ import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + @RunWith(MockitoJUnitRunner.class) -public class MockitoSpyIntegrationTest { +public class MockitoSpyUnitTest { @Spy private List aSpyList = new ArrayList(); diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 8fe57016e3..6b8f53ffee 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -4,21 +4,13 @@ ### Relevant Articles: -- [Mockito Verify Cookbook](http://www.baeldung.com/mockito-verify) -- [Mockito When/Then Cookbook](http://www.baeldung.com/mockito-behavior) -- [Mockito – Using Spies](http://www.baeldung.com/mockito-spy) -- [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](http://www.baeldung.com/mockito-annotations) -- [Mockito’s Mock Methods](http://www.baeldung.com/mockito-mock-methods) -- [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock) -- [Mocking Exception Throwing using Mockito](http://www.baeldung.com/mockito-exceptions) -- [Mocking Void Methods with Mockito](http://www.baeldung.com/mockito-void-methods) -- [Mocking of Private Methods Using PowerMock](http://www.baeldung.com/powermock-private-method) -- [Mock Final Classes and Methods with Mockito](http://www.baeldung.com/mockito-final) -- [Hamcrest Custom Matchers](http://www.baeldung.com/hamcrest-custom-matchers) -- [Hamcrest Common Core Matchers](http://www.baeldung.com/hamcrest-core-matchers) -- [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) -- [Using Hamcrest Number Matchers](https://www.baeldung.com/hamcrest-number-matchers) -- [Quick Guide to BDDMockito](http://www.baeldung.com/bdd-mockito) -- [Hamcrest Bean Matchers](http://www.baeldung.com/hamcrest-bean-matchers) -- [Hamcrest Object Matchers](http://www.baeldung.com/hamcrest-object-matchers) -- [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) +- [Mockito Verify Cookbook](https://www.baeldung.com/mockito-verify) +- [Mockito When/Then Cookbook](https://www.baeldung.com/mockito-behavior) +- [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](https://www.baeldung.com/mockito-annotations) +- [Mockito’s Mock Methods](https://www.baeldung.com/mockito-mock-methods) +- [Introduction to PowerMock](https://www.baeldung.com/intro-to-powermock) +- [Mocking of Private Methods Using PowerMock](https://www.baeldung.com/powermock-private-method) +- [Mocking Exception Throwing using Mockito](https://www.baeldung.com/mockito-exceptions) +- [Mocking Void Methods with Mockito](https://www.baeldung.com/mockito-void-methods) +- [Mock Final Classes and Methods with Mockito](https://www.baeldung.com/mockito-final) +- [Testing Callbacks with Mockito](https://www.baeldung.com/mockito-callbacks) diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index 7b6d6e7735..e0f32d88bf 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -1,7 +1,7 @@ 4.0.0 - org.baeldung + com.baeldung mockito 0.1-SNAPSHOT mockito @@ -58,12 +58,6 @@ ${powermock.version} test - - org.hamcrest - java-hamcrest - ${hamcrest.version} - - org.springframework.boot spring-boot-starter @@ -96,7 +90,7 @@ 19.0 - 1.7.0 + 2.0.2 2.0.0.0 2.1.1 diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/ActionHandler.java similarity index 93% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/ActionHandler.java index 289dcff399..d70fc2b690 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/ActionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public class ActionHandler { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Callback.java similarity index 61% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Callback.java index fb8d01ce2e..cc6180c249 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Callback.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public interface Callback { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Data.java similarity index 82% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Data.java index 665c05382c..9549995469 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Data.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public class Data { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Response.java similarity index 90% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Response.java index 22474a5ba7..03aded3895 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Response.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public class Response { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Service.java similarity index 70% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Service.java index 63434e53fb..d9f1a44422 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Service.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public interface Service { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java deleted file mode 100644 index 52561d07dc..0000000000 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.baeldung.hamcrest; - -public class Location { -} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java similarity index 77% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java index c41021f7b6..27b7534978 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; public final class FinalList extends MyList { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java similarity index 95% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java index 5f064e1355..6ff791ae06 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Test; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java new file mode 100644 index 0000000000..bb03fca06f --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.mockito; + +import org.junit.Test; + +import static org.junit.Assert.assertNotEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.baeldung.mockito.MyList; + +public class MockFinalsUnitTest { + + @Test + public void whenMockFinalClassMockWorks() { + + FinalList finalList = new FinalList(); + + FinalList mock = mock(FinalList.class); + when(mock.size()).thenReturn(2); + + assertNotEquals(mock.size(), finalList.size()); + + } + + @Test + public void whenMockFinalMethodMockWorks() { + + MyList myList = new MyList(); + + MyList mock = mock(MyList.class); + when(mock.finalMethod()).thenReturn(1); + + assertNotEquals(mock.finalMethod(), myList.finalMethod()); + } + + + } diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java index 5e083adbf5..94054d1cbb 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Before; import org.junit.Test; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java new file mode 100644 index 0000000000..731183bae2 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java @@ -0,0 +1,114 @@ +package com.baeldung.mockito; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +//@RunWith(MockitoJUnitRunner.class) +public class MockitoAnnotationUnitTest { + + @Mock + private List mockedList; + + @Spy + private List spiedList = new ArrayList<>(); + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + } + + // tests + + @Test + public void whenNotUseMockAnnotation_thenCorrect() { + final List mockList = Mockito.mock(List.class); + mockList.add("one"); + Mockito.verify(mockList).add("one"); + assertEquals(0, mockList.size()); + + Mockito.when(mockList.size()).thenReturn(100); + assertEquals(100, mockList.size()); + } + + @Test + public void whenUseMockAnnotation_thenMockIsInjected() { + mockedList.add("one"); + Mockito.verify(mockedList).add("one"); + assertEquals(0, mockedList.size()); + + Mockito.when(mockedList.size()).thenReturn(100); + assertEquals(100, mockedList.size()); + } + + @Test + public void whenNotUseSpyAnnotation_thenCorrect() { + final List spyList = Mockito.spy(new ArrayList()); + spyList.add("one"); + spyList.add("two"); + + Mockito.verify(spyList).add("one"); + Mockito.verify(spyList).add("two"); + + assertEquals(2, spyList.size()); + + Mockito.doReturn(100).when(spyList).size(); + assertEquals(100, spyList.size()); + } + + @Test + public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() { + spiedList.add("one"); + spiedList.add("two"); + + Mockito.verify(spiedList).add("one"); + Mockito.verify(spiedList).add("two"); + + assertEquals(2, spiedList.size()); + + Mockito.doReturn(100).when(spiedList).size(); + assertEquals(100, spiedList.size()); + } + + @Test + public void whenNotUseCaptorAnnotation_thenCorrect() { + final List mockList = Mockito.mock(List.class); + final ArgumentCaptor arg = ArgumentCaptor.forClass(String.class); + mockList.add("one"); + Mockito.verify(mockList).add(arg.capture()); + + assertEquals("one", arg.getValue()); + } + + @Captor + private + ArgumentCaptor argCaptor; + + @Test + public void whenUseCaptorAnnotation_thenTheSam() { + mockedList.add("one"); + Mockito.verify(mockedList).add(argCaptor.capture()); + + assertEquals("one", argCaptor.getValue()); + } + + @Mock + private Map wordMap; + + @InjectMocks + private MyDictionary dic = new MyDictionary(); + + @Test + public void whenUseInjectMocksAnnotation_thenCorrect() { + Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning"); + + assertEquals("aMeaning", dic.getMeaning("aWord")); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java similarity index 99% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java index 5da86dfb9a..5d3c009edc 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Test; import org.mockito.Mockito; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java new file mode 100644 index 0000000000..389dc231c1 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java @@ -0,0 +1,97 @@ +package com.baeldung.mockito; + +import org.junit.Test; +import org.mockito.Mockito; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; + +import com.baeldung.mockito.MyList; + +public class MockitoConfigExamplesUnitTest { + + // tests + + @Test + public final void whenMockReturnBehaviorIsConfigured_thenBehaviorIsVerified() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false); + + final boolean added = listMock.add(randomAlphabetic(6)); + assertThat(added, is(false)); + } + + @Test + public final void whenMockReturnBehaviorIsConfigured2_thenBehaviorIsVerified() { + final MyList listMock = Mockito.mock(MyList.class); + doReturn(false).when(listMock).add(anyString()); + + final boolean added = listMock.add(randomAlphabetic(6)); + assertThat(added, is(false)); + } + + @Test(expected = IllegalStateException.class) + public final void givenMethodIsConfiguredToThrowException_whenCallingMethod_thenExceptionIsThrown() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenThrow(IllegalStateException.class); + + listMock.add(randomAlphabetic(6)); + } + + @Test(expected = NullPointerException.class) + public final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() { + final MyList listMock = Mockito.mock(MyList.class); + doThrow(NullPointerException.class).when(listMock).clear(); + + listMock.clear(); + } + + @Test + public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingOnlyOnce_thenNoExceptionIsThrown() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class); + + listMock.add(randomAlphabetic(6)); + } + + @Test(expected = IllegalStateException.class) + public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingTwice_thenExceptionIsThrown() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class); + + listMock.add(randomAlphabetic(6)); + listMock.add(randomAlphabetic(6)); + } + + @Test + public final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.size()).thenCallRealMethod(); + + assertThat(listMock.size(), equalTo(1)); + } + + @Test + public final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() { + final MyList listMock = Mockito.mock(MyList.class); + doAnswer(invocation -> "Always the same").when(listMock).get(anyInt()); + + final String element = listMock.get(1); + assertThat(element, is(equalTo("Always the same"))); + } + + @Test(expected = NullPointerException.class) + public final void givenSpy_whenConfiguringBehaviorOfSpy_thenCorrectlyConfigured() { + final MyList instance = new MyList(); + final MyList spy = Mockito.spy(instance); + + doThrow(NullPointerException.class).when(spy).size(); + spy.size(); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java similarity index 92% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java index 9a25ccb28c..23fcba60b8 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java @@ -1,13 +1,11 @@ -package org.baeldung.mockito; - -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +package com.baeldung.mockito; import org.junit.Test; import org.mockito.Mockito; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + public class MockitoExceptionIntegrationTest { @Test(expected = NullPointerException.class) diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java new file mode 100644 index 0000000000..7ed4fbdf37 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.mockito; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.mockito.Mockito; + +public class MockitoExceptionUnitTest { + + @Test(expected = NullPointerException.class) + public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class); + + dictMock.getMeaning("word"); + } + + @Test(expected = IllegalStateException.class) + public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + doThrow(IllegalStateException.class).when(dictMock) + .add(anyString(), anyString()); + + dictMock.add("word", "meaning"); + } + + @Test(expected = NullPointerException.class) + public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred")); + + dictMock.getMeaning("word"); + } + + @Test(expected = IllegalStateException.class) + public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + doThrow(new IllegalStateException("Error occurred")).when(dictMock) + .add(anyString(), anyString()); + + dictMock.add("word", "meaning"); + } + + // ===== + + @Test(expected = NullPointerException.class) + public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dict = new MyDictionary(); + MyDictionary spy = Mockito.spy(dict); + + when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class); + spy.getMeaning("word"); + } +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java index 568492ca10..d6a11bbc7d 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java @@ -1,13 +1,12 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; import org.mockito.*; import org.mockito.junit.MockitoJUnitRunner; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java index 6ec3b34db5..e8cbcc4e8c 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java @@ -1,19 +1,19 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; -import static org.mockito.Mockito.*; -import static org.junit.Assert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.containsString; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import org.junit.Test; import org.junit.Rule; +import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.MockSettings; import org.mockito.exceptions.verification.TooLittleActualInvocations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.*; + public class MockitoMockIntegrationTest { private static class CustomAnswer implements Answer { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java new file mode 100644 index 0000000000..e1d99f80a2 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.mockito; + +import static org.mockito.Mockito.*; + +import com.baeldung.mockito.MyList; + +import static org.junit.Assert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.containsString; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import org.junit.Test; +import org.junit.Rule; +import org.junit.rules.ExpectedException; +import org.mockito.MockSettings; +import org.mockito.exceptions.verification.TooLittleActualInvocations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +public class MockitoMockUnitTest { + + private static class CustomAnswer implements Answer { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + return false; + } + } + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void whenUsingSimpleMock_thenCorrect() { + MyList listMock = mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false); + boolean added = listMock.add(randomAlphabetic(6)); + + verify(listMock).add(anyString()); + assertThat(added, is(false)); + } + + @Test + public void whenUsingMockWithName_thenCorrect() { + MyList listMock = mock(MyList.class, "myMock"); + when(listMock.add(anyString())).thenReturn(false); + listMock.add(randomAlphabetic(6)); + + thrown.expect(TooLittleActualInvocations.class); + thrown.expectMessage(containsString("myMock.add")); + + verify(listMock, times(2)).add(anyString()); + } + + @Test + public void whenUsingMockWithAnswer_thenCorrect() { + MyList listMock = mock(MyList.class, new CustomAnswer()); + boolean added = listMock.add(randomAlphabetic(6)); + + verify(listMock).add(anyString()); + assertThat(added, is(false)); + } + + @Test + public void whenUsingMockWithSettings_thenCorrect() { + MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer()); + MyList listMock = mock(MyList.class, customSettings); + boolean added = listMock.add(randomAlphabetic(6)); + + verify(listMock).add(anyString()); + assertThat(added, is(false)); + } +} \ No newline at end of file diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java similarity index 99% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java index 418e9693b8..b5075d7db2 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import com.google.common.collect.Lists; import org.junit.Test; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java new file mode 100644 index 0000000000..ca09f77d2d --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java @@ -0,0 +1,119 @@ +package com.baeldung.mockito; + +import com.google.common.collect.Lists; + +import com.baeldung.mockito.MyList; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; +import org.mockito.Mockito; +import org.mockito.exceptions.verification.NoInteractionsWanted; + +import java.util.List; + +import static org.hamcrest.Matchers.hasItem; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; + +public class MockitoVerifyExamplesUnitTest { + + // tests + + @Test + public final void givenInteractionWithMockOccurred_whenVerifyingInteraction_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + verify(mockedList).size(); + } + + @Test + public final void givenOneInteractionWithMockOccurred_whenVerifyingNumberOfInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + verify(mockedList, times(1)).size(); + } + + @Test + public final void givenNoInteractionWithMockOccurred_whenVerifyingInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + verifyZeroInteractions(mockedList); + } + + @Test + public final void givenNoInteractionWithMethodOfMockOccurred_whenVerifyingInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + verify(mockedList, times(0)).size(); + } + + @Test(expected = NoInteractionsWanted.class) + public final void givenUnverifiedInteraction_whenVerifyingNoUnexpectedInteractions_thenFail() { + final List mockedList = mock(MyList.class); + mockedList.size(); + mockedList.clear(); + + verify(mockedList).size(); + verifyNoMoreInteractions(mockedList); + } + + @Test + public final void whenVerifyingOrderOfInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + mockedList.add("a parameter"); + mockedList.clear(); + + final InOrder inOrder = Mockito.inOrder(mockedList); + inOrder.verify(mockedList).size(); + inOrder.verify(mockedList).add("a parameter"); + inOrder.verify(mockedList).clear(); + } + + @Test + public final void whenVerifyingAnInteractionHasNotOccurred_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + + verify(mockedList, never()).clear(); + } + + @Test + public final void whenVerifyingAnInteractionHasOccurredAtLeastOnce_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.clear(); + mockedList.clear(); + mockedList.clear(); + + verify(mockedList, atLeast(1)).clear(); + verify(mockedList, atMost(10)).clear(); + } + + // with arguments + + @Test + public final void whenVerifyingAnInteractionWithExactArgument_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.add("test"); + + verify(mockedList).add("test"); + } + + @Test + public final void whenVerifyingAnInteractionWithAnyArgument_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.add("test"); + + verify(mockedList).add(anyString()); + } + + @Test + public final void whenVerifyingAnInteractionWithArgumentCapture_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.addAll(Lists.newArrayList("someElement")); + final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(List.class); + verify(mockedList).addAll(argumentCaptor.capture()); + final List capturedArgument = argumentCaptor.>getValue(); + assertThat(capturedArgument, hasItem("someElement")); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java similarity index 93% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java index 9492c90d11..92a4498696 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import java.util.HashMap; import java.util.Map; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java similarity index 80% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java index 4fcddb3164..ac3a76e04a 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java @@ -1,8 +1,8 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import java.util.AbstractList; -class MyList extends AbstractList { +public class MyList extends AbstractList { @Override public String get(final int index) { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/callbacks/ActionHandlerUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/callbacks/ActionHandlerUnitTest.java index c34a9a4a09..5ffe4ab28d 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/callbacks/ActionHandlerUnitTest.java @@ -1,11 +1,4 @@ -package org.baeldung.mockito.service; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.verify; +package com.baeldung.mockito.callbacks; import org.junit.Before; import org.junit.Test; @@ -15,6 +8,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.verify; + public class ActionHandlerUnitTest { @Mock diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java similarity index 79% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java index b020338fd9..dd41d98b57 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java @@ -1,23 +1,16 @@ -package org.baeldung.mockito; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doCallRealMethod; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +package com.baeldung.mockito.voidmethods; +import com.baeldung.mockito.MyList; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + @RunWith(MockitoJUnitRunner.class) public class MockitoVoidMethodsUnitTest { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java index 5e311c60f2..5b66aa0a9e 100644 --- a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java @@ -14,7 +14,7 @@ import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(fullyQualifiedNames = "com.baeldung.powermockito.introduction.LuckyNumberGenerator") -public class LuckyNumberGeneratorIntegrationTest { +public class LuckyNumberGeneratorUnitTest { @Test public final void givenPrivateMethodWithReturn_whenUsingPowerMockito_thenCorrect() throws Exception { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java similarity index 94% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java index 1b6431f0c2..4943b0486a 100644 --- a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java @@ -13,7 +13,7 @@ import static org.powermock.api.mockito.PowerMockito.*; @RunWith(PowerMockRunner.class) @PrepareForTest(fullyQualifiedNames = "com.baeldung.powermockito.introduction.*") -public class PowerMockitoIntegrationTest { +public class PowerMockitoUnitTest { @Test public void givenFinalMethods_whenUsingPowerMockito_thenCorrect() throws Exception { @@ -44,10 +44,10 @@ public class PowerMockitoIntegrationTest { assertEquals("Hello Baeldung!", firstWelcome); assertEquals("Hello Baeldung!", secondWelcome); - verifyStatic(times(2)); + verifyStatic(CollaboratorWithStaticMethods.class, times(2)); CollaboratorWithStaticMethods.firstMethod(Mockito.anyString()); - verifyStatic(Mockito.never()); + verifyStatic(CollaboratorWithStaticMethods.class, Mockito.never()); CollaboratorWithStaticMethods.secondMethod(); CollaboratorWithStaticMethods.thirdMethod(); @@ -60,7 +60,6 @@ public class PowerMockitoIntegrationTest { spy(CollaboratorForPartialMocking.class); when(CollaboratorForPartialMocking.staticMethod()).thenReturn("I am a static mock method."); returnValue = CollaboratorForPartialMocking.staticMethod(); - verifyStatic(); CollaboratorForPartialMocking.staticMethod(); assertEquals("I am a static mock method.", returnValue); diff --git a/testing-modules/mocks/README.md b/testing-modules/mocks/README.md index 3cb20dcf92..3baefe072b 100644 --- a/testing-modules/mocks/README.md +++ b/testing-modules/mocks/README.md @@ -2,3 +2,10 @@ - [EasyMock Argument Matchers](http://www.baeldung.com/easymock-argument-matchers) - [Mock Static Method using JMockit](https://www.baeldung.com/jmockit-static-method) +- [Mockito vs EasyMock vs JMockit](http://www.baeldung.com/mockito-vs-easymock-vs-jmockit) +- [Introduction to EasyMock](http://www.baeldung.com/easymock) +- [JMockit 101](http://www.baeldung.com/jmockit-101) +- [A Guide to JMockit Expectations](http://www.baeldung.com/jmockit-expectations) +- [JMockit Advanced Usage](http://www.baeldung.com/jmockit-advanced-usage) +- [Introduction to Jukito](http://www.baeldung.com/jukito) +- [A Guide to JavaFaker](https://www.baeldung.com/java-faker) diff --git a/testing-modules/mocks/jmockit/README.md b/testing-modules/mocks/jmockit/README.md deleted file mode 100644 index 0e44b93d6e..0000000000 --- a/testing-modules/mocks/jmockit/README.md +++ /dev/null @@ -1,9 +0,0 @@ -========= - -## JMockit related tutorials - - -### Relevant Articles: -- [JMockit 101](http://www.baeldung.com/jmockit-101) -- [A Guide to JMockit Expectations](http://www.baeldung.com/jmockit-expectations) -- [JMockit Advanced Usage](http://www.baeldung.com/jmockit-advanced-usage) diff --git a/testing-modules/mocks/mock-comparisons/README.md b/testing-modules/mocks/mock-comparisons/README.md deleted file mode 100644 index 20c13ecd72..0000000000 --- a/testing-modules/mocks/mock-comparisons/README.md +++ /dev/null @@ -1,8 +0,0 @@ -========= - -## Mock comparison realated tutorials - - -### Relevant Articles: -- [Mockito vs EasyMock vs JMockit](http://www.baeldung.com/mockito-vs-easymock-vs-jmockit) -- [Introduction to EasyMock](http://www.baeldung.com/easymock) diff --git a/testing-modules/mocks/mock-comparisons/pom.xml b/testing-modules/mocks/mock-comparisons/pom.xml deleted file mode 100644 index e454f124ce..0000000000 --- a/testing-modules/mocks/mock-comparisons/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - 4.0.0 - mock-comparisons - mock-comparisons - - - com.baeldung - mocks - 1.0.0-SNAPSHOT - ../ - - - - - org.mockito - mockito-core - ${mockito.version} - test - - - - org.easymock - easymock - ${easymock.version} - test - - - - org.jmockit - jmockit - ${jmockit.version} - test - - - - - - mock-comparisons - - - src/main/resources - true - - - - - - 2.21.0 - 3.5.1 - 1.41 - - - diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index ecc8b61a6d..bf75cfc3a2 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -3,7 +3,6 @@ 4.0.0 mocks mocks - pom com.baeldung @@ -12,9 +11,45 @@ ../../ - - mock-comparisons - jmockit - + + + com.github.javafaker + javafaker + ${javafaker.version} + + + org.jmockit + jmockit + ${jmockit.version} + test + + + org.jukito + jukito + ${jukito.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + org.easymock + easymock + ${easymock.version} + test + + + + + 0.15 + 1.5 +2.21.0 + 3.5.1 + 1.41 + diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/ArticleReader.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/ArticleReader.java index 9e4a15c27a..c4732e3452 --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/easymock/ArticleReader.java @@ -1,36 +1,36 @@ -package com.baeldung.easymock; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import static java.util.stream.Collectors.toList; - -public class ArticleReader { - - private List articles; - private Iterator articleIter; - - public ArticleReader() { - this(new ArrayList<>()); - } - - public ArticleReader(List articles) { - this.articles = articles; - this.articleIter = this.articles.iterator(); - } - - public List ofTopic(String topic) { - return articles - .stream() - .filter(article -> article - .title() - .contains(topic)) - .collect(toList()); - } - - public BaeldungArticle next() { - return this.articleIter.next(); - } - +package com.baeldung.easymock; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +public class ArticleReader { + + private List articles; + private Iterator articleIter; + + public ArticleReader() { + this(new ArrayList<>()); + } + + public ArticleReader(List articles) { + this.articles = articles; + this.articleIter = this.articles.iterator(); + } + + public List ofTopic(String topic) { + return articles + .stream() + .filter(article -> article + .title() + .contains(topic)) + .collect(toList()); + } + + public BaeldungArticle next() { + return this.articleIter.next(); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungArticle.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungArticle.java index f386c980f4..9f332a9bac --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungArticle.java @@ -1,25 +1,25 @@ -package com.baeldung.easymock; - -public class BaeldungArticle { - - public static BaeldungArticle simpleArticle(String title, String content) { - return new BaeldungArticle(title, content); - } - - private String title; - private String content; - - private BaeldungArticle(String title, String content) { - this.title = title; - this.content = content; - } - - public String title() { - return this.title; - } - - public String content() { - return this.content; - } - +package com.baeldung.easymock; + +public class BaeldungArticle { + + public static BaeldungArticle simpleArticle(String title, String content) { + return new BaeldungArticle(title, content); + } + + private String title; + private String content; + + private BaeldungArticle(String title, String content) { + this.title = title; + this.content = content; + } + + public String title() { + return this.title; + } + + public String content() { + return this.content; + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungReader.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungReader.java index 319dfc5d77..fc37b9f94a --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungReader.java @@ -1,40 +1,40 @@ -package com.baeldung.easymock; - -import java.util.List; - -public class BaeldungReader { - - private ArticleReader articleReader; - private IArticleWriter articleWriter; - - public BaeldungReader() { - } - - ; - - public BaeldungReader(ArticleReader articleReader) { - this.articleReader = articleReader; - } - - public BaeldungReader(IArticleWriter writer) { - this.articleWriter = writer; - } - - public BaeldungReader(ArticleReader articleReader, IArticleWriter writer) { - this.articleReader = articleReader; - this.articleWriter = writer; - } - - public BaeldungArticle readNext() { - return articleReader.next(); - } - - public List readTopic(String topic) { - return articleReader.ofTopic(topic); - } - - public String write(String title, String content) { - return articleWriter.write(title, content); - } - +package com.baeldung.easymock; + +import java.util.List; + +public class BaeldungReader { + + private ArticleReader articleReader; + private IArticleWriter articleWriter; + + public BaeldungReader() { + } + + ; + + public BaeldungReader(ArticleReader articleReader) { + this.articleReader = articleReader; + } + + public BaeldungReader(IArticleWriter writer) { + this.articleWriter = writer; + } + + public BaeldungReader(ArticleReader articleReader, IArticleWriter writer) { + this.articleReader = articleReader; + this.articleWriter = writer; + } + + public BaeldungArticle readNext() { + return articleReader.next(); + } + + public List readTopic(String topic) { + return articleReader.ofTopic(topic); + } + + public String write(String title, String content) { + return articleWriter.write(title, content); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/IArticleWriter.java old mode 100755 new mode 100644 similarity index 94% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/IArticleWriter.java index 4c8b190464..26970d5eb5 --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/easymock/IArticleWriter.java @@ -1,7 +1,7 @@ -package com.baeldung.easymock; - -public interface IArticleWriter { - - String write(String title, String content); - +package com.baeldung.easymock; + +public interface IArticleWriter { + + String write(String title, String content); + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/IUserService.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/IUserService.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/User.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/User.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java b/testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java rename to testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/Calculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java b/testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java rename to testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java b/testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java rename to testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java b/testing-modules/mocks/src/main/java/com/baeldung/mocks/jmockit/AppManager.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java rename to testing-modules/mocks/src/main/java/com/baeldung/mocks/jmockit/AppManager.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Model.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Model.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Performer.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Performer.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginController.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginController.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginDao.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginDao.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginService.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginService.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/UserForm.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/UserForm.java diff --git a/testing-modules/mocks/src/main/resources/logback.xml b/testing-modules/mocks/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/testing-modules/mocks/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/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java old mode 100755 new mode 100644 similarity index 96% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java index afacd8d8ad..56a58dd6e8 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java @@ -1,57 +1,57 @@ -package com.baeldung.easymock; - -import org.easymock.EasyMockRunner; -import org.easymock.Mock; -import org.easymock.TestSubject; -import org.junit.*; -import org.junit.runner.RunWith; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; - -@RunWith(EasyMockRunner.class) -public class BaeldungReaderAnnotatedUnitTest { - - @Mock ArticleReader mockArticleReader; - - @Mock IArticleWriter mockArticleWriter; - - @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); - - @Test - public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - baeldungReader.readNext(); - verify(mockArticleReader); - } - - @Mock BaeldungReader mockBaeldungReader; - - @Test - public void givenBaeldungReader_whenWrite_thenWriterCalled() { - expect(mockArticleWriter.write("title", "content")).andReturn(null); - replay(mockArticleWriter); - baeldungReader.write("title", "content"); - verify(mockArticleWriter); - } - - @Test - public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - replay(mockArticleReader); - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception ignored) { - } - verify(mockArticleReader); - } - -} - +package com.baeldung.easymock; + +import org.easymock.EasyMockRunner; +import org.easymock.Mock; +import org.easymock.TestSubject; +import org.junit.*; +import org.junit.runner.RunWith; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; + +@RunWith(EasyMockRunner.class) +public class BaeldungReaderAnnotatedUnitTest { + + @Mock ArticleReader mockArticleReader; + + @Mock IArticleWriter mockArticleWriter; + + @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); + + @Test + public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + baeldungReader.readNext(); + verify(mockArticleReader); + } + + @Mock BaeldungReader mockBaeldungReader; + + @Test + public void givenBaeldungReader_whenWrite_thenWriterCalled() { + expect(mockArticleWriter.write("title", "content")).andReturn(null); + replay(mockArticleWriter); + baeldungReader.write("title", "content"); + verify(mockArticleWriter); + } + + @Test + public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + replay(mockArticleReader); + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception ignored) { + } + verify(mockArticleReader); + } + +} + diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java old mode 100755 new mode 100644 similarity index 96% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java index 086ed88888..5b4219d263 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java @@ -1,57 +1,57 @@ -package com.baeldung.easymock; - -import org.easymock.EasyMockRule; -import org.easymock.Mock; -import org.easymock.TestSubject; -import org.junit.*; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; - -public class BaeldungReaderAnnotatedWithRuleUnitTest { - - @Rule public EasyMockRule mockRule = new EasyMockRule(this); - - @Mock ArticleReader mockArticleReader; - - @Mock IArticleWriter mockArticleWriter; - - @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); - - @Test - public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - baeldungReader.readNext(); - verify(mockArticleReader); - } - - @Mock BaeldungReader mockBaeldungReader; - - @Test - public void givenBaeldungReader_whenWrite_thenWriterCalled() { - expect(mockArticleWriter.write("title", "content")).andReturn(null); - replay(mockArticleWriter); - baeldungReader.write("title", "content"); - verify(mockArticleWriter); - } - - @Test - public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - replay(mockArticleReader); - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception ignored) { - } - verify(mockArticleReader); - } - -} - +package com.baeldung.easymock; + +import org.easymock.EasyMockRule; +import org.easymock.Mock; +import org.easymock.TestSubject; +import org.junit.*; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; + +public class BaeldungReaderAnnotatedWithRuleUnitTest { + + @Rule public EasyMockRule mockRule = new EasyMockRule(this); + + @Mock ArticleReader mockArticleReader; + + @Mock IArticleWriter mockArticleWriter; + + @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); + + @Test + public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + baeldungReader.readNext(); + verify(mockArticleReader); + } + + @Mock BaeldungReader mockBaeldungReader; + + @Test + public void givenBaeldungReader_whenWrite_thenWriterCalled() { + expect(mockArticleWriter.write("title", "content")).andReturn(null); + replay(mockArticleWriter); + baeldungReader.write("title", "content"); + verify(mockArticleWriter); + } + + @Test + public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + replay(mockArticleReader); + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception ignored) { + } + verify(mockArticleReader); + } + +} + diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java old mode 100755 new mode 100644 similarity index 97% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java index 89d3a2baee..6d8b553df7 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java @@ -1,27 +1,27 @@ -package com.baeldung.easymock; - -import org.easymock.*; -import org.junit.*; - -import static org.easymock.EasyMock.*; - -public class BaeldungReaderMockDelegationUnitTest { - - EasyMockSupport easyMockSupport = new EasyMockSupport(); - - @Test - public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { - ArticleReader mockArticleReader = easyMockSupport.createMock(ArticleReader.class); - IArticleWriter mockArticleWriter = easyMockSupport.createMock(IArticleWriter.class); - BaeldungReader baeldungReader = new BaeldungReader(mockArticleReader, mockArticleWriter); - - expect(mockArticleReader.next()).andReturn(null); - expect(mockArticleWriter.write("title", "content")).andReturn(""); - easyMockSupport.replayAll(); - - baeldungReader.readNext(); - baeldungReader.write("title", "content"); - easyMockSupport.verifyAll(); - } - +package com.baeldung.easymock; + +import org.easymock.*; +import org.junit.*; + +import static org.easymock.EasyMock.*; + +public class BaeldungReaderMockDelegationUnitTest { + + EasyMockSupport easyMockSupport = new EasyMockSupport(); + + @Test + public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { + ArticleReader mockArticleReader = easyMockSupport.createMock(ArticleReader.class); + IArticleWriter mockArticleWriter = easyMockSupport.createMock(IArticleWriter.class); + BaeldungReader baeldungReader = new BaeldungReader(mockArticleReader, mockArticleWriter); + + expect(mockArticleReader.next()).andReturn(null); + expect(mockArticleWriter.write("title", "content")).andReturn(""); + easyMockSupport.replayAll(); + + baeldungReader.readNext(); + baeldungReader.write("title", "content"); + easyMockSupport.verifyAll(); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java old mode 100755 new mode 100644 similarity index 96% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java index cd0c906949..8b5c4d9d41 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java @@ -1,42 +1,42 @@ -package com.baeldung.easymock; - -import org.easymock.*; -import org.junit.*; -import org.junit.runner.RunWith; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertEquals; - -@RunWith(EasyMockRunner.class) -public class BaeldungReaderMockSupportUnitTest extends EasyMockSupport { - - @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); - @Mock ArticleReader mockArticleReader; - @Mock IArticleWriter mockArticleWriter; - - @Test - public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - expect(mockArticleWriter.write("title", "content")).andReturn("BAEL-201801"); - replayAll(); - - Exception expectedException = null; - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception exception) { - expectedException = exception; - } - String articleId = baeldungReader.write("title", "content"); - verifyAll(); - assertEquals(NoSuchElementException.class, expectedException.getClass()); - assertEquals("BAEL-201801", articleId); - } - +package com.baeldung.easymock; + +import org.easymock.*; +import org.junit.*; +import org.junit.runner.RunWith; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; +import static org.junit.Assert.assertEquals; + +@RunWith(EasyMockRunner.class) +public class BaeldungReaderMockSupportUnitTest extends EasyMockSupport { + + @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); + @Mock ArticleReader mockArticleReader; + @Mock IArticleWriter mockArticleWriter; + + @Test + public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + expect(mockArticleWriter.write("title", "content")).andReturn("BAEL-201801"); + replayAll(); + + Exception expectedException = null; + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception exception) { + expectedException = exception; + } + String articleId = baeldungReader.write("title", "content"); + verifyAll(); + assertEquals(NoSuchElementException.class, expectedException.getClass()); + assertEquals("BAEL-201801", articleId); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java old mode 100755 new mode 100644 similarity index 97% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java index 31f6af116c..12fce4b07a --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java @@ -1,105 +1,105 @@ -package com.baeldung.easymock; - -import org.junit.*; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertEquals; - -public class BaeldungReaderUnitTest { - - private BaeldungReader baeldungReader; - - private ArticleReader mockArticleReader; - - private IArticleWriter mockArticleWriter; - - @Test - public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { - mockArticleReader = mock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - - BaeldungArticle article = baeldungReader.readNext(); - verify(mockArticleReader); - assertEquals(null, article); - } - - @Test - public void givenBaeldungReader_whenReadNextAndSkimTopics_thenAllAllowed() { - mockArticleReader = strictMock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - - expect(mockArticleReader.next()).andReturn(null); - expect(mockArticleReader.ofTopic("easymock")).andReturn(null); - replay(mockArticleReader); - - baeldungReader.readNext(); - baeldungReader.readTopic("easymock"); - verify(mockArticleReader); - } - - @Test - public void givenBaeldungReader_whenReadNextAndOthers_thenAllowed() { - mockArticleReader = niceMock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - - baeldungReader.readNext(); - baeldungReader.readTopic("easymock"); - verify(mockArticleReader); - } - - @Test - public void givenBaeldungReader_whenWriteMaliciousContent_thenArgumentIllegal() { - mockArticleWriter = mock(IArticleWriter.class); - baeldungReader = new BaeldungReader(mockArticleWriter); - expect(mockArticleWriter.write("easymock", "")).andThrow(new IllegalArgumentException()); - replay(mockArticleWriter); - - Exception expectedException = null; - try { - baeldungReader.write("easymock", ""); - } catch (Exception exception) { - expectedException = exception; - } - - verify(mockArticleWriter); - assertEquals(IllegalArgumentException.class, expectedException.getClass()); - } - - @Test - public void givenBaeldungReader_whenWrite_thenWriterCalled() { - mockArticleWriter = mock(IArticleWriter.class); - baeldungReader = new BaeldungReader(mockArticleWriter); - expect(mockArticleWriter.write("title", "content")).andReturn(null); - replay(mockArticleWriter); - String articleId = baeldungReader.write("title", "content"); - verify(mockArticleWriter); - assertEquals(null, articleId); - } - - @Test - public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { - ArticleReader mockArticleReader = mock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - replay(mockArticleReader); - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception ignored) { - } - verify(mockArticleReader); - } - +package com.baeldung.easymock; + +import org.junit.*; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; +import static org.junit.Assert.assertEquals; + +public class BaeldungReaderUnitTest { + + private BaeldungReader baeldungReader; + + private ArticleReader mockArticleReader; + + private IArticleWriter mockArticleWriter; + + @Test + public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { + mockArticleReader = mock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + + BaeldungArticle article = baeldungReader.readNext(); + verify(mockArticleReader); + assertEquals(null, article); + } + + @Test + public void givenBaeldungReader_whenReadNextAndSkimTopics_thenAllAllowed() { + mockArticleReader = strictMock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + + expect(mockArticleReader.next()).andReturn(null); + expect(mockArticleReader.ofTopic("easymock")).andReturn(null); + replay(mockArticleReader); + + baeldungReader.readNext(); + baeldungReader.readTopic("easymock"); + verify(mockArticleReader); + } + + @Test + public void givenBaeldungReader_whenReadNextAndOthers_thenAllowed() { + mockArticleReader = niceMock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + + baeldungReader.readNext(); + baeldungReader.readTopic("easymock"); + verify(mockArticleReader); + } + + @Test + public void givenBaeldungReader_whenWriteMaliciousContent_thenArgumentIllegal() { + mockArticleWriter = mock(IArticleWriter.class); + baeldungReader = new BaeldungReader(mockArticleWriter); + expect(mockArticleWriter.write("easymock", "")).andThrow(new IllegalArgumentException()); + replay(mockArticleWriter); + + Exception expectedException = null; + try { + baeldungReader.write("easymock", ""); + } catch (Exception exception) { + expectedException = exception; + } + + verify(mockArticleWriter); + assertEquals(IllegalArgumentException.class, expectedException.getClass()); + } + + @Test + public void givenBaeldungReader_whenWrite_thenWriterCalled() { + mockArticleWriter = mock(IArticleWriter.class); + baeldungReader = new BaeldungReader(mockArticleWriter); + expect(mockArticleWriter.write("title", "content")).andReturn(null); + replay(mockArticleWriter); + String articleId = baeldungReader.write("title", "content"); + verify(mockArticleWriter); + assertEquals(null, articleId); + } + + @Test + public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { + ArticleReader mockArticleReader = mock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + replay(mockArticleReader); + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception ignored) { + } + verify(mockArticleReader); + } + } \ No newline at end of file diff --git a/testing-modules/testing/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java similarity index 59% rename from testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java index 2c5aa2a3ed..ecdc6e441e 100644 --- a/testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java @@ -28,17 +28,4 @@ public class AppManagerUnitTest { Assertions.assertFalse(appManager.managerResponse("Why are you coming late?")); } - - @Test - public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { - final int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); - Assertions.assertEquals(110, response); - } - - @Test - public void givenAppManager_whenPrivateStaticMethod_thenExpectException() { - Assertions.assertThrows(IllegalArgumentException.class, () -> { - Deencapsulation.invoke(AppManager.class, "stringToInteger", "11r"); - }); - } } diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java similarity index 77% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java index 5cde912277..3a30342eb9 100644 --- a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java @@ -1,12 +1,10 @@ package org.baeldung.mocks.jmockit; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; -import org.baeldung.mocks.jmockit.AdvancedCollaborator.InnerAdvancedCollaborator; import org.junit.Test; import org.junit.runner.RunWith; @@ -52,12 +50,6 @@ public class AdvancedCollaboratorIntegrationTest assertEquals(1, coll.i); } - @Test - public void testToCallPrivateMethodsDirectly() { - Object value = Deencapsulation.invoke(mock, "privateMethod"); - assertEquals("default:", value); - } - @Test public void testToSetPrivateFieldDirectly() { Deencapsulation.setField(mock, "privateField", 10); @@ -70,18 +62,6 @@ public class AdvancedCollaboratorIntegrationTest assertEquals(5, value); } - @Test - public void testToCreateNewInstanceDirectly() { - AdvancedCollaborator coll = Deencapsulation.newInstance(AdvancedCollaborator.class, "foo"); - assertEquals(3, coll.i); - } - - @Test - public void testToCreateNewInnerClassInstanceDirectly() { - InnerAdvancedCollaborator innerCollaborator = Deencapsulation.newInnerInstance(InnerAdvancedCollaborator.class, mock); - assertNotNull(innerCollaborator); - } - @Test @SuppressWarnings("unchecked") public void testMultipleInterfacesWholeTest() { diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java similarity index 98% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java index c176cdc182..8b85af6243 100644 --- a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java @@ -3,7 +3,6 @@ package org.baeldung.mocks.jmockit; import mockit.Delegate; import mockit.Expectations; import mockit.Mocked; -import mockit.StrictExpectations; import mockit.Verifications; import mockit.integration.junit4.JMockit; import org.hamcrest.BaseMatcher; @@ -106,7 +105,7 @@ public class ExpectationsIntegrationTest { @Test public void testResultAndReturns(@Mocked ExpectationsCollaborator mock) { - new StrictExpectations() {{ + new Expectations() {{ mock.methodReturnsString(); result = "foo"; result = new Exception(); diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index e15fdb4a37..aad709cfe9 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -14,29 +14,31 @@ + assertion-libraries easy-random gatling groovy-spock junit-5 + junit5-annotations junit5-migration load-testing-comparison mockito mockito-2 + hamcrest mocks mockserver parallel-tests-junit rest-assured rest-testing - selenium-junit-testng spring-testing test-containers - testing testng junit-5-basics easymock junit-5-advanced xmlunit-2 junit-4 + testing-libraries diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java index f60f1764c6..c3f82f0836 100644 --- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java +++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java @@ -1,49 +1,49 @@ -package com.baeldung.restassured; - -public class Odd { - - float price; - int status; - float ck; - String name; - - Odd(float price, int status, float ck, String name) { - this.price = price; - this.status = status; - this.ck = ck; - this.name = name; - } - - public float getPrice() { - return price; - } - - public void setPrice(float price) { - this.price = price; - } - - public int getStatus() { - return status; - } - - public void setStatus(int status) { - this.status = status; - } - - public float getCk() { - return ck; - } - - public void setCk(float ck) { - this.ck = ck; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} +package com.baeldung.restassured; + +public class Odd { + + float price; + int status; + float ck; + String name; + + Odd(float price, int status, float ck, String name) { + this.price = price; + this.status = status; + this.ck = ck; + this.name = name; + } + + public float getPrice() { + return price; + } + + public void setPrice(float price) { + this.price = price; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public float getCk() { + return ck; + } + + public void setCk(float ck) { + this.ck = ck; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java deleted file mode 100644 index 588a1e5d66..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.junit4.runfromjava; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - - -public class FirstUnitTest { - - @Test - public void whenThis_thenThat() { - assertTrue(true); - } - - @Test - public void whenSomething_thenSomething() { - assertTrue(true); - } - - @Test - public void whenSomethingElse_thenSomethingElse() { - assertTrue(true); - } - -} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java deleted file mode 100644 index e2d75021cf..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.junit4.runfromjava; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class SecondUnitTest { - - @Test - public void whenSomething_thenSomething() { - assertTrue(true); - } - - @Test - public void whensomethingElse_thenSomethingElse() { - assertTrue(true); - } -} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java deleted file mode 100644 index 57c505781d..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.junit5.runfromjava; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -class FirstUnitTest { - - @Test - void whenThis_thenThat() { - assertTrue(true); - } - - @Test - void whenSomething_thenSomething() { - assertTrue(true); - } - - @Test - void whenSomethingElse_thenSomethingElse() { - assertTrue(true); - } - -} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java deleted file mode 100644 index fbfb68898b..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.junit5.runfromjava; - -import org.junit.jupiter.api.RepeatedTest; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -class SecondUnitTest { - - @RepeatedTest(10) - void whenSomething_thenSomething() { - assertTrue(true); - } - - @RepeatedTest(5) - void whenSomethingElse_thenSomethingElse() { - assertTrue(true); - } -} diff --git a/testing-modules/selenium-junit-testng/geckodriver.mac b/testing-modules/selenium-junit-testng/geckodriver.mac old mode 100755 new mode 100644 diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml index 6f2700e2df..8a76dc903c 100644 --- a/testing-modules/spring-testing/pom.xml +++ b/testing-modules/spring-testing/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 org.baeldung spring-testing @@ -15,18 +16,26 @@ - org.hamcrest java-hamcrest ${hamcrest.version} + + org.projectlombok + lombok + ${lombok.version} + provided + + org.springframework.boot spring-boot-starter LATEST + + org.springframework.boot spring-boot-starter-test @@ -44,7 +53,7 @@ LATEST - org.springframework + org.springframework spring-webmvc ${spring.version} @@ -64,6 +73,17 @@ ${junit.jupiter.version} test + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + org.awaitility awaitility diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java new file mode 100644 index 0000000000..ab784532a7 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.dirtiescontext; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringDataRestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringDataRestApplication.class, args); + } + +} diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java new file mode 100644 index 0000000000..4d453c5e91 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java @@ -0,0 +1,9 @@ +package com.baeldung.dirtiescontext; + +public class User { + + String firstName; + + String lastName; + +} diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java new file mode 100644 index 0000000000..f4fba1f310 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java @@ -0,0 +1,28 @@ +package com.baeldung.dirtiescontext; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.stereotype.Component; + +import lombok.Getter; + +@Component +public class UserCache { + + @Getter + private Set userList = new HashSet<>(); + + public boolean addUser(String user) { + return userList.add(user); + } + + public boolean removeUser(String user) { + return userList.remove(user); + } + + public void printUserList(String message) { + System.out.println(message + ": " + userList); + } + +} \ No newline at end of file diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java index 0677b05d66..8d4eeb57c4 100644 --- a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java +++ b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java @@ -1,23 +1,23 @@ -package org.baeldung.reflectiontestutils.repository; - -public class Employee { - private Integer id; - private String name; - - public Integer getId() { - return id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - private String employeeToString() { - return "id: " + getId() + "; name: " + getName(); - } - -} +package org.baeldung.reflectiontestutils.repository; + +public class Employee { + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private String employeeToString() { + return "id: " + getId() + "; name: " + getName(); + } + +} diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java index 699ec3236c..d28745e2ab 100644 --- a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java +++ b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java @@ -1,14 +1,14 @@ -package org.baeldung.reflectiontestutils.repository; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class EmployeeService { - @Autowired - private HRService hrService; - - public String findEmployeeStatus(Integer employeeId) { - return "Employee " + employeeId + " status: " + hrService.getEmployeeStatus(employeeId); - } -} +package org.baeldung.reflectiontestutils.repository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class EmployeeService { + @Autowired + private HRService hrService; + + public String findEmployeeStatus(Integer employeeId) { + return "Employee " + employeeId + " status: " + hrService.getEmployeeStatus(employeeId); + } +} diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java index e693aca764..13a5973ee8 100644 --- a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java +++ b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java @@ -1,11 +1,11 @@ -package org.baeldung.reflectiontestutils.repository; - -import org.springframework.stereotype.Component; - -@Component -public class HRService { - - public String getEmployeeStatus(Integer employeeId) { - return "Inactive"; - } -} +package org.baeldung.reflectiontestutils.repository; + +import org.springframework.stereotype.Component; + +@Component +public class HRService { + + public String getEmployeeStatus(Integer employeeId) { + return "Inactive"; + } +} diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java new file mode 100644 index 0000000000..f3e7b8c228 --- /dev/null +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java @@ -0,0 +1,49 @@ +package com.baeldung.dirtiescontext; + +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.MethodMode; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@TestMethodOrder(OrderAnnotation.class) +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = SpringDataRestApplication.class) +class DirtiesContextIntegrationTest { + + @Autowired + protected UserCache userCache; + + @Test + @Order(1) + void addJaneDoeAndPrintCache() { + userCache.addUser("Jane Doe"); + userCache.printUserList("addJaneDoeAndPrintCache"); + } + + @Test + @Order(2) + void printCache() { + userCache.printUserList("printCache"); + } + + @DirtiesContext(methodMode = MethodMode.AFTER_METHOD) + @Test + @Order(3) + void addJohnDoeAndPrintCache() { + userCache.addUser("John Doe"); + userCache.printUserList("addJohnDoeAndPrintCache"); + } + + @Test + @Order(4) + void printCacheAgain() { + userCache.printUserList("printCacheAgain"); + } + +} diff --git a/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java index 64c7ca19ef..36e5428b58 100644 --- a/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java +++ b/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java @@ -1,46 +1,46 @@ -package org.baeldung.reflectiontestutils; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.mock; - -import org.baeldung.reflectiontestutils.repository.Employee; -import org.baeldung.reflectiontestutils.repository.EmployeeService; -import org.baeldung.reflectiontestutils.repository.HRService; -import org.junit.Test; -import org.springframework.test.util.ReflectionTestUtils; - -import static org.mockito.Mockito.when; - -public class ReflectionTestUtilsUnitTest { - - @Test - public void whenNonPublicField_thenReflectionTestUtilsSetField() { - Employee employee = new Employee(); - ReflectionTestUtils.setField(employee, "id", 1); - assertTrue(employee.getId().equals(1)); - - } - - @Test - public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() { - Employee employee = new Employee(); - ReflectionTestUtils.setField(employee, "id", 1); - employee.setName("Smith, John"); - assertTrue(ReflectionTestUtils.invokeMethod(employee, "employeeToString").equals("id: 1; name: Smith, John")); - } - - @Test - public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField() { - Employee employee = new Employee(); - ReflectionTestUtils.setField(employee, "id", 1); - employee.setName("Smith, John"); - - HRService hrService = mock(HRService.class); - when(hrService.getEmployeeStatus(employee.getId())).thenReturn("Active"); - EmployeeService employeeService = new EmployeeService(); - - // Inject mock into the private field - ReflectionTestUtils.setField(employeeService, "hrService", hrService); - assertEquals("Employee " + employee.getId() + " status: Active", employeeService.findEmployeeStatus(employee.getId())); - } -} +package org.baeldung.reflectiontestutils; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; + +import org.baeldung.reflectiontestutils.repository.Employee; +import org.baeldung.reflectiontestutils.repository.EmployeeService; +import org.baeldung.reflectiontestutils.repository.HRService; +import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.mockito.Mockito.when; + +public class ReflectionTestUtilsUnitTest { + + @Test + public void whenNonPublicField_thenReflectionTestUtilsSetField() { + Employee employee = new Employee(); + ReflectionTestUtils.setField(employee, "id", 1); + assertTrue(employee.getId().equals(1)); + + } + + @Test + public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() { + Employee employee = new Employee(); + ReflectionTestUtils.setField(employee, "id", 1); + employee.setName("Smith, John"); + assertTrue(ReflectionTestUtils.invokeMethod(employee, "employeeToString").equals("id: 1; name: Smith, John")); + } + + @Test + public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField() { + Employee employee = new Employee(); + ReflectionTestUtils.setField(employee, "id", 1); + employee.setName("Smith, John"); + + HRService hrService = mock(HRService.class); + when(hrService.getEmployeeStatus(employee.getId())).thenReturn("Active"); + EmployeeService employeeService = new EmployeeService(); + + // Inject mock into the private field + ReflectionTestUtils.setField(employeeService, "hrService", hrService); + assertEquals("Employee " + employee.getId() + " status: Active", employeeService.findEmployeeStatus(employee.getId())); + } +} diff --git a/testing-modules/testing-libraries/README.md b/testing-modules/testing-libraries/README.md new file mode 100644 index 0000000000..7191989224 --- /dev/null +++ b/testing-modules/testing-libraries/README.md @@ -0,0 +1,10 @@ + +## Relevant Articles + +- [Mutation Testing with PITest](http://www.baeldung.com/java-mutation-testing-with-pitest) +- [Intro to JaCoCo](http://www.baeldung.com/jacoco) +- [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline) +- [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support) +- [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave) + + diff --git a/testing-modules/testing-libraries/pom.xml b/testing-modules/testing-libraries/pom.xml new file mode 100644 index 0000000000..7891ebbf6d --- /dev/null +++ b/testing-modules/testing-libraries/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + testing-libraries + testing-libraries + + + com.baeldung + testing-modules + 1.0.0-SNAPSHOT + + + + + com.insightfullogic + lambda-behave + ${lambda-behave.version} + + + info.cukes + cucumber-junit + ${cucumber.version} + test + + + info.cukes + cucumber-java + ${cucumber.version} + test + + + info.cukes + cucumber-java8 + ${cucumber.version} + test + + + + + 0.4 + 1.2.5 + + + + diff --git a/testing-modules/testing/src/main/java/com/baeldung/cucumber/Calculator.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/cucumber/Calculator.java rename to testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/Calculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/lambdabehave/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java rename to testing-modules/testing-libraries/src/main/java/com/baeldung/lambdabehave/Calculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java similarity index 92% rename from testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java rename to testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java index e264a4c759..5e6fb7e4da 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java +++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.mutation; +package com.baeldung.mutation; public class Palindrome { diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java similarity index 91% rename from testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java index 20bd62396c..00f666db2d 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.calculator; +package com.baeldung.calculator; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java similarity index 95% rename from testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java index ef6dff9617..7eda618566 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.calculator; +package com.baeldung.calculator; import com.baeldung.cucumber.Calculator; import cucumber.api.java.Before; diff --git a/testing-modules/testing/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java similarity index 90% rename from testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java index 5321735469..cb4830a6fb 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java @@ -1,11 +1,11 @@ -package com.baeldung.mutation.test; +package com.baeldung.mutation; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; -import com.baeldung.testing.mutation.Palindrome; +import com.baeldung.mutation.Palindrome; public class PalindromeUnitTest { @Test diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java similarity index 86% rename from testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java index 7bf8641ed6..20fd65b02a 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.shopping; +package com.baeldung.shopping; import org.junit.runner.RunWith; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java similarity index 92% rename from testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java index 2c4bf2eeae..c56ec95883 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.shopping; +package com.baeldung.shopping; import static org.junit.Assert.assertEquals; import cucumber.api.java8.En; diff --git a/testing-modules/testing/src/test/resources/features/calculator-scenario-outline.feature b/testing-modules/testing-libraries/src/test/resources/features/calculator-scenario-outline.feature similarity index 100% rename from testing-modules/testing/src/test/resources/features/calculator-scenario-outline.feature rename to testing-modules/testing-libraries/src/test/resources/features/calculator-scenario-outline.feature diff --git a/testing-modules/testing/src/test/resources/features/calculator.feature b/testing-modules/testing-libraries/src/test/resources/features/calculator.feature similarity index 100% rename from testing-modules/testing/src/test/resources/features/calculator.feature rename to testing-modules/testing-libraries/src/test/resources/features/calculator.feature diff --git a/testing-modules/testing/src/test/resources/features/shopping.feature b/testing-modules/testing-libraries/src/test/resources/features/shopping.feature similarity index 100% rename from testing-modules/testing/src/test/resources/features/shopping.feature rename to testing-modules/testing-libraries/src/test/resources/features/shopping.feature diff --git a/testing-modules/testing/README.md b/testing-modules/testing/README.md deleted file mode 100644 index 135ef1054a..0000000000 --- a/testing-modules/testing/README.md +++ /dev/null @@ -1,24 +0,0 @@ -========= - -## Mutation Testing - -### Relevant Articles: -- [Mutation Testing with PITest](http://www.baeldung.com/java-mutation-testing-with-pitest) -- [Intro to JaCoCo](http://www.baeldung.com/jacoco) -- [AssertJ’s Java 8 Features](http://www.baeldung.com/assertJ-java-8-features) -- [AssertJ for Guava](http://www.baeldung.com/assertJ-for-guava) -- [Introduction to AssertJ](http://www.baeldung.com/introduction-to-assertj) -- [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline) -- [Testing with Google Truth](http://www.baeldung.com/google-truth) -- [Testing with JGoTesting](http://www.baeldung.com/jgotesting) -- [Introduction to JUnitParams](http://www.baeldung.com/junit-params) -- [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support) -- [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave) -- [Introduction to Jukito](http://www.baeldung.com/jukito) -- [Custom JUnit 4 Test Runners](http://www.baeldung.com/junit-4-custom-runners) -- [Guide to JSpec](http://www.baeldung.com/jspec) -- [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion) -- [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions) -- [A Guide to JavaFaker](https://www.baeldung.com/java-faker) -- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) -- [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) diff --git a/testing-modules/testing/pom.xml b/testing-modules/testing/pom.xml deleted file mode 100644 index ccfa1070d1..0000000000 --- a/testing-modules/testing/pom.xml +++ /dev/null @@ -1,183 +0,0 @@ - - 4.0.0 - com.baeldung - testing - 0.1-SNAPSHOT - testing - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - com.insightfullogic - lambda-behave - ${lambda-behave.version} - - - org.assertj - assertj-guava - ${assertj-guava.version} - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - info.cukes - cucumber-junit - ${cucumber.version} - test - - - info.cukes - cucumber-java - ${cucumber.version} - test - - - info.cukes - cucumber-java8 - ${cucumber.version} - test - - - org.pitest - pitest-parent - ${pitest.version} - pom - - - com.google.truth - truth - ${truth.version} - - - com.google.truth.extensions - truth-java8-extension - ${truth.version} - test - - - pl.pragmatists - JUnitParams - ${jUnitParams.version} - test - - - org.jgotesting - jgotesting - ${jgotesting.version} - test - - - org.jukito - jukito - ${jukito.version} - test - - - org.javalite - javalite-common - ${javalite.version} - - - com.github.javafaker - javafaker - ${javafaker.version} - - - - - - - org.pitest - pitest-maven - ${pitest.version} - - - com.baeldung.testing.mutation.* - - - com.baeldung.mutation.test.* - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - jacoco-check - - check - - - - - PACKAGE - - - LINE - COVEREDRATIO - 0 - - - - - - - - - - org.assertj - assertj-assertions-generator-maven-plugin - ${assertj-generator.version} - - - com.baeldung.testing.assertj.custom.Person - - - - - - - - 1.2.5 - 1.1.10 - 0.7.7.201606060606 - 21.0 - 3.1.0 - 3.9.0 - 2.1.0 - 0.32 - 1.1.0 - 0.12 - 1.4.13 - 0.4 - 3.0.0 - 1.5 - 0.15 - - - diff --git a/testing-modules/testng/pom.xml b/testing-modules/testng/pom.xml index 8389604717..5d0c9f126b 100644 --- a/testing-modules/testng/pom.xml +++ b/testing-modules/testng/pom.xml @@ -1,48 +1,48 @@ - - - 4.0.0 - testng - 0.1.0-SNAPSHOT - testng - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../ - - - - - - org.testng - testng - ${testng.version} - test - - - - - testng - - - src/main/resources - true - - - - - src/main/resources - true - - - - - - - 6.10 - - + + + 4.0.0 + testng + 0.1.0-SNAPSHOT + testng + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + org.testng + testng + ${testng.version} + test + + + + + testng + + + src/main/resources + true + + + + + src/main/resources + true + + + + + + + 6.10 + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java index 1a0ff190e3..669d6a1a4c 100644 --- a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java +++ b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java @@ -1,67 +1,67 @@ -package com.baeldung.reports; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.ITestContext; -import org.testng.ITestListener; -import org.testng.ITestResult; - -public class CustomisedListener implements ITestListener { - private static final Logger LOGGER = LoggerFactory.getLogger("CUSTOM_LOGS"); - - @Override - public void onFinish(ITestContext context) { - LOGGER.info("PASSED TEST CASES"); - context.getPassedTests() - .getAllResults() - .forEach(result -> { - LOGGER.info(result.getName()); - }); - LOGGER.info("FAILED TEST CASES"); - context.getFailedTests() - .getAllResults() - .forEach(result -> { - LOGGER.info(result.getName()); - }); - LOGGER.info("Test completed on: " + context.getEndDate() - .toString()); - } - - @Override - public void onStart(ITestContext arg0) { - LOGGER.info("Started testing on: " + arg0.getStartDate() - .toString()); - } - - @Override - public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void onTestFailure(ITestResult arg0) { - LOGGER.info("Failed : " + arg0.getName()); - - } - - @Override - public void onTestSkipped(ITestResult arg0) { - LOGGER.info("Skipped Test: " + arg0.getName()); - - } - - @Override - public void onTestStart(ITestResult arg0) { - LOGGER.info("Testing: " + arg0.getName()); - - } - - @Override - public void onTestSuccess(ITestResult arg0) { - long timeTaken = ((arg0.getEndMillis() - arg0.getStartMillis())); - LOGGER.info("Tested: " + arg0.getName() + " Time taken:" + timeTaken + " ms"); - - } - -} +package com.baeldung.reports; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.ITestContext; +import org.testng.ITestListener; +import org.testng.ITestResult; + +public class CustomisedListener implements ITestListener { + private static final Logger LOGGER = LoggerFactory.getLogger("CUSTOM_LOGS"); + + @Override + public void onFinish(ITestContext context) { + LOGGER.info("PASSED TEST CASES"); + context.getPassedTests() + .getAllResults() + .forEach(result -> { + LOGGER.info(result.getName()); + }); + LOGGER.info("FAILED TEST CASES"); + context.getFailedTests() + .getAllResults() + .forEach(result -> { + LOGGER.info(result.getName()); + }); + LOGGER.info("Test completed on: " + context.getEndDate() + .toString()); + } + + @Override + public void onStart(ITestContext arg0) { + LOGGER.info("Started testing on: " + arg0.getStartDate() + .toString()); + } + + @Override + public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void onTestFailure(ITestResult arg0) { + LOGGER.info("Failed : " + arg0.getName()); + + } + + @Override + public void onTestSkipped(ITestResult arg0) { + LOGGER.info("Skipped Test: " + arg0.getName()); + + } + + @Override + public void onTestStart(ITestResult arg0) { + LOGGER.info("Testing: " + arg0.getName()); + + } + + @Override + public void onTestSuccess(ITestResult arg0) { + long timeTaken = ((arg0.getEndMillis() - arg0.getStartMillis())); + LOGGER.info("Tested: " + arg0.getName() + " Time taken:" + timeTaken + " ms"); + + } + +} diff --git a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java index 2c57993e0b..6d53043918 100644 --- a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java +++ b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java @@ -1,111 +1,111 @@ -package com.baeldung.reports; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.*; -import org.testng.xml.XmlSuite; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; - -public class CustomisedReports implements IReporter { - private static final Logger LOGGER = LoggerFactory.getLogger(CustomisedReports.class); - - private static final String ROW_TEMPLATE = "%s%s%s%s%s"; - - public void generateReport(List xmlSuites, List suites, String outputDirectory) { - String reportTemplate = initReportTemplate(); - - final String body = suites - .stream() - .flatMap(suiteToResults()) - .collect(Collectors.joining()); - - saveReportTemplate(outputDirectory, reportTemplate.replaceFirst("", String.format("%s", body))); - } - - private Function> suiteToResults() { - return suite -> suite.getResults().entrySet() - .stream() - .flatMap(resultsToRows(suite)); - } - - private Function, Stream> resultsToRows(ISuite suite) { - return e -> { - ITestContext testContext = e.getValue().getTestContext(); - - Set failedTests = testContext - .getFailedTests() - .getAllResults(); - Set passedTests = testContext - .getPassedTests() - .getAllResults(); - Set skippedTests = testContext - .getSkippedTests() - .getAllResults(); - - String suiteName = suite.getName(); - - return Stream - .of(failedTests, passedTests, skippedTests) - .flatMap(results -> generateReportRows(e.getKey(), suiteName, results).stream()); - }; - } - - private List generateReportRows(String testName, String suiteName, Set allTestResults) { - return allTestResults.stream() - .map(testResultToResultRow(testName, suiteName)) - .collect(toList()); - } - - private Function testResultToResultRow(String testName, String suiteName) { - return testResult -> { - switch (testResult.getStatus()) { - case ITestResult.FAILURE: - return String.format(ROW_TEMPLATE, "danger", suiteName, testName, testResult.getName(), "FAILED", "NA"); - - case ITestResult.SUCCESS: - return String.format(ROW_TEMPLATE, "success", suiteName, testName, testResult.getName(), "PASSED", String.valueOf(testResult.getEndMillis() - testResult.getStartMillis())); - - case ITestResult.SKIP: - return String.format(ROW_TEMPLATE, "warning", suiteName, testName, testResult.getName(), "SKIPPED", "NA"); - - default: - return ""; - } - }; - } - - private String initReportTemplate() { - String template = null; - byte[] reportTemplate; - try { - reportTemplate = Files.readAllBytes(Paths.get("src/test/resources/reportTemplate.html")); - template = new String(reportTemplate, "UTF-8"); - } catch (IOException e) { - LOGGER.error("Problem initializing template", e); - } - return template; - } - - private void saveReportTemplate(String outputDirectory, String reportTemplate) { - new File(outputDirectory).mkdirs(); - try { - PrintWriter reportWriter = new PrintWriter(new BufferedWriter(new FileWriter(new File(outputDirectory, "my-report.html")))); - reportWriter.println(reportTemplate); - reportWriter.flush(); - reportWriter.close(); - } catch (IOException e) { - LOGGER.error("Problem saving template", e); - } - } -} +package com.baeldung.reports; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.*; +import org.testng.xml.XmlSuite; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toList; + +public class CustomisedReports implements IReporter { + private static final Logger LOGGER = LoggerFactory.getLogger(CustomisedReports.class); + + private static final String ROW_TEMPLATE = "%s%s%s%s%s"; + + public void generateReport(List xmlSuites, List suites, String outputDirectory) { + String reportTemplate = initReportTemplate(); + + final String body = suites + .stream() + .flatMap(suiteToResults()) + .collect(Collectors.joining()); + + saveReportTemplate(outputDirectory, reportTemplate.replaceFirst("", String.format("%s", body))); + } + + private Function> suiteToResults() { + return suite -> suite.getResults().entrySet() + .stream() + .flatMap(resultsToRows(suite)); + } + + private Function, Stream> resultsToRows(ISuite suite) { + return e -> { + ITestContext testContext = e.getValue().getTestContext(); + + Set failedTests = testContext + .getFailedTests() + .getAllResults(); + Set passedTests = testContext + .getPassedTests() + .getAllResults(); + Set skippedTests = testContext + .getSkippedTests() + .getAllResults(); + + String suiteName = suite.getName(); + + return Stream + .of(failedTests, passedTests, skippedTests) + .flatMap(results -> generateReportRows(e.getKey(), suiteName, results).stream()); + }; + } + + private List generateReportRows(String testName, String suiteName, Set allTestResults) { + return allTestResults.stream() + .map(testResultToResultRow(testName, suiteName)) + .collect(toList()); + } + + private Function testResultToResultRow(String testName, String suiteName) { + return testResult -> { + switch (testResult.getStatus()) { + case ITestResult.FAILURE: + return String.format(ROW_TEMPLATE, "danger", suiteName, testName, testResult.getName(), "FAILED", "NA"); + + case ITestResult.SUCCESS: + return String.format(ROW_TEMPLATE, "success", suiteName, testName, testResult.getName(), "PASSED", String.valueOf(testResult.getEndMillis() - testResult.getStartMillis())); + + case ITestResult.SKIP: + return String.format(ROW_TEMPLATE, "warning", suiteName, testName, testResult.getName(), "SKIPPED", "NA"); + + default: + return ""; + } + }; + } + + private String initReportTemplate() { + String template = null; + byte[] reportTemplate; + try { + reportTemplate = Files.readAllBytes(Paths.get("src/test/resources/reportTemplate.html")); + template = new String(reportTemplate, "UTF-8"); + } catch (IOException e) { + LOGGER.error("Problem initializing template", e); + } + return template; + } + + private void saveReportTemplate(String outputDirectory, String reportTemplate) { + new File(outputDirectory).mkdirs(); + try { + PrintWriter reportWriter = new PrintWriter(new BufferedWriter(new FileWriter(new File(outputDirectory, "my-report.html")))); + reportWriter.println(reportTemplate); + reportWriter.flush(); + reportWriter.close(); + } catch (IOException e) { + LOGGER.error("Problem saving template", e); + } + } +} diff --git a/testing-modules/testng/src/test/resources/logback.xml b/testing-modules/testng/src/test/resources/logback.xml index 035520aa15..ec0dc2469a 100644 --- a/testing-modules/testng/src/test/resources/logback.xml +++ b/testing-modules/testng/src/test/resources/logback.xml @@ -1,19 +1,19 @@ - - - - - web - %date [%thread] %-5level %logger{36} - %message%n - - - - - - - - - - - - - + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/parametrized_testng.xml b/testing-modules/testng/src/test/resources/parametrized_testng.xml index d3a9a6dc51..1a9266dd59 100644 --- a/testing-modules/testng/src/test/resources/parametrized_testng.xml +++ b/testing-modules/testng/src/test/resources/parametrized_testng.xml @@ -1,13 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/test_group.xml b/testing-modules/testng/src/test/resources/test_group.xml index 3f51c039d6..34a825855c 100644 --- a/testing-modules/testng/src/test/resources/test_group.xml +++ b/testing-modules/testng/src/test/resources/test_group.xml @@ -1,13 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/test_setup.xml b/testing-modules/testng/src/test/resources/test_setup.xml index dea9d9bf5a..8e91349b0a 100644 --- a/testing-modules/testng/src/test/resources/test_setup.xml +++ b/testing-modules/testng/src/test/resources/test_setup.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/test_suite.xml b/testing-modules/testng/src/test/resources/test_suite.xml index 7a01f1af08..8b66799c4e 100644 --- a/testing-modules/testng/src/test/resources/test_suite.xml +++ b/testing-modules/testng/src/test/resources/test_suite.xml @@ -1,13 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/twilio/README.md b/twilio/README.md index 9d230610c7..f298a8b75d 100644 --- a/twilio/README.md +++ b/twilio/README.md @@ -1,5 +1,7 @@ +## Twilio +This module contains articles about Twilio ### Relevant Articles: -- [Sending SMS in Java with Twilio](http://www.baeldung.com/java-sms-twilio) +- [Sending SMS in Java with Twilio](https://www.baeldung.com/java-sms-twilio) diff --git a/twitter4j/README.md b/twitter4j/README.md index 3057c1c4b2..8c9ee92348 100644 --- a/twitter4j/README.md +++ b/twitter4j/README.md @@ -1,3 +1,7 @@ +## Twitter4J + +This module contains articles about Twitter4J + ### Relevant articles -- [Introduction to Twitter4J](http://www.baeldung.com/twitter4j) +- [Introduction to Twitter4J](https://www.baeldung.com/twitter4j) diff --git a/undertow/README.md b/undertow/README.md index 8bfb4832e2..f08c6cdb4d 100644 --- a/undertow/README.md +++ b/undertow/README.md @@ -1,2 +1,6 @@ +## Undertow + +This module contains articles about JBoss Undertow + ### Relevant Articles: -- [Introduction to JBoss Undertow](http://www.baeldung.com/jboss-undertow) +- [Introduction to JBoss Undertow](https://www.baeldung.com/jboss-undertow) diff --git a/vaadin/README.md b/vaadin/README.md index 43d2cc8961..1d570d1f58 100644 --- a/vaadin/README.md +++ b/vaadin/README.md @@ -1,4 +1,4 @@ ## Relevant articles: -- [Introduction to Vaadin](http://www.baeldung.com/vaadin) +- [Introduction to Vaadin](https://www.baeldung.com/vaadin) - [Sample Application with Spring Boot and Vaadin](https://www.baeldung.com/spring-boot-vaadin) diff --git a/vavr/README.md b/vavr/README.md index 266cae91bb..6832f78a62 100644 --- a/vavr/README.md +++ b/vavr/README.md @@ -1,13 +1,13 @@ ### Relevant Articles: -- [Introduction to Vavr](http://www.baeldung.com/vavr) -- [Guide to Try in Vavr](http://www.baeldung.com/vavr-try) -- [Guide to Pattern Matching in Vavr](http://www.baeldung.com/vavr-pattern-matching) -- [Property Testing Example With Vavr](http://www.baeldung.com/vavr-property-testing) -- [Exceptions in Lambda Expression Using Vavr](http://www.baeldung.com/exceptions-using-vavr) -- [Vavr Support in Spring Data](http://www.baeldung.com/spring-vavr) -- [Introduction to Vavr’s Validation API](http://www.baeldung.com/vavr-validation-api) -- [Guide to Collections API in Vavr](http://www.baeldung.com/vavr-collections) -- [Collection Factory Methods for Vavr](http://www.baeldung.com/vavr-collection-factory-methods) -- [Introduction to Future in Vavr](http://www.baeldung.com/vavr-future) -- [Introduction to Vavr’s Either](http://www.baeldung.com/vavr-either) -- [Interoperability Between Java and Vavr](http://www.baeldung.com/java-vavr) +- [Introduction to Vavr](https://www.baeldung.com/vavr) +- [Guide to Try in Vavr](https://www.baeldung.com/vavr-try) +- [Guide to Pattern Matching in Vavr](https://www.baeldung.com/vavr-pattern-matching) +- [Property Testing Example With Vavr](https://www.baeldung.com/vavr-property-testing) +- [Exceptions in Lambda Expression Using Vavr](https://www.baeldung.com/exceptions-using-vavr) +- [Vavr Support in Spring Data](https://www.baeldung.com/spring-vavr) +- [Introduction to Vavr’s Validation API](https://www.baeldung.com/vavr-validation-api) +- [Guide to Collections API in Vavr](https://www.baeldung.com/vavr-collections) +- [Collection Factory Methods for Vavr](https://www.baeldung.com/vavr-collection-factory-methods) +- [Introduction to Future in Vavr](https://www.baeldung.com/vavr-future) +- [Introduction to Vavr’s Either](https://www.baeldung.com/vavr-either) +- [Interoperability Between Java and Vavr](https://www.baeldung.com/java-vavr) diff --git a/vertx-and-rxjava/README.md b/vertx-and-rxjava/README.md index ccd4ce3457..622b80feca 100644 --- a/vertx-and-rxjava/README.md +++ b/vertx-and-rxjava/README.md @@ -1,2 +1,6 @@ +## Vert.x and RxJava + +This module contains articles about RxJava with Vert.x + ### Relevant articles -- [Example of Vertx and RxJava Integration](http://www.baeldung.com/vertx-rx-java) +- [Example of Vertx and RxJava Integration](https://www.baeldung.com/vertx-rx-java) diff --git a/vertx/README.md b/vertx/README.md index e710df362d..9a62c7b5dc 100644 --- a/vertx/README.md +++ b/vertx/README.md @@ -1,3 +1,7 @@ +## Vert.x + +This module contains articles about Vert.x + ### Relevant articles -- [Introduction to Vert.x](http://www.baeldung.com/vertx) +- [Introduction to Vert.x](https://www.baeldung.com/vertx) diff --git a/vertx/pom.xml b/vertx/pom.xml index befd4c45bb..c566681073 100644 --- a/vertx/pom.xml +++ b/vertx/pom.xml @@ -64,9 +64,8 @@
- 3.0.0 - 6.10 - 2.3 + 3.8.1 + 3.2.1 diff --git a/vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java b/vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java deleted file mode 100644 index 40fa6c7220..0000000000 --- a/vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import com.baeldung.rest.RestServiceVerticle; - -import io.vertx.core.Vertx; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.VertxUnitRunner; - -@RunWith(VertxUnitRunner.class) -public class RestServiceVerticleIntegrationTest { - - private Vertx vertx; - - @Before - public void setup(TestContext testContext) { - vertx = Vertx.vertx(); - - vertx.deployVerticle(RestServiceVerticle.class.getName(), testContext.asyncAssertSuccess()); - } - - @After - public void tearDown(TestContext testContext) { - vertx.close(testContext.asyncAssertSuccess()); - } - - @Test - public void givenId_whenReceivedArticle_thenSuccess(TestContext testContext) { - final Async async = testContext.async(); - - vertx.createHttpClient() - .getNow(8080, "localhost", "/api/baeldung/articles/article/12345", response -> { - response.handler(responseBody -> { - testContext.assertTrue(responseBody.toString() - .contains("\"id\" : \"12345\"")); - async.complete(); - }); - }); - } - -} diff --git a/vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java b/vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java new file mode 100644 index 0000000000..aab841f5bb --- /dev/null +++ b/vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung; + +import java.io.IOException; +import java.net.ServerSocket; + +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.baeldung.rest.RestServiceVerticle; + +import io.vertx.core.DeploymentOptions; +import io.vertx.core.Vertx; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.unit.Async; +import io.vertx.ext.unit.TestContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; + +@RunWith(VertxUnitRunner.class) +public class RestServiceVerticleUnitTest { + + private Vertx vertx; + + private int port = 8081; + + @BeforeClass + public static void beforeClass() { + + } + + @Before + public void setup(TestContext testContext) throws IOException { + vertx = Vertx.vertx(); + + // Pick an available and random + ServerSocket socket = new ServerSocket(0); + port = socket.getLocalPort(); + socket.close(); + + DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port", port)); + + vertx.deployVerticle(RestServiceVerticle.class.getName(), options, testContext.asyncAssertSuccess()); + } + + @After + public void tearDown(TestContext testContext) { + vertx.close(testContext.asyncAssertSuccess()); + } + + @Test + public void givenId_whenReceivedArticle_thenSuccess(TestContext testContext) { + final Async async = testContext.async(); + + vertx.createHttpClient() + .getNow(port, "localhost", "/api/baeldung/articles/article/12345", response -> { + response.handler(responseBody -> { + testContext.assertTrue(responseBody.toString() + .contains("\"id\" : \"12345\"")); + async.complete(); + }); + }); + } + +} diff --git a/vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java b/vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java deleted file mode 100644 index 194f403e25..0000000000 --- a/vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung; - -import io.vertx.core.Vertx; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.VertxUnitRunner; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(VertxUnitRunner.class) -public class SimpleServerVerticleIntegrationTest { - private Vertx vertx; - - @Before - public void setup(TestContext testContext) { - vertx = Vertx.vertx(); - - vertx.deployVerticle(SimpleServerVerticle.class.getName(), testContext.asyncAssertSuccess()); - } - - @After - public void tearDown(TestContext testContext) { - vertx.close(testContext.asyncAssertSuccess()); - } - - @Test - public void whenReceivedResponse_thenSuccess(TestContext testContext) { - final Async async = testContext.async(); - - vertx - .createHttpClient() - .getNow(8080, "localhost", "/", - response -> response.handler(responseBody -> { - testContext.assertTrue(responseBody - .toString() - .contains("Welcome")); - async.complete(); - })); - } - -} - diff --git a/vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java b/vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java new file mode 100644 index 0000000000..761577d5f3 --- /dev/null +++ b/vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java @@ -0,0 +1,55 @@ +package com.baeldung; + +import io.vertx.core.DeploymentOptions; +import io.vertx.core.Vertx; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.unit.Async; +import io.vertx.ext.unit.TestContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; + +import java.io.IOException; +import java.net.ServerSocket; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(VertxUnitRunner.class) +public class SimpleServerVerticleUnitTest { + private Vertx vertx; + + private int port = 8081; + + @Before + public void setup(TestContext testContext) throws IOException { + vertx = Vertx.vertx(); + + // Pick an available and random + ServerSocket socket = new ServerSocket(0); + port = socket.getLocalPort(); + socket.close(); + + DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port", port)); + + vertx.deployVerticle(SimpleServerVerticle.class.getName(), options, testContext.asyncAssertSuccess()); + } + + @After + public void tearDown(TestContext testContext) { + vertx.close(testContext.asyncAssertSuccess()); + } + + @Test + public void whenReceivedResponse_thenSuccess(TestContext testContext) { + final Async async = testContext.async(); + + vertx.createHttpClient() + .getNow(port, "localhost", "/", response -> response.handler(responseBody -> { + testContext.assertTrue(responseBody.toString() + .contains("Welcome")); + async.complete(); + })); + } + +} diff --git a/vraptor/README.md b/vraptor/README.md index 0dc531ba8d..037865d934 100644 --- a/vraptor/README.md +++ b/vraptor/README.md @@ -1,18 +1,29 @@ +## VRaptor + +This module contains articles about VRaptor + +### Relevant Article: + +- [Introduction to VRaptor in Java](https://www.baeldung.com/vraptor) + # VRaptor blank project This is a blank project to help you to use VRaptor. You can easily import in you IDE as Maven project. +### Instructions + +After creating your project, you can run it using Tomcat 7 or higher: + +`mvn tomcat7:run` + +Take care to never run `mvn tomcat:run` since that will use Tomcat 6, which isn't compatible with VRaptor. + +### Em Português + Este é um projeto em branco para ajudar você a usar o VRaptor. Você pode facilmente importá-lo na sua IDE favorita como um projeto Maven. Após criar seu projeto você pode rodá-lo com um tomcat7 ou +: -``` -mvn tomcat7:run -``` +`mvn tomcat7:run` Cuidado para *jamais* executar `mvn tomcat:run` pois ele usará um tomcat6 (incompatível). - - -### Relevant Article: - -- [Introduction to VRaptor in Java](http://www.baeldung.com/vraptor) diff --git a/wicket/README.md b/wicket/README.md index e873ee1ba1..65f0db2661 100644 --- a/wicket/README.md +++ b/wicket/README.md @@ -1,8 +1,13 @@ +## Wicket + +This module contains articles about Wicket + +### Relevant Articles + +- [Introduction to the Wicket Framework](https://www.baeldung.com/intro-to-the-wicket-framework) + +### Execution From the same directory where pom.xml is, execute the following command to run the project: -mvn jetty:run - - -###Relevant Articles: -- [Introduction to the Wicket Framework](http://www.baeldung.com/intro-to-the-wicket-framework) +`mvn jetty:run` diff --git a/wildfly/pom.xml b/wildfly/pom.xml new file mode 100644 index 0000000000..bd2c93a633 --- /dev/null +++ b/wildfly/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.springframework + gs-spring-boot-wildfly + 0.1.0 + + war + + + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.boot + spring-boot-starter-test + test + + + javax.servlet + javax.servlet-api + provided + + + + + + 1.8 + + + + + + maven-failsafe-plugin + + + + integration-test + verify + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + jdk.unsupported + + + + + + + diff --git a/wildfly/src/main/java/hello/Application.java b/wildfly/src/main/java/hello/Application.java new file mode 100644 index 0000000000..07b259e3a9 --- /dev/null +++ b/wildfly/src/main/java/hello/Application.java @@ -0,0 +1,40 @@ +package hello; + +import java.util.Arrays; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + @Bean + public CommandLineRunner commandLineRunner(ApplicationContext ctx) { + return args -> { + + System.out.println("Let's inspect the beans provided by Spring Boot:"); + + String[] beanNames = ctx.getBeanDefinitionNames(); + Arrays.sort(beanNames); + for (String beanName : beanNames) { + System.out.println(beanName); + } + + }; + } + +} diff --git a/wildfly/src/main/java/hello/HelloController.java b/wildfly/src/main/java/hello/HelloController.java new file mode 100644 index 0000000000..d9c1069cc5 --- /dev/null +++ b/wildfly/src/main/java/hello/HelloController.java @@ -0,0 +1,14 @@ +package hello; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +public class HelloController { + + @RequestMapping("/") + public String index() { + return "Greetings from Spring Boot!"; + } + +} diff --git a/xml/README.md b/xml/README.md index fb070100db..d1aa3a798b 100644 --- a/xml/README.md +++ b/xml/README.md @@ -1,6 +1,12 @@ +## XML + +This module contains articles about eXtensible Markup Language (XML) + ### Relevant Articles: -- [Intro to XPath with Java](http://www.baeldung.com/java-xpath) -- [Introduction to JiBX](http://www.baeldung.com/jibx) -- [XML Libraries Support in Java](http://www.baeldung.com/java-xml-libraries) -- [DOM parsing with Xerces](http://www.baeldung.com/java-xerces-dom-parsing) +- [Intro to XPath with Java](https://www.baeldung.com/java-xpath) +- [Introduction to JiBX](https://www.baeldung.com/jibx) +- [XML Libraries Support in Java](https://www.baeldung.com/java-xml-libraries) +- [DOM parsing with Xerces](https://www.baeldung.com/java-xerces-dom-parsing) - [Write an org.w3.dom.Document to a File](https://www.baeldung.com/java-write-xml-document-file) +- [Modifying an XML Attribute in Java](https://www.baeldung.com/java-modify-xml-attribute) +- [Convert XML to HTML in Java](https://www.baeldung.com/java-convert-xml-to-html) diff --git a/xml/pom.xml b/xml/pom.xml index 540b1fc03b..bbd607f9b5 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -1,6 +1,6 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 xml 0.1-SNAPSHOT @@ -59,6 +59,16 @@ stax-api ${stax-api.version} + + org.freemarker + freemarker + ${freemarker.version} + + + com.github.spullara.mustache.java + compiler + ${mustache.version} + org.openjdk.jmh @@ -127,25 +137,68 @@ - - xml - - - src/main/resources - true - - - - - maven-compiler-plugin - ${maven-compiler-plugin.version} - - - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - + + xml + + + src/main/resources + true + + + + + + org.jibx + maven-jibx-plugin + + + + + + org.jibx + maven-jibx-plugin + ${maven-jibx-plugin.version} + + src/main/resources + + *-binding.xml + + + template-binding.xml + + src/main/resources + + *-binding.xml + + true + + + + process-classes + process-classes + + bind + + + + process-test-classes + process-test-classes + + test-bind + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + @@ -324,6 +377,8 @@ 2.6.3 5.5.0 1.21 + 2.3.29 + 0.9.6 3.5 2.4 diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java new file mode 100644 index 0000000000..4908c10386 --- /dev/null +++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java @@ -0,0 +1,109 @@ +package com.baeldung.sax; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class SaxParserMain { + public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { + SAXParserFactory factory = SAXParserFactory.newInstance(); + SAXParser saxParser = factory.newSAXParser(); + + BaeldungHandler baeldungHandler = new BaeldungHandler(); + saxParser.parse("xml/src/main/resources/sax/baeldung.xml", baeldungHandler); + System.out.println(baeldungHandler.getWebsite()); + } + + public static class BaeldungHandler extends DefaultHandler { + private static final String ARTICLES = "articles"; + private static final String ARTICLE = "article"; + private static final String TITLE = "title"; + private static final String CONTENT = "content"; + + private Baeldung website; + private String elementValue; + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + elementValue = new String(ch, start, length); + } + + @Override + public void startDocument() throws SAXException { + website = new Baeldung(); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + switch (qName) { + case ARTICLES: + website.setArticleList(new ArrayList<>()); + break; + case ARTICLE: + website.getArticleList().add(new BaeldungArticle()); + } + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + switch (qName) { + case TITLE: + latestArticle().setTitle(elementValue); + break; + case CONTENT: + latestArticle().setContent(elementValue); + break; + } + } + + private BaeldungArticle latestArticle() { + List articleList = website.getArticleList(); + int latestArticleIndex = articleList.size() - 1; + return articleList.get(latestArticleIndex); + } + + public Baeldung getWebsite() { + return website; + } + } + + public static class Baeldung { + private List articleList; + + public void setArticleList(List articleList) { + this.articleList = articleList; + } + + public List getArticleList() { + return this.articleList; + } + } + + public static class BaeldungArticle { + private String title; + private String content; + + public void setTitle(String title) { + this.title = title; + } + + public String getTitle() { + return this.title; + } + + public void setContent(String content) { + this.content = content; + } + + public String getContent() { + return this.content; + } + } +} diff --git a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java new file mode 100644 index 0000000000..9e3b5e8b0f --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java @@ -0,0 +1,74 @@ +package com.baeldung.xml.stax; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.List; +import java.util.ArrayList; + +import javax.xml.stream.events.XMLEvent; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.EndElement; +import javax.xml.stream.events.StartElement; +import javax.xml.namespace.QName; + +public class StaxParser { + + public static List parse(String path) { + List websites = new ArrayList(); + WebSite website = null; + XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); + try { + XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path)); + while (reader.hasNext()) { + XMLEvent nextEvent = reader.nextEvent(); + if (nextEvent.isStartElement()) { + StartElement startElement = nextEvent.asStartElement(); + switch (startElement.getName() + .getLocalPart()) { + case "website": + website = new WebSite(); + Attribute url = startElement.getAttributeByName(new QName("url")); + if (url != null) { + website.setUrl(url.getValue()); + } + break; + case "name": + nextEvent = reader.nextEvent(); + website.setName(nextEvent.asCharacters() + .getData()); + break; + case "category": + nextEvent = reader.nextEvent(); + website.setCategory(nextEvent.asCharacters() + .getData()); + break; + case "status": + nextEvent = reader.nextEvent(); + website.setStatus(nextEvent.asCharacters() + .getData()); + break; + } + } + if (nextEvent.isEndElement()) { + EndElement endElement = nextEvent.asEndElement(); + if (endElement.getName() + .getLocalPart() + .equals("website")) { + websites.add(website); + } + } + } + } catch (XMLStreamException xse) { + System.out.println("XMLStreamException"); + xse.printStackTrace(); + } catch (FileNotFoundException fnfe) { + System.out.println("FileNotFoundException"); + fnfe.printStackTrace(); + } + return websites; + } + +} diff --git a/xml/src/main/java/com/baeldung/xml/stax/WebSite.java b/xml/src/main/java/com/baeldung/xml/stax/WebSite.java new file mode 100644 index 0000000000..8f7782ab91 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/stax/WebSite.java @@ -0,0 +1,40 @@ +package com.baeldung.xml.stax; +public class WebSite { + + private String url; + private String name; + private String category; + private String status; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java new file mode 100644 index 0000000000..04e9b2e8cf --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java @@ -0,0 +1,41 @@ +package com.baeldung.xmlhtml.freemarker; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.TemplateExceptionHandler; + +import javax.xml.stream.XMLStreamException; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; + +public class FreemarkerTransformer { + private StaxTransformer staxTransformer; + private String templateDirectory; + private String templateFile; + + public FreemarkerTransformer(StaxTransformer staxTransformer, String templateDirectory, String templateFile) { + this.staxTransformer = staxTransformer; + this.templateDirectory = templateDirectory; + this.templateFile = templateFile; + } + + public String html() throws IOException, TemplateException { + Configuration cfg = new Configuration(Configuration.VERSION_2_3_29); + cfg.setDirectoryForTemplateLoading(new File(templateDirectory)); + cfg.setDefaultEncoding(StandardCharsets.UTF_8.toString()); + cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + cfg.setLogTemplateExceptions(false); + cfg.setWrapUncheckedExceptions(true); + cfg.setFallbackOnNullLoopVariable(false); + Template temp = cfg.getTemplate(templateFile); + try (Writer output = new StringWriter()) { + temp.process(staxTransformer.getMap(), output); + return output.toString(); + } + } +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java index 02b2577795..2bd6895c52 100644 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java +++ b/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java @@ -2,15 +2,11 @@ package com.baeldung.xmlhtml.helpers; import com.baeldung.xmlhtml.helpers.jaxb.JAXBHelper; -import com.baeldung.xmlhtml.helpers.jaxp.JAXPHelper; -import com.baeldung.xmlhtml.helpers.stax.STAXHelper; +import com.baeldung.xmlhtml.stax.StaxTransformer; public class XMLRunner { public static void doWork() { JAXBHelper.example(); - JAXPHelper.saxParser(); - JAXPHelper.documentBuilder(); - STAXHelper.write(STAXHelper.read()); } } diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java deleted file mode 100644 index e6351c9e22..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.xmlhtml.helpers.jaxp; - -import org.xml.sax.ContentHandler; -import org.xml.sax.Locator; - -import static com.baeldung.xmlhtml.Constants.*; - -public class CustomHandler implements ContentHandler { - - public void startDocument() {} - - public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts) { } - - public void endDocument() { - System.out.println(DOCUMENT_END); - } - - public void endElement(String uri, String localName, String qName) { } - - public void startPrefixMapping(String prefix, String uri) { } - - public void endPrefixMapping(String prefix) { } - - public void setDocumentLocator(Locator locator) { } - - public void characters(char[] ch, int start, int length) { } - - public void ignorableWhitespace(char[] ch, int start, int length) { } - - public void processingInstruction(String target, String data) { } - - public void skippedEntity(String name) { } - -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java deleted file mode 100644 index 3196d543da..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.baeldung.xmlhtml.helpers.jaxp; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.XMLReader; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.File; - -import static com.baeldung.xmlhtml.Constants.*; - -public class JAXPHelper { - - private static void print(Document document) { - NodeList list = document.getChildNodes(); - try { - for (int i = 0; i < list.getLength(); i++) { - Node node = list.item(i); - String message = - node.getNodeType() - + WHITE_SPACE - + node.getNodeName() - + LINE_BREAK; - System.out.println(message); - } - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - } - - public static void saxParser() { - SAXParserFactory spf = SAXParserFactory.newInstance(); - spf.setNamespaceAware(true); - try { - SAXParser saxParser = spf.newSAXParser(); - XMLReader xmlReader = saxParser.getXMLReader(); - xmlReader.setContentHandler(new CustomHandler()); - xmlReader.parse(XML_FILE_IN); - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - } - - public static void documentBuilder() { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - try { - DocumentBuilder db = dbf.newDocumentBuilder(); - Document parsed = db.parse(new File(XML_FILE_IN)); - Element xml = parsed.getDocumentElement(); - - Document doc = db.newDocument(); - Element html = doc.createElement("html"); - Element head = doc.createElement("head"); - html.appendChild(head); - - Element body = doc.createElement("body"); - Element descendantOne = doc.createElement("p"); - descendantOne.setTextContent("descendantOne: " + - xml.getElementsByTagName("descendantOne") - .item(0).getTextContent()); - Element descendantThree = doc.createElement("p"); - descendantThree.setTextContent("descendantThree: " + - xml.getElementsByTagName("descendantThree") - .item(0).getTextContent()); - Element nested = doc.createElement("div"); - nested.appendChild(descendantThree); - - body.appendChild(descendantOne); - body.appendChild(nested); - html.appendChild(body); - doc.appendChild(html); - - TransformerFactory tFactory = TransformerFactory.newInstance(); - tFactory - .newTransformer() - .transform(new DOMSource(doc), new StreamResult(new File(JAXP_FILE_OUT))); - - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java deleted file mode 100644 index a9b9217b6a..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.baeldung.xmlhtml.helpers.stax; - -import com.baeldung.xmlhtml.pojo.stax.Body; -import com.baeldung.xmlhtml.pojo.stax.CustomElement; -import com.baeldung.xmlhtml.pojo.stax.NestedElement; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.XMLStreamWriter; -import java.io.FileInputStream; -import java.io.FileWriter; - -import static com.baeldung.xmlhtml.Constants.*; - -public class STAXHelper { - - private static XMLStreamReader reader() { - XMLStreamReader xmlStreamReader = null; - try { - xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(XML_FILE_IN)); - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - return xmlStreamReader; - } - - private static XMLStreamWriter writer() { - XMLStreamWriter xmlStreamWriter = null; - try { - xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new FileWriter(STAX_FILE_OUT)); - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - return xmlStreamWriter; - } - - public static Body read() { - Body body = new Body(); - try { - XMLStreamReader xmlStreamReader = reader(); - - CustomElement customElement = new CustomElement(); - NestedElement nestedElement = new NestedElement(); - CustomElement child = new CustomElement(); - - while (xmlStreamReader.hasNext()) { - xmlStreamReader.next(); - if (xmlStreamReader.isStartElement()) { - System.out.println(xmlStreamReader.getLocalName()); - if (xmlStreamReader.getLocalName().equals("descendantOne")) { - customElement.setValue(xmlStreamReader.getElementText()); - } - if (xmlStreamReader.getLocalName().equals("descendantThree")) { - child.setValue(xmlStreamReader.getElementText()); - } - } - } - - nestedElement.setCustomElement(child); - body.setCustomElement(customElement); - body.setNestedElement(nestedElement); - - xmlStreamReader.close(); - - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - return body; - } - - public static void write(Body body) { - try { - - XMLStreamWriter xmlStreamWriter = writer(); - xmlStreamWriter.writeStartElement("html"); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeStartElement("head"); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeStartElement("meta"); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeStartElement("body"); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeStartElement("p"); - xmlStreamWriter.writeCharacters("descendantOne: " + body.getCustomElement().getValue()); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeStartElement("div"); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB + TAB); - xmlStreamWriter.writeStartElement("p"); - xmlStreamWriter.writeCharacters(BREAK); - xmlStreamWriter.writeCharacters(TAB + TAB + TAB + TAB + "descendantThree: " + body.getNestedElement().getCustomElement().getValue()); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK); - xmlStreamWriter.writeEndDocument(); - xmlStreamWriter.flush(); - xmlStreamWriter.close(); - - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java new file mode 100644 index 0000000000..3c288122a3 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java @@ -0,0 +1,103 @@ +package com.baeldung.xmlhtml.jaxp; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Map; + +public class JaxpTransformer { + + private Document input; + private DocumentBuilderFactory factory; + + public JaxpTransformer(String resourcePath) throws ParserConfigurationException, IOException, SAXException { + // 1- Build the doc from the XML file + factory = DocumentBuilderFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + input = factory + .newDocumentBuilder() + .parse(resourcePath); + } + + public String html() throws ParserConfigurationException, TransformerException, IOException { + Element xml = input.getDocumentElement(); + Document doc = factory + .newDocumentBuilder() + .newDocument(); + //Build Map + Map map = buildMap(xml); + //Head + Element html = doc.createElement("html"); + html.setAttribute("lang", "en"); + Element head = buildHead(map, doc); + html.appendChild(head); + //Body + Element body = buildBody(map, doc); + html.appendChild(body); + doc.appendChild(html); + return String.format("%n%s", applyTransformation(doc)); + } + + private String applyTransformation(Document doc) throws TransformerException, IOException { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); + try (Writer output = new StringWriter()) { + Transformer transformer = transformerFactory.newTransformer(); + transformer.transform(new DOMSource(doc), new StreamResult(output)); + return output.toString(); + } + } + + private Map buildMap(Element xml) { + Map map = new HashMap<>(); + map.put("heading", xml + .getElementsByTagName("heading") + .item(0) + .getTextContent()); + map.put("from", String.format("from: %s", xml + .getElementsByTagName("from") + .item(0) + .getTextContent())); + map.put("content", xml + .getElementsByTagName("content") + .item(0) + .getTextContent()); + return map; + } + + private Element buildHead(Map map, Document doc) { + Element head = doc.createElement("head"); + Element title = doc.createElement("title"); + title.setTextContent(map.get("heading")); + head.appendChild(title); + return head; + } + + private Element buildBody(Map map, Document doc) { + Element body = doc.createElement("body"); + Element from = doc.createElement("p"); + from.setTextContent(map.get("from")); + Element success = doc.createElement("p"); + success.setTextContent(map.get("content")); + body.appendChild(from); + body.appendChild(success); + return body; + } + +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java new file mode 100644 index 0000000000..88e93463db --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java @@ -0,0 +1,31 @@ +package com.baeldung.xmlhtml.mustache; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +public class MustacheTransformer { + private StaxTransformer staxTransformer; + private String templateFile; + + public MustacheTransformer(StaxTransformer staxTransformer, String templateFile) { + this.staxTransformer = staxTransformer; + this.templateFile = templateFile; + } + + public String html() throws IOException { + MustacheFactory mf = new DefaultMustacheFactory(); + Mustache mustache = mf.compile(templateFile); + try (Writer output = new StringWriter()) { + mustache.execute(output, staxTransformer.getMap()); + output.flush(); + return output.toString(); + } + } +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java b/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java deleted file mode 100644 index 630dfe967f..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.xmlhtml.pojo.stax; - -public class Body { - - private CustomElement customElement; - - public CustomElement getCustomElement() { - return customElement; - } - public void setCustomElement(CustomElement customElement) { - this.customElement = customElement; - } - - private NestedElement nestedElement; - - public NestedElement getNestedElement() { - return nestedElement; - } - public void setNestedElement(NestedElement nestedElement) { - this.nestedElement = nestedElement; - } - -} \ No newline at end of file diff --git a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java b/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java deleted file mode 100644 index 6fc1d7b787..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.xmlhtml.pojo.stax; - -public class CustomElement { - - private String value; - - public String getValue() { - return value; - } - public void setValue(String value) { - this.value = value; - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java b/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java deleted file mode 100644 index 146ee068af..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.xmlhtml.pojo.stax; - -public class NestedElement { - - private CustomElement customElement; - - public CustomElement getCustomElement() { - return customElement; - } - public void setCustomElement(CustomElement customElement) { - this.customElement = customElement; - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java new file mode 100644 index 0000000000..d7762f3c1f --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java @@ -0,0 +1,99 @@ +package com.baeldung.xmlhtml.stax; + +import javax.xml.stream.*; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Map; + +public class StaxTransformer { + + private Map map; + + public StaxTransformer(String resourcePath) throws IOException, XMLStreamException { + XMLInputFactory factory = XMLInputFactory.newInstance(); + factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); + factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); + XMLStreamReader input = null; + try (FileInputStream file = new FileInputStream(resourcePath)) { + input = factory.createXMLStreamReader(file); + map = buildMap(input); + } finally { + if (input != null) { + input.close(); + } + } + } + + public String html() throws XMLStreamException, IOException { + try (Writer output = new StringWriter()) { + XMLStreamWriter writer = XMLOutputFactory + .newInstance() + .createXMLStreamWriter(output); + //Head + writer.writeDTD(""); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("html"); + writer.writeAttribute("lang", "en"); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("head"); + writer.writeCharacters(String.format("%n")); + writer.writeDTD(""); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("title"); + writer.writeCharacters(map.get("heading")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + //Body + writer.writeStartElement("body"); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("p"); + writer.writeCharacters(map.get("from")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("p"); + writer.writeCharacters(map.get("content")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndDocument(); + writer.writeCharacters(String.format("%n")); + writer.flush(); + return output.toString(); + } + } + + private Map buildMap(XMLStreamReader input) throws XMLStreamException { + Map tempMap = new HashMap<>(); + while (input.hasNext()) { + input.next(); + if (input.isStartElement()) { + if (input + .getLocalName() + .equals("heading")) { + tempMap.put("heading", input.getElementText()); + } + if (input + .getLocalName() + .equals("from")) { + tempMap.put("from", String.format("from: %s", input.getElementText())); + } + if (input + .getLocalName() + .equals("content")) { + tempMap.put("content", input.getElementText()); + } + } + } + return tempMap; + } + + public Map getMap() { + return map; + } +} diff --git a/xml/src/main/resources/sax/baeldung.xml b/xml/src/main/resources/sax/baeldung.xml new file mode 100644 index 0000000000..6736d5bdca --- /dev/null +++ b/xml/src/main/resources/sax/baeldung.xml @@ -0,0 +1,16 @@ + + +
+ Parsing an XML File Using SAX Parser + SAX Parser's Lorem ipsum... +
+
+ Parsing an XML File Using DOM Parser + DOM Parser's Lorem ipsum... +
+
+ Parsing an XML File Using StAX Parser + StAX Parser's Lorem ipsum... +
+
+
\ No newline at end of file diff --git a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java new file mode 100644 index 0000000000..333c5619c8 --- /dev/null +++ b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.sax; + +import org.junit.Test; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.*; + +public class SaxParserMainUnitTest { + + @Test + public void givenAProperXMLFile_whenItIsParsed_ThenAnObjectContainsAllItsElements() throws IOException, SAXException, ParserConfigurationException { + SAXParserFactory factory = SAXParserFactory.newInstance(); + SAXParser saxParser = factory.newSAXParser(); + + SaxParserMain.BaeldungHandler baeldungHandler = new SaxParserMain.BaeldungHandler(); + saxParser.parse("src/test/resources/sax/baeldung.xml", baeldungHandler); + + SaxParserMain.Baeldung result = baeldungHandler.getWebsite(); + + assertNotNull(result); + List articles = result.getArticleList(); + + assertNotNull(articles); + assertEquals(3, articles.size()); + + SaxParserMain.BaeldungArticle articleOne = articles.get(0); + assertEquals("Parsing an XML File Using SAX Parser", articleOne.getTitle()); + assertEquals("SAX Parser's Lorem ipsum...", articleOne.getContent()); + + SaxParserMain.BaeldungArticle articleTwo = articles.get(1); + assertEquals("Parsing an XML File Using DOM Parser", articleTwo.getTitle()); + assertEquals("DOM Parser's Lorem ipsum...", articleTwo.getContent()); + + SaxParserMain.BaeldungArticle articleThree = articles.get(2); + assertEquals("Parsing an XML File Using StAX Parser", articleThree.getTitle()); + assertEquals("StAX Parser's Lorem ipsum...", articleThree.getContent()); + } +} diff --git a/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java index 351b8bc437..6c4aa02700 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java @@ -47,7 +47,9 @@ public class Dom4jProcessorUnitTest { String expectedXml = new String(Files.readAllBytes((Paths.get(getClass().getResource("/xml/attribute_expected.xml") .toURI())))); - String result = transformer.modifyAttribute(attribute, oldValue, newValue); + String result = transformer + .modifyAttribute(attribute, oldValue, newValue) + .replaceAll("(?m)^[ \t]*\r?\n", "");//Delete extra spaces added by Java 11 assertThat(result).and(expectedXml) .areSimilar(); diff --git a/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java index 40d0c671e7..0fdfcfeb52 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java @@ -47,7 +47,9 @@ public class JooxProcessorUnitTest { String expectedXml = new String(Files.readAllBytes((Paths.get(getClass().getResource("/xml/attribute_expected.xml") .toURI())))); - String result = transformer.modifyAttribute(attribute, oldValue, newValue); + String result = transformer + .modifyAttribute(attribute, oldValue, newValue) + .replaceAll("(?m)^[ \t]*\r?\n", "");//Delete extra spaces added by Java 11 assertThat(result).and(expectedXml) .areSimilar(); diff --git a/xml/src/test/java/com/baeldung/xml/jibx/CustomerIntegrationTest.java b/xml/src/test/java/com/baeldung/xml/jibx/CustomerUnitTest.java similarity index 94% rename from xml/src/test/java/com/baeldung/xml/jibx/CustomerIntegrationTest.java rename to xml/src/test/java/com/baeldung/xml/jibx/CustomerUnitTest.java index be28dfe00a..9a4b5bc14b 100644 --- a/xml/src/test/java/com/baeldung/xml/jibx/CustomerIntegrationTest.java +++ b/xml/src/test/java/com/baeldung/xml/jibx/CustomerUnitTest.java @@ -11,7 +11,7 @@ import java.io.InputStream; import static junit.framework.Assert.assertEquals; -public class CustomerIntegrationTest { +public class CustomerUnitTest { @Test public void whenUnmarshalXML_ThenFieldsAreMapped() throws JiBXException, FileNotFoundException { @@ -21,7 +21,7 @@ public class CustomerIntegrationTest { InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); - assertEquals("Stefan Jaegar", customer.getPerson().getName()); + assertEquals("Stefan Jaeger", customer.getPerson().getName()); assertEquals("Davos Dorf", customer.getCity()); } diff --git a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java new file mode 100644 index 0000000000..587c2adf3b --- /dev/null +++ b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.xml.stax; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + + +public class StaxParserUnitTest { + + @Test + public void givenWebsitesXML_whenParsed_thenNotNull() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertNotNull(websites); + } + + @Test + public void givenWebsitesXML_whenParsed_thenSizeIsThree() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertEquals(3, websites.size()); + } + + @Test + public void givenWebsitesXML_whenParsed_thenLocalhostExists() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertEquals("Localhost", websites.get(2).getName()); + } +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java new file mode 100644 index 0000000000..c110f88e99 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.xmlhtml.freemarker; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import freemarker.template.TemplateException; +import org.junit.jupiter.api.Test; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FreemarkerTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, URISyntaxException, XMLStreamException, TemplateException { + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + StaxTransformer staxTransformer = new StaxTransformer("src/test/resources/xmlhtml/notification.xml"); + String templateFile = "freemarker.html"; + String templateDirectory = "src/test/resources/templates"; + FreemarkerTransformer transformer = new FreemarkerTransformer(staxTransformer, templateDirectory, templateFile); + + String result = transformer.html(); + + assertThat(result).isEqualTo(expectedHtml); + } + +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java new file mode 100644 index 0000000000..02fc422ee9 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.xmlhtml.jaxp; + +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class JaxpTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, SAXException, ParserConfigurationException, TransformerException, URISyntaxException { + String path = getClass() + .getResource("/xmlhtml/notification.xml") + .toString(); + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + JaxpTransformer transformer = new JaxpTransformer(path); + + String result = transformer + .html() + .replaceAll("(?m)^\\s+", "");//Delete extra spaces added by Java 11 + + assertThat(result).isEqualTo(expectedHtml); + } +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java new file mode 100644 index 0000000000..b53a23d4fb --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.xmlhtml.mustache; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import org.junit.jupiter.api.Test; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MustacheTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, URISyntaxException, XMLStreamException { + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + StaxTransformer staxTransformer = new StaxTransformer("src/test/resources/xmlhtml/notification.xml"); + String templateFile = "src/test/resources/templates/template.mustache"; + MustacheTransformer transformer = new MustacheTransformer(staxTransformer, templateFile); + + String result = transformer.html(); + + assertThat(result).isEqualTo(expectedHtml); + } + +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java new file mode 100644 index 0000000000..0c7329e899 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.xmlhtml.stax; + +import org.junit.jupiter.api.Test; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StaxTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, URISyntaxException, XMLStreamException { + String path = "src/test/resources/xmlhtml/notification.xml"; + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + StaxTransformer transformer = new StaxTransformer(path); + + String result = transformer.html(); + + assertThat(result).isEqualTo(expectedHtml); + } + +} diff --git a/xml/src/test/resources/sax/baeldung.xml b/xml/src/test/resources/sax/baeldung.xml new file mode 100644 index 0000000000..6736d5bdca --- /dev/null +++ b/xml/src/test/resources/sax/baeldung.xml @@ -0,0 +1,16 @@ + + +
+ Parsing an XML File Using SAX Parser + SAX Parser's Lorem ipsum... +
+
+ Parsing an XML File Using DOM Parser + DOM Parser's Lorem ipsum... +
+
+ Parsing an XML File Using StAX Parser + StAX Parser's Lorem ipsum... +
+
+
\ No newline at end of file diff --git a/xml/src/test/resources/templates/freemarker.html b/xml/src/test/resources/templates/freemarker.html new file mode 100644 index 0000000000..15ec7f9fff --- /dev/null +++ b/xml/src/test/resources/templates/freemarker.html @@ -0,0 +1,11 @@ + + + + +${heading} + + +

${from}

+

${content}

+ + diff --git a/xml/src/test/resources/templates/template.mustache b/xml/src/test/resources/templates/template.mustache new file mode 100644 index 0000000000..8c209843e1 --- /dev/null +++ b/xml/src/test/resources/templates/template.mustache @@ -0,0 +1,11 @@ + + + + +{{heading}} + + +

{{from}}

+

{{content}}

+ + diff --git a/xml/src/test/resources/xml/websites.xml b/xml/src/test/resources/xml/websites.xml new file mode 100644 index 0000000000..579c13eb94 --- /dev/null +++ b/xml/src/test/resources/xml/websites.xml @@ -0,0 +1,18 @@ + + + + Baeldung + Online Courses + Online + + + Example + Examples + Offline + + + Localhost + Tests + Offline + + \ No newline at end of file diff --git a/xml/src/test/resources/xmlhtml/notification.html b/xml/src/test/resources/xmlhtml/notification.html new file mode 100644 index 0000000000..4a0ef09c5d --- /dev/null +++ b/xml/src/test/resources/xmlhtml/notification.html @@ -0,0 +1,11 @@ + + + + +Build #7 passed + + +

from: builds@baeldung.com

+

Success: The Jenkins CI build passed

+ + diff --git a/xml/src/test/resources/xmlhtml/notification.xml b/xml/src/test/resources/xmlhtml/notification.xml new file mode 100644 index 0000000000..c3550d6f04 --- /dev/null +++ b/xml/src/test/resources/xmlhtml/notification.xml @@ -0,0 +1,6 @@ + + + builds@baeldung.com + Build #7 passed + Success: The Jenkins CI build passed + \ No newline at end of file diff --git a/xstream/README.md b/xstream/README.md index bf917e81fb..505ce1e2d9 100644 --- a/xstream/README.md +++ b/xstream/README.md @@ -1,6 +1,10 @@ +## XStream + +This module contains articles about XStream + ## Relevant Articles: -- [XStream User Guide: JSON](http://www.baeldung.com/xstream-json-processing) -- [XStream User Guide: Converting XML to Objects](http://www.baeldung.com/xstream-deserialize-xml-to-object) -- [XStream User Guide: Converting Objects to XML](http://www.baeldung.com/xstream-serialize-object-to-xml) +- [XStream User Guide: JSON](https://www.baeldung.com/xstream-json-processing) +- [XStream User Guide: Converting XML to Objects](https://www.baeldung.com/xstream-deserialize-xml-to-object) +- [XStream User Guide: Converting Objects to XML](https://www.baeldung.com/xstream-serialize-object-to-xml) - [Remote Code Execution with XStream](https://www.baeldung.com/java-xstream-remote-code-execution)