diff --git a/.travis.yml b/.travis.yml
index 683422dc97..5e86714a89 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ before_install:
- echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
install: skip
-script: travis_wait 60 mvn -q install -Pdefault-first,default-second
+script: travis_wait 60 mvn -q install -Pdefault-first,default-second -Dgib.enabled=true
sudo: required
diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java
index cb476b9d9e..a50028a9ae 100644
--- a/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java
+++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java
@@ -28,14 +28,14 @@ public class Log {
System.out.println("Had " + count + " commits overall on current branch");
logs = git.log()
- .add(repository.resolve("remotes/origin/testbranch"))
+ .add(repository.resolve(git.getRepository().getFullBranch()))
.call();
count = 0;
for (RevCommit rev : logs) {
System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */);
count++;
}
- System.out.println("Had " + count + " commits overall on test-branch");
+ System.out.println("Had " + count + " commits overall on "+git.getRepository().getFullBranch());
logs = git.log()
.all()
diff --git a/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java b/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java
index ed7168b2c2..ad34890996 100644
--- a/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java
+++ b/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java
@@ -1,3 +1,5 @@
+package com.baeldung.jgit;
+
import com.baeldung.jgit.helper.Helper;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;
diff --git a/algorithms-genetic/README.md b/algorithms-genetic/README.md
index 0f68918fff..39f8d59eee 100644
--- a/algorithms-genetic/README.md
+++ b/algorithms-genetic/README.md
@@ -1,4 +1,6 @@
## Relevant articles:
- [Introduction to Jenetics Library](http://www.baeldung.com/jenetics)
-- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization)
\ No newline at end of file
+- [Ant Colony Optimization](http://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-genetic/pom.xml b/algorithms-genetic/pom.xml
index 2a10a81980..fc6d36dac1 100644
--- a/algorithms-genetic/pom.xml
+++ b/algorithms-genetic/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
algorithms-genetic
0.0.1-SNAPSHOT
-
+ algorithms-genetic
+
com.baeldung
parent-modules
@@ -61,4 +61,5 @@
1.11
-
\ No newline at end of file
+
+
diff --git a/algorithms-genetic/roundUpToHundred/.gitignore b/algorithms-genetic/roundUpToHundred/.gitignore
deleted file mode 100644
index ae3c172604..0000000000
--- a/algorithms-genetic/roundUpToHundred/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
diff --git a/algorithms-genetic/roundUpToHundred/src/com/java/src/RoundUpToHundred.java b/algorithms-genetic/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
deleted file mode 100644
index 6c02a340d3..0000000000
--- a/algorithms-genetic/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.java.src;
-
-import java.util.Scanner;
-
-public class RoundUpToHundred {
-
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- double input = scanner.nextDouble();
- scanner.close();
-
- RoundUpToHundred.round(input);
- }
-
- static long round(double input) {
- long i = (long) Math.ceil(input);
- return ((i + 99) / 100) * 100;
- };
-
-}
diff --git a/algorithms-genetic/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java b/algorithms-genetic/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
deleted file mode 100644
index cb541ad49c..0000000000
--- a/algorithms-genetic/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.java.src;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class RoundUpToHundredTest {
- @Test
- public void givenInput_whenRound_thenRoundUpToTheNearestHundred() {
- assertEquals("Rounded up to hundred", 100, RoundUpToHundred.round(99));
- assertEquals("Rounded up to three hundred ", 300, RoundUpToHundred.round(200.2));
- assertEquals("Returns same rounded value", 400, RoundUpToHundred.round(400));
- }
-}
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
index ce04d26db3..779cb9b970 100644
--- a/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
+++ b/algorithms-genetic/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
@@ -5,7 +5,6 @@ import java.util.Scanner;
import com.baeldung.algorithms.ga.annealing.SimulatedAnnealing;
import com.baeldung.algorithms.ga.ant_colony.AntColonyOptimization;
import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm;
-import com.baeldung.algorithms.slope_one.SlopeOne;
public class RunAlgorithm {
@@ -13,11 +12,8 @@ public class RunAlgorithm {
Scanner in = new Scanner(System.in);
System.out.println("Run algorithm:");
System.out.println("1 - Simulated Annealing");
- System.out.println("2 - Slope One");
- System.out.println("3 - Simple Genetic Algorithm");
- System.out.println("4 - Ant Colony");
- System.out.println("5 - Dijkstra");
- System.out.println("6 - All pairs in an array that add up to a given sum");
+ System.out.println("2 - Simple Genetic Algorithm");
+ System.out.println("3 - Ant Colony");
int decision = in.nextInt();
switch (decision) {
case 1:
@@ -25,19 +21,13 @@ public class RunAlgorithm {
"Optimized distance for travel: " + SimulatedAnnealing.simulateAnnealing(10, 10000, 0.9995));
break;
case 2:
- SlopeOne.slopeOne(3);
- break;
- case 3:
SimpleGeneticAlgorithm ga = new SimpleGeneticAlgorithm();
ga.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111");
break;
- case 4:
+ case 3:
AntColonyOptimization antColony = new AntColonyOptimization(21);
antColony.startAntOptimization();
break;
- case 5:
- System.out.println("Please run the DijkstraAlgorithmTest.");
- break;
default:
System.out.println("Unknown option");
break;
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md
index 9efb2233bf..a04874c4d2 100644
--- a/algorithms-miscellaneous-1/README.md
+++ b/algorithms-miscellaneous-1/README.md
@@ -9,4 +9,5 @@
- [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)
\ No newline at end of file
+- [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)
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-miscellaneous-1/pom.xml
index 16749d452e..5006670dd9 100644
--- a/algorithms-miscellaneous-1/pom.xml
+++ b/algorithms-miscellaneous-1/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
algorithms-miscellaneous-1
0.0.1-SNAPSHOT
-
+ algorithms-miscellaneous-1
+
com.baeldung
parent-modules
@@ -17,6 +17,11 @@
commons-math3
${commons-math3.version}
+
+ com.google.guava
+ guava
+ ${guava.version}
+
commons-codec
commons-codec
@@ -73,6 +78,7 @@
3.6.1
3.9.0
1.11
+ 25.1-jre
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/roundUpToHundred/.gitignore b/algorithms-miscellaneous-1/roundUpToHundred/.gitignore
deleted file mode 100644
index ae3c172604..0000000000
--- a/algorithms-miscellaneous-1/roundUpToHundred/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
diff --git a/algorithms-miscellaneous-1/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java b/algorithms-miscellaneous-1/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
deleted file mode 100644
index cb541ad49c..0000000000
--- a/algorithms-miscellaneous-1/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.java.src;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class RoundUpToHundredTest {
- @Test
- public void givenInput_whenRound_thenRoundUpToTheNearestHundred() {
- assertEquals("Rounded up to hundred", 100, RoundUpToHundred.round(99));
- assertEquals("Rounded up to three hundred ", 300, RoundUpToHundred.round(200.2));
- assertEquals("Returns same rounded value", 400, RoundUpToHundred.round(400));
- }
-}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java
new file mode 100644
index 0000000000..43d2221773
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java
@@ -0,0 +1,63 @@
+package com.baeldung.algorithms.factorial;
+
+import java.math.BigInteger;
+import java.util.stream.LongStream;
+
+import org.apache.commons.math3.util.CombinatoricsUtils;
+
+import com.google.common.math.BigIntegerMath;
+
+public class Factorial {
+
+ public long factorialUsingForLoop(int n) {
+ long fact = 1;
+ for (int i = 2; i <= n; i++) {
+ fact = fact * i;
+ }
+ return fact;
+ }
+
+ public long factorialUsingStreams(int n) {
+ return LongStream.rangeClosed(1, n)
+ .reduce(1, (long x, long y) -> x * y);
+ }
+
+ public long factorialUsingRecursion(int n) {
+ if (n <= 2) {
+ return n;
+ }
+ return n * factorialUsingRecursion(n - 1);
+ }
+
+ private Long[] factorials = new Long[20];
+
+ public long factorialUsingMemoize(int n) {
+
+ if (factorials[n] != null) {
+ return factorials[n];
+ }
+
+ if (n <= 2) {
+ return n;
+ }
+ long nthValue = n * factorialUsingMemoize(n - 1);
+ factorials[n] = nthValue;
+ return nthValue;
+ }
+
+ public BigInteger factorialHavingLargeResult(int n) {
+ BigInteger result = BigInteger.ONE;
+ for (int i = 2; i <= n; i++)
+ result = result.multiply(BigInteger.valueOf(i));
+ return result;
+ }
+
+ public long factorialUsingApacheCommons(int n) {
+ return CombinatoricsUtils.factorial(n);
+ }
+
+ public BigInteger factorialUsingGuava(int n) {
+ return BigIntegerMath.factorial(n);
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
new file mode 100644
index 0000000000..cd1f3e94d5
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
@@ -0,0 +1,54 @@
+package com.baeldung.algorithms.string;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class LongestSubstringNonRepeatingCharacters {
+
+ public static String getUniqueCharacterSubstringBruteForce(String input) {
+ String output = "";
+ for (int start = 0; start < input.length(); start++) {
+ Set visited = new HashSet<>();
+ int end = start;
+ for (; end < input.length(); end++) {
+ char currChar = input.charAt(end);
+ if (visited.contains(currChar)) {
+ break;
+ } else {
+ visited.add(currChar);
+ }
+ }
+ if (output.length() < end - start + 1) {
+ output = input.substring(start, end);
+ }
+ }
+ return output;
+ }
+
+ public static String getUniqueCharacterSubstring(String input) {
+ Map visited = new HashMap<>();
+ String output = "";
+ for (int start = 0, end = 0; end < input.length(); end++) {
+ char currChar = input.charAt(end);
+ if (visited.containsKey(currChar)) {
+ start = Math.max(visited.get(currChar) + 1, start);
+ }
+ if (output.length() < end - start + 1) {
+ output = input.substring(start, end + 1);
+ }
+ visited.put(currChar, end);
+ }
+ return output;
+ }
+
+ public static void main(String[] args) {
+ if(args.length > 0) {
+ System.out.println(getUniqueCharacterSubstring(args[0]));
+ } else {
+ System.err.println("This program expects command-line input. Please try again!");
+ }
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
new file mode 100644
index 0000000000..b3d142eb07
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
@@ -0,0 +1,90 @@
+package com.baeldung.algorithms.string;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class SubstringPalindrome {
+
+ public Set findAllPalindromesUsingCenter(String input) {
+ final Set palindromes = new HashSet<>();
+ if (input == null || input.isEmpty()) {
+ return palindromes;
+ }
+ if (input.length() == 1) {
+ palindromes.add(input);
+ return palindromes;
+ }
+ for (int i = 0; i < input.length(); i++) {
+ palindromes.addAll(findPalindromes(input, i, i + 1));
+ palindromes.addAll(findPalindromes(input, i, i));
+ }
+ return palindromes;
+ }
+
+ private Set findPalindromes(String input, int low, int high) {
+ Set result = new HashSet<>();
+ while (low >= 0 && high < input.length() && input.charAt(low) == input.charAt(high)) {
+ result.add(input.substring(low, high + 1));
+ low--;
+ high++;
+ }
+ return result;
+ }
+
+ public Set findAllPalindromesUsingBruteForceApproach(String input) {
+ Set palindromes = new HashSet<>();
+ if (input == null || input.isEmpty()) {
+ return palindromes;
+ }
+ if (input.length() == 1) {
+ palindromes.add(input);
+ return palindromes;
+ }
+ for (int i = 0; i < input.length(); i++) {
+ for (int j = i + 1; j <= input.length(); j++)
+ if (isPalindrome(input.substring(i, j))) {
+ palindromes.add(input.substring(i, j));
+ }
+ }
+ return palindromes;
+ }
+
+ private boolean isPalindrome(String input) {
+ StringBuilder plain = new StringBuilder(input);
+ StringBuilder reverse = plain.reverse();
+ return (reverse.toString()).equals(input);
+ }
+
+ public Set findAllPalindromesUsingManachersAlgorithm(String input) {
+ Set palindromes = new HashSet<>();
+ String formattedInput = "@" + input + "#";
+ char inputCharArr[] = formattedInput.toCharArray();
+ int max;
+ int radius[][] = new int[2][input.length() + 1];
+ for (int j = 0; j <= 1; j++) {
+ radius[j][0] = max = 0;
+ int i = 1;
+ while (i <= input.length()) {
+ palindromes.add(Character.toString(inputCharArr[i]));
+ while (inputCharArr[i - max - 1] == inputCharArr[i + j + max])
+ max++;
+ radius[j][i] = max;
+ int k = 1;
+ while ((radius[j][i - k] != max - k) && (k < max)) {
+ radius[j][i + k] = Math.min(radius[j][i - k], max - k);
+ k++;
+ }
+ max = Math.max(max - k, 0);
+ i += k;
+ }
+ }
+ for (int i = 1; i <= input.length(); i++) {
+ for (int j = 0; j <= 1; j++) {
+ for (max = radius[j][i]; max > 0; max--) {
+ palindromes.add(input.substring(i - max - 1, max + j + i - 1));
+ }
+ }
+ }
+ return palindromes;
+ }
+}
diff --git a/algorithms-miscellaneous-1/src/main/resources/maze/maze1.txt b/algorithms-miscellaneous-1/src/main/resources/maze/maze1.txt
deleted file mode 100644
index 8b48c325d2..0000000000
--- a/algorithms-miscellaneous-1/src/main/resources/maze/maze1.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-S ########
-# #
-# ### ## #
-# # # #
-# # # # #
-# ## #####
-# # #
-# # # # #
-##### ####
-# # E
-# # # #
-##########
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/src/main/resources/maze/maze2.txt b/algorithms-miscellaneous-1/src/main/resources/maze/maze2.txt
deleted file mode 100644
index df5b6bc66b..0000000000
--- a/algorithms-miscellaneous-1/src/main/resources/maze/maze2.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-S ##########################
-# # # #
-# # #### ############### #
-# # # # # #
-# # #### # # ###############
-# # # # # # #
-# # # #### ### ########### #
-# # # # # #
-# ################## #
-######### # # # # #
-# # #### # ####### # #
-# # ### ### # # # # #
-# # ## # ##### # #
-##### ####### # # # # #
-# # ## ## #### # #
-# ##### ####### # #
-# # ############
-####### ######### # #
-# # ######## #
-# ####### ###### ## # E
-# # # ## #
-############################
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java
new file mode 100644
index 0000000000..c185dba62b
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.algorithms.factorial;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.math.BigInteger;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class FactorialUnitTest {
+
+ Factorial factorial;
+
+ @Before
+ public void setup() {
+ factorial = new Factorial();
+ }
+
+ @Test
+ public void whenCalculatingFactorialUsingForLoop_thenCorrect() {
+ int n = 5;
+
+ assertThat(factorial.factorialUsingForLoop(n)).isEqualTo(120);
+ }
+
+ @Test
+ public void whenCalculatingFactorialUsingStreams_thenCorrect() {
+ int n = 5;
+
+ assertThat(factorial.factorialUsingStreams(n)).isEqualTo(120);
+ }
+
+ @Test
+ public void whenCalculatingFactorialUsingRecursion_thenCorrect() {
+ int n = 5;
+
+ assertThat(factorial.factorialUsingRecursion(n)).isEqualTo(120);
+ }
+
+ @Test
+ public void whenCalculatingFactorialUsingMemoize_thenCorrect() {
+ int n = 5;
+
+ assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(120);
+
+ n = 6;
+
+ assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(720);
+ }
+
+ @Test
+ public void whenCalculatingFactorialHavingLargeResult_thenCorrect() {
+ int n = 22;
+
+ assertThat(factorial.factorialHavingLargeResult(n)).isEqualTo(new BigInteger("1124000727777607680000"));
+ }
+
+ @Test
+ public void whenCalculatingFactorialUsingApacheCommons_thenCorrect() {
+ int n = 5;
+
+ assertThat(factorial.factorialUsingApacheCommons(n)).isEqualTo(120);
+ }
+
+ @Test
+ public void whenCalculatingFactorialUsingGuava_thenCorrect() {
+ int n = 22;
+
+ assertThat(factorial.factorialUsingGuava(n)).isEqualTo(new BigInteger("1124000727777607680000"));
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
new file mode 100644
index 0000000000..9f1e6a2519
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.algorithms.string;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static com.baeldung.algorithms.string.LongestSubstringNonRepeatingCharacters.getUniqueCharacterSubstring;
+import static com.baeldung.algorithms.string.LongestSubstringNonRepeatingCharacters.getUniqueCharacterSubstringBruteForce;
+
+public class LongestSubstringNonRepeatingCharactersUnitTest {
+
+ @Test
+ void givenString_whenGetUniqueCharacterSubstringBruteForceCalled_thenResultFoundAsExpectedUnitTest() {
+ assertEquals("", getUniqueCharacterSubstringBruteForce(""));
+ assertEquals("A", getUniqueCharacterSubstringBruteForce("A"));
+ assertEquals("ABCDEF", getUniqueCharacterSubstringBruteForce("AABCDEF"));
+ assertEquals("ABCDEF", getUniqueCharacterSubstringBruteForce("ABCDEFF"));
+ assertEquals("NGISAWE", getUniqueCharacterSubstringBruteForce("CODINGISAWESOME"));
+ assertEquals("be coding", getUniqueCharacterSubstringBruteForce("always be coding"));
+ }
+
+ @Test
+ void givenString_whenGetUniqueCharacterSubstringCalled_thenResultFoundAsExpectedUnitTest() {
+ assertEquals("", getUniqueCharacterSubstring(""));
+ assertEquals("A", getUniqueCharacterSubstring("A"));
+ assertEquals("ABCDEF", getUniqueCharacterSubstring("AABCDEF"));
+ assertEquals("ABCDEF", getUniqueCharacterSubstring("ABCDEFF"));
+ assertEquals("NGISAWE", getUniqueCharacterSubstring("CODINGISAWESOME"));
+ assertEquals("be coding", getUniqueCharacterSubstring("always be coding"));
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
new file mode 100644
index 0000000000..8d225f67fa
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.algorithms.string;
+
+import static org.junit.Assert.assertEquals;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.Test;
+
+public class SubstringPalindromeUnitTest {
+
+ private static final String INPUT_BUBBLE = "bubble";
+ private static final String INPUT_CIVIC = "civic";
+ private static final String INPUT_INDEED = "indeed";
+ private static final String INPUT_ABABAC = "ababac";
+
+ Set EXPECTED_PALINDROME_BUBBLE = new HashSet() {
+ {
+ add("b");
+ add("u");
+ add("l");
+ add("e");
+ add("bb");
+ add("bub");
+ }
+ };
+
+ Set EXPECTED_PALINDROME_CIVIC = new HashSet() {
+ {
+ add("civic");
+ add("ivi");
+ add("i");
+ add("c");
+ add("v");
+ }
+ };
+
+ Set EXPECTED_PALINDROME_INDEED = new HashSet() {
+ {
+ add("i");
+ add("n");
+ add("d");
+ add("e");
+ add("ee");
+ add("deed");
+ }
+ };
+
+ Set EXPECTED_PALINDROME_ABABAC = new HashSet() {
+ {
+ add("a");
+ add("b");
+ add("c");
+ add("aba");
+ add("bab");
+ add("ababa");
+ }
+ };
+
+ private SubstringPalindrome palindrome = new SubstringPalindrome();
+
+ @Test
+ public void whenUsingManachersAlgorithm_thenFindsAllPalindromes() {
+ assertEquals(EXPECTED_PALINDROME_BUBBLE, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_BUBBLE));
+ assertEquals(EXPECTED_PALINDROME_INDEED, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_INDEED));
+ assertEquals(EXPECTED_PALINDROME_CIVIC, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_CIVIC));
+ assertEquals(EXPECTED_PALINDROME_ABABAC, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_ABABAC));
+ }
+
+ @Test
+ public void whenUsingCenterApproach_thenFindsAllPalindromes() {
+ assertEquals(EXPECTED_PALINDROME_BUBBLE, palindrome.findAllPalindromesUsingCenter(INPUT_BUBBLE));
+ assertEquals(EXPECTED_PALINDROME_INDEED, palindrome.findAllPalindromesUsingCenter(INPUT_INDEED));
+ assertEquals(EXPECTED_PALINDROME_CIVIC, palindrome.findAllPalindromesUsingCenter(INPUT_CIVIC));
+ assertEquals(EXPECTED_PALINDROME_ABABAC, palindrome.findAllPalindromesUsingCenter(INPUT_ABABAC));
+ }
+
+ @Test
+ public void whenUsingBruteForceApproach_thenFindsAllPalindromes() {
+ assertEquals(EXPECTED_PALINDROME_BUBBLE, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_BUBBLE));
+ assertEquals(EXPECTED_PALINDROME_INDEED, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_INDEED));
+ assertEquals(EXPECTED_PALINDROME_CIVIC, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_CIVIC));
+ assertEquals(EXPECTED_PALINDROME_ABABAC, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_ABABAC));
+ }
+}
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 2634fd6b56..d693a44f66 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -10,7 +10,6 @@
- [A Collaborative Filtering Recommendation System in Java](http://www.baeldung.com/java-collaborative-filtering-recommendations)
- [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)
-- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element)
- [An Introduction to the Theory of Big-O Notation](http://www.baeldung.com/big-o-notation)
- [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)
@@ -18,3 +17,4 @@
- [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)
diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-miscellaneous-2/pom.xml
index eeae544612..5461f4ebe1 100644
--- a/algorithms-miscellaneous-2/pom.xml
+++ b/algorithms-miscellaneous-2/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
algorithms-miscellaneous-2
0.0.1-SNAPSHOT
+ algorithms-miscellaneous-2
com.baeldung
@@ -33,6 +33,11 @@
jgrapht-core
${org.jgrapht.core.version}
+
+ org.jgrapht
+ jgrapht-ext
+ ${org.jgrapht.ext.version}
+
pl.allegro.finance
tradukisto
@@ -83,6 +88,7 @@
3.6.1
1.0.1
1.0.1
+ 1.0.1
3.9.0
1.11
diff --git a/algorithms-miscellaneous-2/roundUpToHundred/.gitignore b/algorithms-miscellaneous-2/roundUpToHundred/.gitignore
deleted file mode 100644
index ae3c172604..0000000000
--- a/algorithms-miscellaneous-2/roundUpToHundred/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
diff --git a/algorithms-miscellaneous-2/roundUpToHundred/src/com/java/src/RoundUpToHundred.java b/algorithms-miscellaneous-2/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
deleted file mode 100644
index 6c02a340d3..0000000000
--- a/algorithms-miscellaneous-2/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.java.src;
-
-import java.util.Scanner;
-
-public class RoundUpToHundred {
-
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- double input = scanner.nextDouble();
- scanner.close();
-
- RoundUpToHundred.round(input);
- }
-
- static long round(double input) {
- long i = (long) Math.ceil(input);
- return ((i + 99) / 100) * 100;
- };
-
-}
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
new file mode 100644
index 0000000000..a1a096bc30
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/RunAlgorithm.java
@@ -0,0 +1,28 @@
+package com.baeldung.algorithms;
+
+import java.util.Scanner;
+
+import com.baeldung.algorithms.slope_one.SlopeOne;
+
+public class RunAlgorithm {
+
+ public static void main(String[] args) throws InstantiationException, IllegalAccessException {
+ Scanner in = new Scanner(System.in);
+ System.out.println("1 - Slope One");
+ System.out.println("2 - Dijkstra");
+ int decision = in.nextInt();
+ switch (decision) {
+ case 1:
+ SlopeOne.slopeOne(3);
+ break;
+ case 2:
+ System.out.println("Please run the DijkstraAlgorithmLongRunningUnitTest.");
+ break;
+ default:
+ System.out.println("Unknown option");
+ break;
+ }
+ in.close();
+ }
+
+}
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Dijkstra.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Graph.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/ga/dijkstra/Node.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java
new file mode 100644
index 0000000000..e1c41f9518
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java
@@ -0,0 +1,22 @@
+package com.baeldung.algorithms.mercator;
+
+class EllipticalMercator extends Mercator {
+
+ @Override
+ double yAxisProjection(double input) {
+
+ input = Math.min(Math.max(input, -89.5), 89.5);
+ double earthDimensionalRateNormalized = 1.0 - Math.pow(RADIUS_MINOR / RADIUS_MAJOR, 2);
+
+ double inputOnEarthProj = Math.sqrt(earthDimensionalRateNormalized) * Math.sin( Math.toRadians(input));
+
+ inputOnEarthProj = Math.pow(((1.0 - inputOnEarthProj)/(1.0+inputOnEarthProj)), 0.5 * Math.sqrt(earthDimensionalRateNormalized));
+ double inputOnEarthProjNormalized = Math.tan(0.5 * ((Math.PI*0.5) - Math.toRadians(input)))/inputOnEarthProj;
+ return (-1) * RADIUS_MAJOR * Math.log(inputOnEarthProjNormalized);
+ }
+
+ @Override
+ double xAxisProjection(double input) {
+ return RADIUS_MAJOR * Math.toRadians(input);
+ }
+}
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java
new file mode 100644
index 0000000000..b289b1839d
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java
@@ -0,0 +1,10 @@
+package com.baeldung.algorithms.mercator;
+
+abstract class Mercator {
+ final static double RADIUS_MAJOR = 6378137.0;
+ final static double RADIUS_MINOR = 6356752.3142;
+
+ abstract double yAxisProjection(double input);
+
+ abstract double xAxisProjection(double input);
+}
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java
new file mode 100644
index 0000000000..1be976d82e
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java
@@ -0,0 +1,14 @@
+package com.baeldung.algorithms.mercator;
+
+public class SphericalMercator extends Mercator {
+
+ @Override
+ double xAxisProjection(double input) {
+ return Math.toRadians(input) * RADIUS_MAJOR;
+ }
+
+ @Override
+ double yAxisProjection(double input) {
+ return Math.log(Math.tan(Math.PI / 4 + Math.toRadians(input) / 2)) * RADIUS_MAJOR;
+ }
+}
diff --git a/algorithms-miscellaneous-1/roundUpToHundred/src/com/java/src/RoundUpToHundred.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java
similarity index 90%
rename from algorithms-miscellaneous-1/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java
index 6c02a340d3..333019e294 100644
--- a/algorithms-miscellaneous-1/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
+++ b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java
@@ -1,4 +1,4 @@
-package com.java.src;
+package com.baeldung.algorithms.roundedup;
import java.util.Scanner;
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/InputData.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/InputData.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/InputData.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/Item.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/Item.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/Item.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/SlopeOne.java
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/User.java b/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java
similarity index 100%
rename from algorithms-genetic/src/main/java/com/baeldung/algorithms/slope_one/User.java
rename to algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/slope_one/User.java
diff --git a/algorithms-genetic/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java
similarity index 100%
rename from algorithms-genetic/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java
rename to algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java
new file mode 100644
index 0000000000..96b644c46c
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.algorithms.mercator;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class EllipticalMercatorUnitTest {
+
+ @Test
+ public void giventThatTheInputIs22_whenXAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() {
+ Mercator mercator = new EllipticalMercator();
+ double result = mercator.xAxisProjection(22);
+ Assert.assertEquals(result, 2449028.7974520186, 0.0);
+ }
+
+ @Test
+ public void giventThatTheInputIs44_whenYAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() {
+ Mercator mercator = new EllipticalMercator();
+ double result = mercator.yAxisProjection(44);
+ Assert.assertEquals(result, 5435749.887511954, 0.0);
+ }
+}
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java
new file mode 100644
index 0000000000..348c6ad3e4
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.algorithms.mercator;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SphericalMercatorUnitTest {
+
+ @Test
+ public void giventThatTheInputIs22_whenXAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() {
+ Mercator mercator = new SphericalMercator();
+ double result = mercator.xAxisProjection(22);
+ Assert.assertEquals(result, 2449028.7974520186, 0.0);
+ }
+
+ @Test
+ public void giventThatTheInputIs44_whenYAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() {
+ Mercator mercator = new SphericalMercator();
+ double result = mercator.yAxisProjection(44);
+ Assert.assertEquals(result, 5465442.183322753, 0.0);
+ }
+}
diff --git a/algorithms-miscellaneous-2/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java
similarity index 83%
rename from algorithms-miscellaneous-2/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
rename to algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java
index cb541ad49c..5191d65787 100644
--- a/algorithms-miscellaneous-2/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
+++ b/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java
@@ -1,10 +1,10 @@
-package com.java.src;
+package com.baeldung.algorithms.roundedup;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-public class RoundUpToHundredTest {
+public class RoundUpToHundredUnitTest {
@Test
public void givenInput_whenRound_thenRoundUpToTheNearestHundred() {
assertEquals("Rounded up to hundred", 100, RoundUpToHundred.round(99));
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java b/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java
new file mode 100644
index 0000000000..3b841d574a
--- /dev/null
+++ b/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.jgrapht;
+
+import static org.junit.Assert.assertTrue;
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import org.jgrapht.ext.JGraphXAdapter;
+import org.jgrapht.graph.DefaultDirectedGraph;
+import org.jgrapht.graph.DefaultEdge;
+import org.junit.Before;
+import org.junit.Test;
+import com.mxgraph.layout.mxCircleLayout;
+import com.mxgraph.layout.mxIGraphLayout;
+import com.mxgraph.util.mxCellRenderer;
+
+public class GraphImageGenerationUnitTest {
+ static DefaultDirectedGraph g;
+
+ @Before
+ public void createGraph() throws IOException {
+ File imgFile = new File("src/test/resources/graph.png");
+ imgFile.createNewFile();
+ g = new DefaultDirectedGraph(DefaultEdge.class);
+ String x1 = "x1";
+ String x2 = "x2";
+ String x3 = "x3";
+ g.addVertex(x1);
+ g.addVertex(x2);
+ g.addVertex(x3);
+ g.addEdge(x1, x2);
+ g.addEdge(x2, x3);
+ g.addEdge(x3, x1);
+ }
+
+ @Test
+ public void givenAdaptedGraph_whenWriteBufferedImage_ThenFileShouldExist() throws IOException {
+ JGraphXAdapter graphAdapter = new JGraphXAdapter(g);
+ mxIGraphLayout layout = new mxCircleLayout(graphAdapter);
+ layout.execute(graphAdapter.getDefaultParent());
+ File imgFile = new File("src/test/resources/graph.png");
+ BufferedImage image = mxCellRenderer.createBufferedImage(graphAdapter, null, 2, Color.WHITE, true, null);
+ ImageIO.write(image, "PNG", imgFile);
+ assertTrue(imgFile.exists());
+ }
+}
\ No newline at end of file
diff --git a/algorithms-miscellaneous-2/src/test/resources/graph.png b/algorithms-miscellaneous-2/src/test/resources/graph.png
new file mode 100644
index 0000000000..56995b8dd9
Binary files /dev/null and b/algorithms-miscellaneous-2/src/test/resources/graph.png differ
diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md
index f88b93e25e..36460293b0 100644
--- a/algorithms-sorting/README.md
+++ b/algorithms-sorting/README.md
@@ -4,4 +4,4 @@
- [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)
diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml
index 60ae37f2a4..2aee6e9199 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-sorting/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
algorithms-sorting
0.0.1-SNAPSHOT
+ algorithms-sorting
com.baeldung
diff --git a/algorithms-sorting/roundUpToHundred/.gitignore b/algorithms-sorting/roundUpToHundred/.gitignore
deleted file mode 100644
index ae3c172604..0000000000
--- a/algorithms-sorting/roundUpToHundred/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
diff --git a/algorithms-sorting/roundUpToHundred/src/com/java/src/RoundUpToHundred.java b/algorithms-sorting/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
deleted file mode 100644
index 6c02a340d3..0000000000
--- a/algorithms-sorting/roundUpToHundred/src/com/java/src/RoundUpToHundred.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.java.src;
-
-import java.util.Scanner;
-
-public class RoundUpToHundred {
-
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- double input = scanner.nextDouble();
- scanner.close();
-
- RoundUpToHundred.round(input);
- }
-
- static long round(double input) {
- long i = (long) Math.ceil(input);
- return ((i + 99) / 100) * 100;
- };
-
-}
diff --git a/algorithms-sorting/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java b/algorithms-sorting/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
deleted file mode 100644
index cb541ad49c..0000000000
--- a/algorithms-sorting/roundUpToHundred/src/com/java/src/RoundUpToHundredTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.java.src;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class RoundUpToHundredTest {
- @Test
- public void givenInput_whenRound_thenRoundUpToTheNearestHundred() {
- assertEquals("Rounded up to hundred", 100, RoundUpToHundred.round(99));
- assertEquals("Rounded up to three hundred ", 300, RoundUpToHundred.round(200.2));
- assertEquals("Returns same rounded value", 400, RoundUpToHundred.round(400));
- }
-}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java
index 0deb48b6a0..945b4ffd7e 100644
--- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java
@@ -34,7 +34,7 @@ public class MergeSort {
while (i < left && j < right) {
- if (l[i] < r[j])
+ if (l[i] <= r[j])
a[k++] = l[i++];
else
a[k++] = r[j++];
diff --git a/annotations/annotation-processing/pom.xml b/annotations/annotation-processing/pom.xml
index 8e53334521..d9aca6040d 100644
--- a/annotations/annotation-processing/pom.xml
+++ b/annotations/annotation-processing/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
annotation-processing
-
+ annotation-processing
+
com.baeldung
1.0.0-SNAPSHOT
diff --git a/annotations/annotation-user/pom.xml b/annotations/annotation-user/pom.xml
index 07ea9a5b5a..422cc7f119 100644
--- a/annotations/annotation-user/pom.xml
+++ b/annotations/annotation-user/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
annotation-user
+ annotation-user
annotations
diff --git a/annotations/pom.xml b/annotations/pom.xml
index 2c73d3d91b..6d83f5b057 100644
--- a/annotations/pom.xml
+++ b/annotations/pom.xml
@@ -4,7 +4,8 @@
4.0.0
annotations
pom
-
+ annotations
+
parent-modules
com.baeldung
diff --git a/apache-avro/pom.xml b/apache-avro/pom.xml
index ddf5844271..18f9c34d64 100644
--- a/apache-avro/pom.xml
+++ b/apache-avro/pom.xml
@@ -3,10 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
apache-avro
0.0.1-SNAPSHOT
- Apache Avro
+ apache-avro
UTF-8
diff --git a/apache-bval/pom.xml b/apache-bval/pom.xml
index 5ddb1ecb59..786f587fb1 100644
--- a/apache-bval/pom.xml
+++ b/apache-bval/pom.xml
@@ -4,7 +4,8 @@
apache-bval
apache-bval
0.0.1-SNAPSHOT
-
+ apache-bval
+
com.baeldung
parent-modules
diff --git a/apache-curator/pom.xml b/apache-curator/pom.xml
index ac10811e7a..bcca38b199 100644
--- a/apache-curator/pom.xml
+++ b/apache-curator/pom.xml
@@ -4,6 +4,7 @@
apache-curator
0.0.1-SNAPSHOT
jar
+ apache-curator
com.baeldung
diff --git a/apache-cxf/cxf-aegis/pom.xml b/apache-cxf/cxf-aegis/pom.xml
index b7e9e426a2..1d36178b82 100644
--- a/apache-cxf/cxf-aegis/pom.xml
+++ b/apache-cxf/cxf-aegis/pom.xml
@@ -2,7 +2,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
cxf-aegis
-
+ cxf-aegis
+
com.baeldung
apache-cxf
diff --git a/apache-cxf/cxf-introduction/pom.xml b/apache-cxf/cxf-introduction/pom.xml
index a9e82c16b3..17f03afd25 100644
--- a/apache-cxf/cxf-introduction/pom.xml
+++ b/apache-cxf/cxf-introduction/pom.xml
@@ -4,7 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
cxf-introduction
-
+ cxf-introduction
+
com.baeldung
apache-cxf
diff --git a/apache-cxf/cxf-jaxrs-implementation/pom.xml b/apache-cxf/cxf-jaxrs-implementation/pom.xml
index 89acbdf1bd..03d0f67c90 100644
--- a/apache-cxf/cxf-jaxrs-implementation/pom.xml
+++ b/apache-cxf/cxf-jaxrs-implementation/pom.xml
@@ -4,7 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
cxf-jaxrs-implementation
-
+ cxf-jaxrs-implementation
+
com.baeldung
apache-cxf
diff --git a/apache-cxf/cxf-spring/pom.xml b/apache-cxf/cxf-spring/pom.xml
index 31e75e7cdd..97715af54c 100644
--- a/apache-cxf/cxf-spring/pom.xml
+++ b/apache-cxf/cxf-spring/pom.xml
@@ -3,6 +3,7 @@
4.0.0
cxf-spring
war
+ cxf-spring
com.baeldung
diff --git a/apache-cxf/pom.xml b/apache-cxf/pom.xml
index 8918fd4450..0016f33d70 100644
--- a/apache-cxf/pom.xml
+++ b/apache-cxf/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-cxf
0.0.1-SNAPSHOT
+ apache-cxf
pom
diff --git a/apache-cxf/sse-jaxrs/pom.xml b/apache-cxf/sse-jaxrs/pom.xml
index d4b6c19d03..cb5c96660a 100644
--- a/apache-cxf/sse-jaxrs/pom.xml
+++ b/apache-cxf/sse-jaxrs/pom.xml
@@ -3,8 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
sse-jaxrs
+ sse-jaxrs
pom
diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml
index 0f5406fbc7..c7acf22c32 100644
--- a/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml
+++ b/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml
@@ -3,15 +3,15 @@
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
-
+ sse-jaxrs-client
+ sse-jaxrs-client
+
com.baeldung
sse-jaxrs
0.0.1-SNAPSHOT
- sse-jaxrs-client
-
3.2.0
@@ -21,7 +21,6 @@
org.codehaus.mojo
exec-maven-plugin
- 1.6.0
singleEvent
diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml
index 2e82dc3829..eeb5726ee1 100644
--- a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml
+++ b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml
@@ -3,16 +3,16 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ sse-jaxrs-server
+ sse-jaxrs-server
+ war
+
com.baeldung
sse-jaxrs
0.0.1-SNAPSHOT
- sse-jaxrs-server
- war
-
2.4.2
false
diff --git a/apache-geode/pom.xml b/apache-geode/pom.xml
index a3f6604ac4..738accdcb8 100644
--- a/apache-geode/pom.xml
+++ b/apache-geode/pom.xml
@@ -3,11 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
- com.baeldung
apache-geode
1.0-SNAPSHOT
-
+ apache-geode
+
com.baeldung
parent-modules
diff --git a/apache-opennlp/pom.xml b/apache-opennlp/pom.xml
index 985c9a2df2..6b2e6a9729 100644
--- a/apache-opennlp/pom.xml
+++ b/apache-opennlp/pom.xml
@@ -4,6 +4,7 @@
4.0.0
apache-opennlp
1.0-SNAPSHOT
+ apache-opennlp
jar
diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml
index a1ec626d43..54c3e8e928 100644
--- a/apache-poi/pom.xml
+++ b/apache-poi/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-poi
0.0.1-SNAPSHOT
+ apache-poi
com.baeldung
diff --git a/apache-pulsar/README.md b/apache-pulsar/README.md
new file mode 100644
index 0000000000..2970bc3d88
--- /dev/null
+++ b/apache-pulsar/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Apache Pulsar](https://www.baeldung.com/apache-pulsar)
diff --git a/apache-pulsar/pom.xml b/apache-pulsar/pom.xml
index da004a7638..a4c09586eb 100644
--- a/apache-pulsar/pom.xml
+++ b/apache-pulsar/pom.xml
@@ -1,21 +1,22 @@
- 4.0.0
- com.baeldung.pulsar
- pulsar-java
- 0.0.1
+ 4.0.0
+ com.baeldung.pulsar
+ apache-pulsar
+ 0.0.1
+ apache-pulsar
-
-
- org.apache.pulsar
- pulsar-client
- 2.1.1-incubating
- compile
-
-
-
- 1.8
- 1.8
-
+
+
+ org.apache.pulsar
+ pulsar-client
+ 2.1.1-incubating
+ compile
+
+
+
+ 1.8
+ 1.8
+
diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index 98d9563284..644d70b30a 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -5,7 +5,8 @@
4.0.0
apache-shiro
1.0-SNAPSHOT
-
+ apache-shiro
+
parent-boot-1
com.baeldung
diff --git a/apache-thrift/pom.xml b/apache-thrift/pom.xml
index b22364cb19..ab54fc2cef 100644
--- a/apache-thrift/pom.xml
+++ b/apache-thrift/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-thrift
0.0.1-SNAPSHOT
+ apache-thrift
pom
diff --git a/apache-tika/pom.xml b/apache-tika/pom.xml
index 5a76fdeeda..0399914a5f 100644
--- a/apache-tika/pom.xml
+++ b/apache-tika/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
apache-tika
0.0.1-SNAPSHOT
-
+ apache-tika
+
com.baeldung
parent-modules
diff --git a/apache-zookeeper/pom.xml b/apache-zookeeper/pom.xml
index 0b29186ccc..53e4217358 100644
--- a/apache-zookeeper/pom.xml
+++ b/apache-zookeeper/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-zookeeper
0.0.1-SNAPSHOT
+ apache-zookeeper
jar
diff --git a/asm/pom.xml b/asm/pom.xml
index 5aad2a0e37..e56438c808 100644
--- a/asm/pom.xml
+++ b/asm/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.examples
asm
1.0
+ asm
jar
diff --git a/atomix/pom.xml b/atomix/pom.xml
index f85d2d7484..e50c1d867f 100644
--- a/atomix/pom.xml
+++ b/atomix/pom.xml
@@ -4,7 +4,8 @@
com.atomix.io
atomix
0.0.1-SNAPSHOT
-
+ atomix
+
com.baeldung
parent-modules
diff --git a/axon/pom.xml b/axon/pom.xml
index 915a04feb5..c643ea9e57 100644
--- a/axon/pom.xml
+++ b/axon/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
axon
-
+ axon
+
parent-modules
com.baeldung
diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml
index 9b61aaec3d..98f5f10493 100644
--- a/cas/cas-server/pom.xml
+++ b/cas/cas-server/pom.xml
@@ -3,8 +3,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">
4.0.0
cas-server
- war
1.0
+ cas-server
+ war
parent-boot-1
diff --git a/cdi-portable-extension/flyway-cdi/pom.xml b/cdi-portable-extension/flyway-cdi/pom.xml
deleted file mode 100644
index 9fb781aaab..0000000000
--- a/cdi-portable-extension/flyway-cdi/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
- 4.0.0
-
- flyway-cdi
-
-
- com.baeldung
- cdi-portable-extension
- 1.0-SNAPSHOT
-
-
-
-
- javax.enterprise
- cdi-api
- 2.0.SP1
-
-
- org.flywaydb
- flyway-core
- 5.1.4
-
-
- org.apache.tomcat
- tomcat-jdbc
- 8.5.33
-
-
- javax.annotation
- javax.annotation-api
- 1.3.2
-
-
-
-
diff --git a/cdi-portable-extension/flyway-cdi/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java b/cdi-portable-extension/flyway-cdi/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java
deleted file mode 100644
index a5019b82c1..0000000000
--- a/cdi-portable-extension/flyway-cdi/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.baeldung.cdi.extension;
-
-import org.apache.tomcat.jdbc.pool.DataSource;
-import org.flywaydb.core.Flyway;
-
-import javax.annotation.sql.DataSourceDefinition;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Default;
-import javax.enterprise.inject.literal.InjectLiteral;
-import javax.enterprise.inject.spi.*;
-import javax.enterprise.util.AnnotationLiteral;
-
-
-/**
- * Flyway is now under CDI container like:
- *
- * @ApplicationScoped
- * @FlywayType public class Flyway{
- * @Inject setDataSource(DataSource dataSource){
- * //...
- * }
- * }
- */
-
-public class FlywayExtension implements Extension {
-
- DataSourceDefinition dataSourceDefinition = null;
-
- public void registerFlywayType(@Observes BeforeBeanDiscovery bbdEvent) {
- bbdEvent.addAnnotatedType(Flyway.class, Flyway.class.getName());
- }
-
- public void detectDataSourceDefinition(@Observes @WithAnnotations(DataSourceDefinition.class) ProcessAnnotatedType> patEvent) {
- AnnotatedType at = patEvent.getAnnotatedType();
- dataSourceDefinition = at.getAnnotation(DataSourceDefinition.class);
- }
-
- public void processAnnotatedType(@Observes ProcessAnnotatedType patEvent) {
- patEvent.configureAnnotatedType()
- //Add Scope
- .add(ApplicationScoped.Literal.INSTANCE)
- //Add Qualifier
- .add(new AnnotationLiteral() {
- })
- //Decorate setDataSource(DataSource dataSource){} with @Inject
- .filterMethods(annotatedMethod -> {
- return annotatedMethod.getParameters().size() == 1 &&
- annotatedMethod.getParameters().get(0).getBaseType().equals(javax.sql.DataSource.class);
- })
- .findFirst().get().add(InjectLiteral.INSTANCE);
- }
-
- void afterBeanDiscovery(@Observes AfterBeanDiscovery abdEvent, BeanManager bm) {
- abdEvent.addBean()
- .types(javax.sql.DataSource.class, DataSource.class)
- .qualifiers(new AnnotationLiteral() {}, new AnnotationLiteral() {})
- .scope(ApplicationScoped.class)
- .name(DataSource.class.getName())
- .beanClass(DataSource.class)
- .createWith(creationalContext -> {
- DataSource instance = new DataSource();
- instance.setUrl(dataSourceDefinition.url());
- instance.setDriverClassName(dataSourceDefinition.className());
- return instance;
- });
- }
-
- void runFlywayMigration(@Observes AfterDeploymentValidation adv, BeanManager manager) {
- Flyway flyway = manager.createInstance().select(Flyway.class, new AnnotationLiteral() {}).get();
- flyway.migrate();
- }
-}
diff --git a/cdi-portable-extension/flyway-cdi/src/main/java/com/baeldung/cdi/extension/FlywayType.java b/cdi-portable-extension/flyway-cdi/src/main/java/com/baeldung/cdi/extension/FlywayType.java
deleted file mode 100644
index 7c3a5affa6..0000000000
--- a/cdi-portable-extension/flyway-cdi/src/main/java/com/baeldung/cdi/extension/FlywayType.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.baeldung.cdi.extension;
-
-import javax.inject.Qualifier;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({FIELD, METHOD, PARAMETER, TYPE})
-@Qualifier
-public @interface FlywayType {
-}
\ No newline at end of file
diff --git a/cdi-portable-extension/flyway-cdi/src/main/resources/META-INF/beans.xml b/cdi-portable-extension/flyway-cdi/src/main/resources/META-INF/beans.xml
deleted file mode 100644
index 44959bfa99..0000000000
--- a/cdi-portable-extension/flyway-cdi/src/main/resources/META-INF/beans.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
\ No newline at end of file
diff --git a/cdi-portable-extension/flyway-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/cdi-portable-extension/flyway-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
deleted file mode 100644
index a82dc47714..0000000000
--- a/cdi-portable-extension/flyway-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
+++ /dev/null
@@ -1,2 +0,0 @@
-com.baeldung.cdi.extension.FlywayExtension
-
diff --git a/cdi-portable-extension/main-app/pom.xml b/cdi-portable-extension/main-app/pom.xml
deleted file mode 100644
index fab9b8bf07..0000000000
--- a/cdi-portable-extension/main-app/pom.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
- 4.0.0
-
- main-app
- jar
-
-
- com.baeldung
- cdi-portable-extension
- 1.0-SNAPSHOT
-
-
-
-
-
- javax.enterprise
- cdi-api
- 2.0.SP1
-
-
- org.jboss.weld.se
- weld-se-core
- 3.0.5.Final
- runtime
-
-
-
- com.baeldung
- flyway-cdi
- 1.0-SNAPSHOT
- runtime
-
-
-
- com.h2database
- h2
- 1.4.197
- runtime
-
-
-
- javax.annotation
- javax.annotation-api
- 1.3.2
-
-
-
-
-
\ No newline at end of file
diff --git a/cdi-portable-extension/main-app/src/main/java/com/baeldung/cdi/extension/MainApp.java b/cdi-portable-extension/main-app/src/main/java/com/baeldung/cdi/extension/MainApp.java
deleted file mode 100644
index 1f6c5b43ba..0000000000
--- a/cdi-portable-extension/main-app/src/main/java/com/baeldung/cdi/extension/MainApp.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.baeldung.cdi.extension;
-
-import javax.annotation.sql.DataSourceDefinition;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.se.SeContainer;
-import javax.enterprise.inject.se.SeContainerInitializer;
-
-@ApplicationScoped
-@DataSourceDefinition(name = "ds", className = "org.h2.Driver", url = "jdbc:h2:mem:testdb")
-public class MainApp {
- public static void main(String[] args) {
- SeContainerInitializer initializer = SeContainerInitializer.newInstance();
- try (SeContainer container = initializer.initialize()) {
- }
- }
-}
\ No newline at end of file
diff --git a/cdi-portable-extension/main-app/src/main/resources/META-INF/beans.xml b/cdi-portable-extension/main-app/src/main/resources/META-INF/beans.xml
deleted file mode 100644
index 44959bfa99..0000000000
--- a/cdi-portable-extension/main-app/src/main/resources/META-INF/beans.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
\ No newline at end of file
diff --git a/cdi-portable-extension/main-app/src/main/resources/db/migration/V1__Create_person_table.sql b/cdi-portable-extension/main-app/src/main/resources/db/migration/V1__Create_person_table.sql
deleted file mode 100644
index 6bddc7689e..0000000000
--- a/cdi-portable-extension/main-app/src/main/resources/db/migration/V1__Create_person_table.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-create table PERSON (
- ID int not null,
- NAME varchar(100) not null
-);
diff --git a/cdi-portable-extension/main-app/src/main/resources/db/migration/V2__Add_people.sql b/cdi-portable-extension/main-app/src/main/resources/db/migration/V2__Add_people.sql
deleted file mode 100644
index d8f1d62667..0000000000
--- a/cdi-portable-extension/main-app/src/main/resources/db/migration/V2__Add_people.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-insert into PERSON (ID, NAME) values (1, 'Axel');
-insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
-insert into PERSON (ID, NAME) values (3, 'Ms. Bar');
diff --git a/cdi-portable-extension/pom.xml b/cdi-portable-extension/pom.xml
deleted file mode 100644
index 66913de84d..0000000000
--- a/cdi-portable-extension/pom.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
- 4.0.0
-
- com.baeldung
- cdi-portable-extension
- 1.0-SNAPSHOT
- pom
-
-
- 1.8
- 1.8
-
-
-
- main-app
- flyway-cdi
-
-
-
-
- javax.enterprise
- cdi-api
- 2.0.SP1
-
-
-
-
\ No newline at end of file
diff --git a/cdi/README.md b/cdi/README.md
index 0477ce85bd..bfb635be9e 100644
--- a/cdi/README.md
+++ b/cdi/README.md
@@ -1,3 +1,5 @@
### 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)
+- [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification)
+
diff --git a/cdi/pom.xml b/cdi/pom.xml
index 2c719c1d7f..0cf5062ccc 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -2,10 +2,10 @@
4.0.0
- com.baeldung
cdi
1.0-SNAPSHOT
-
+ cdi
+
com.baeldung
parent-spring-4
@@ -14,6 +14,16 @@
+
+ javax.enterprise
+ cdi-api
+ ${cdi-api.version}
+
+
+ org.jboss.weld.se
+ weld-se-core
+ ${weld-se-core.version}
+
org.hamcrest
hamcrest-core
@@ -42,11 +52,6 @@
aspectjweaver
${aspectjweaver.version}
-
- org.jboss.weld.se
- weld-se-core
- ${weld-se-core.version}
-
org.springframework
spring-test
@@ -54,13 +59,13 @@
test
-
- 1.8.9
- 2.4.1.Final
+ 2.0.SP1
+ 3.0.5.Final
+ 1.9.2
1.3
3.10.0
4.12
+ 5.1.2.RELEASE
-
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
new file mode 100644
index 0000000000..4896408502
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
@@ -0,0 +1,15 @@
+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!"));
+ }
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
new file mode 100644
index 0000000000..a2329d2ef1
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
@@ -0,0 +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;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
new file mode 100644
index 0000000000..f37030778a
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
@@ -0,0 +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!"));
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
new file mode 100644
index 0000000000..34520c2b3d
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
@@ -0,0 +1,12 @@
+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();
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
new file mode 100644
index 0000000000..b3522b2ad0
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
@@ -0,0 +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());
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
new file mode 100644
index 0000000000..47788a0657
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
@@ -0,0 +1,8 @@
+package com.baeldung.cdi.cdi2observers.services;
+
+public class TextService {
+
+ public String parseText(String text) {
+ return text.toUpperCase();
+ }
+}
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
new file mode 100644
index 0000000000..deecf13f9a
--- /dev/null
+++ b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
@@ -0,0 +1,14 @@
+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");
+ }
+}
diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml
index 909250710e..e54c766280 100644
--- a/core-groovy/pom.xml
+++ b/core-groovy/pom.xml
@@ -4,6 +4,7 @@
4.0.0
core-groovy
1.0-SNAPSHOT
+ core-groovy
jar
diff --git a/core-java-10/README.md b/core-java-10/README.md
index 84fa381a26..f0a25712a7 100644
--- a/core-java-10/README.md
+++ b/core-java-10/README.md
@@ -4,3 +4,4 @@
- [Java 10 LocalVariable Type-Inference](http://www.baeldung.com/java-10-local-variable-type-inference)
- [Guide to Java 10](http://www.baeldung.com/java-10-overview)
- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another)
+- [Deep Dive Into the New Java JIT Compiler – Graal](https://www.baeldung.com/graal-java-jit-compiler)
diff --git a/core-java-11/src/main/java/com/baeldung/add b/core-java-11/src/main/java/com/baeldung/add
new file mode 100755
index 0000000000..539c1a43d4
--- /dev/null
+++ b/core-java-11/src/main/java/com/baeldung/add
@@ -0,0 +1,12 @@
+#!/usr/local/bin/java --source 11
+
+import java.util.Arrays;
+
+public class Addition
+{
+ public static void main(String[] args) {
+ System.out.println(Arrays.stream(args)
+ .mapToInt(Integer::parseInt)
+ .sum());
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/README.md b/core-java-8/README.md
index ffd629a170..6786b29120 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -33,3 +33,4 @@
- [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)
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
new file mode 100644
index 0000000000..d84182aec6
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
@@ -0,0 +1,5 @@
+package com.baeldung.interfaces.multiinheritance;
+
+public abstract interface Fly{
+ void fly();
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
new file mode 100644
index 0000000000..a18bbafdc1
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
@@ -0,0 +1,5 @@
+package com.baeldung.interfaces.multiinheritance;
+
+public interface Transform {
+ void transform();
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
new file mode 100644
index 0000000000..fb0d36e3e0
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
@@ -0,0 +1,13 @@
+package com.baeldung.interfaces.multiinheritance;
+
+public class Vehicle implements Fly, Transform {
+ @Override
+ public void fly() {
+ System.out.println("I can Fly!!");
+ }
+
+ @Override
+ public void transform() {
+ System.out.println("I can Transform!!");
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
new file mode 100644
index 0000000000..bf0e613567
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
@@ -0,0 +1,21 @@
+package com.baeldung.interfaces.polymorphysim;
+
+public class Circle implements Shape {
+
+ private double radius;
+
+ public Circle(double radius){
+ this.radius = radius;
+ }
+
+ @Override
+ public String name() {
+ return "Circle";
+ }
+
+ @Override
+ public double area() {
+ return Math.PI * (radius * radius);
+ }
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java
new file mode 100644
index 0000000000..2cf4fafee1
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java
@@ -0,0 +1,22 @@
+package com.baeldung.interfaces.polymorphysim;
+
+import java.util.ArrayList;
+
+public class DisplayShape {
+
+ private ArrayList shapes;
+
+ public DisplayShape() {
+ shapes = new ArrayList<>();
+ }
+
+ public void add(Shape shape) {
+ shapes.add(shape);
+ }
+
+ public void display() {
+ for (Shape shape : shapes) {
+ System.out.println(shape.name() + " area: " + shape.area());
+ }
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java
new file mode 100644
index 0000000000..cc43c1300b
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java
@@ -0,0 +1,15 @@
+package com.baeldung.interfaces.polymorphysim;
+
+public class MainPolymorphic {
+ public static void main(String[] args){
+
+ Shape circleShape = new Circle(2);
+ Shape squareShape = new Square(2);
+
+ DisplayShape displayShape = new DisplayShape();
+ displayShape.add(circleShape);
+ displayShape.add(squareShape);
+
+ displayShape.display();
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
new file mode 100644
index 0000000000..fcb0c65e7b
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
@@ -0,0 +1,6 @@
+package com.baeldung.interfaces.polymorphysim;
+
+public interface Shape {
+ public abstract String name();
+ public abstract double area();
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
new file mode 100644
index 0000000000..9c440150b5
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
@@ -0,0 +1,20 @@
+package com.baeldung.interfaces.polymorphysim;
+
+public class Square implements Shape {
+
+ private double width;
+
+ public Square(double width) {
+ this.width = width;
+ }
+
+ @Override
+ public String name() {
+ return "Square";
+ }
+
+ @Override
+ public double area() {
+ return width * width;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
new file mode 100644
index 0000000000..279a3b2c55
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
@@ -0,0 +1,17 @@
+package com.baeldung.reducingIfElse;
+
+public class AddCommand implements Command {
+
+ private int a;
+ private int b;
+
+ public AddCommand(int a, int b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ @Override
+ public Integer execute() {
+ return a + b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java
new file mode 100644
index 0000000000..f24c973ead
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java
@@ -0,0 +1,21 @@
+package com.baeldung.reducingIfElse;
+
+public class AddRule implements Rule {
+
+ private int result;
+
+ @Override
+ public boolean evaluate(Expression expression) {
+ boolean evalResult = false;
+ if (expression.getOperator() == Operator.ADD) {
+ this.result = expression.getX() + expression.getY();
+ evalResult = true;
+ }
+ return evalResult;
+ }
+
+ @Override
+ public Result getResult() {
+ return new Result(result);
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java
new file mode 100644
index 0000000000..3174ea558c
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java
@@ -0,0 +1,8 @@
+package com.baeldung.reducingIfElse;
+
+public class Addition implements Operation {
+ @Override
+ public int apply(int a, int b) {
+ return a + b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java
new file mode 100644
index 0000000000..550d92e183
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java
@@ -0,0 +1,83 @@
+package com.baeldung.reducingIfElse;
+
+public class Calculator {
+
+ public int calculate(int a, int b, String operator) {
+ int result = Integer.MIN_VALUE;
+
+ if ("add".equals(operator)) {
+ result = a + b;
+ } else if ("multiply".equals(operator)) {
+ result = a * b;
+ } else if ("divide".equals(operator)) {
+ result = a / b;
+ } else if ("subtract".equals(operator)) {
+ result = a - b;
+ } else if ("modulo".equals(operator)) {
+ result = a % b;
+ }
+ return result;
+ }
+
+ public int calculateUsingSwitch(int a, int b, String operator) {
+ int result = 0;
+ switch (operator) {
+ case "add":
+ result = a + b;
+ break;
+ case "multiply":
+ result = a * b;
+ break;
+ case "divide":
+ result = a / b;
+ break;
+ case "subtract":
+ result = a - b;
+ break;
+ case "modulo":
+ result = a % b;
+ break;
+ default:
+ result = Integer.MIN_VALUE;
+ }
+ return result;
+ }
+
+ public int calculateUsingSwitch(int a, int b, Operator operator) {
+ int result = 0;
+ switch (operator) {
+ case ADD:
+ result = a + b;
+ break;
+ case MULTIPLY:
+ result = a * b;
+ break;
+ case DIVIDE:
+ result = a / b;
+ break;
+ case SUBTRACT:
+ result = a - b;
+ break;
+ case MODULO:
+ result = a % b;
+ break;
+ default:
+ result = Integer.MIN_VALUE;
+ }
+ return result;
+ }
+
+ public int calculate(int a, int b, Operator operator) {
+ return operator.apply(a, b);
+ }
+
+ public int calculateUsingFactory(int a, int b, String operation) {
+ Operation targetOperation = OperatorFactory.getOperation(operation)
+ .orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
+ return targetOperation.apply(a, b);
+ }
+
+ public int calculate(Command command) {
+ return command.execute();
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java
new file mode 100644
index 0000000000..c084fcc6a0
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java
@@ -0,0 +1,5 @@
+package com.baeldung.reducingIfElse;
+
+public interface Command {
+ Integer execute();
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java
new file mode 100644
index 0000000000..75b1297655
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Division implements Operation {
+ @Override public int apply(int a, int b) {
+ return a / b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java
new file mode 100644
index 0000000000..4d3fe1b824
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java
@@ -0,0 +1,26 @@
+package com.baeldung.reducingIfElse;
+
+public class Expression {
+
+ private Integer x;
+ private Integer y;
+ private Operator operator;
+
+ public Expression(Integer x, Integer y, Operator operator) {
+ this.x = x;
+ this.y = y;
+ this.operator = operator;
+ }
+
+ public Integer getX() {
+ return x;
+ }
+
+ public Integer getY() {
+ return y;
+ }
+
+ public Operator getOperator() {
+ return operator;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java
new file mode 100644
index 0000000000..a7a081704c
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Modulo implements Operation {
+ @Override public int apply(int a, int b) {
+ return a % b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
new file mode 100644
index 0000000000..e1a39b33c4
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Multiplication implements Operation {
+ @Override public int apply(int a, int b) {
+ return 0;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java
new file mode 100644
index 0000000000..41241fa810
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java
@@ -0,0 +1,5 @@
+package com.baeldung.reducingIfElse;
+
+public interface Operation {
+ int apply(int a, int b);
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java
new file mode 100644
index 0000000000..831b8fa146
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java
@@ -0,0 +1,41 @@
+package com.baeldung.reducingIfElse;
+
+public enum Operator {
+
+ ADD {
+ @Override
+ public int apply(int a, int b) {
+ return a + b;
+ }
+ },
+
+ MULTIPLY {
+ @Override
+ public int apply(int a, int b) {
+ return a * b;
+ }
+ },
+
+ SUBTRACT {
+ @Override
+ public int apply(int a, int b) {
+ return a - b;
+ }
+ },
+
+ DIVIDE {
+ @Override
+ public int apply(int a, int b) {
+ return a / b;
+ }
+ },
+
+ MODULO {
+ @Override
+ public int apply(int a, int b) {
+ return a % b;
+ }
+ };
+
+ public abstract int apply(int a, int b);
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
new file mode 100644
index 0000000000..18ed63adbd
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
@@ -0,0 +1,21 @@
+package com.baeldung.reducingIfElse;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+public class OperatorFactory {
+
+ static Map operationMap = new HashMap<>();
+ static {
+ operationMap.put("add", new Addition());
+ operationMap.put("divide", new Division());
+ operationMap.put("multiply", new Multiplication());
+ operationMap.put("subtract", new Subtraction());
+ operationMap.put("modulo", new Modulo());
+ }
+
+ public static Optional getOperation(String operation) {
+ return Optional.ofNullable(operationMap.get(operation));
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java
new file mode 100644
index 0000000000..d5ed12202e
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java
@@ -0,0 +1,13 @@
+package com.baeldung.reducingIfElse;
+
+public class Result {
+ int value;
+
+ public Result(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java
new file mode 100644
index 0000000000..5a6c84b0f9
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java
@@ -0,0 +1,8 @@
+package com.baeldung.reducingIfElse;
+
+public interface Rule {
+
+ boolean evaluate(Expression expression);
+
+ Result getResult();
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
new file mode 100644
index 0000000000..ac56915dee
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
@@ -0,0 +1,24 @@
+package com.baeldung.reducingIfElse;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class RuleEngine {
+
+ private static List rules = new ArrayList<>();
+
+ static {
+ rules.add(new AddRule());
+ }
+
+ public Result process(Expression expression) {
+
+ Rule rule = rules.stream()
+ .filter(r -> r.evaluate(expression))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule"));
+ return rule.getResult();
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
new file mode 100644
index 0000000000..948998810e
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Subtraction implements Operation {
+ @Override public int apply(int a, int b) {
+ return a - b;
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java
new file mode 100644
index 0000000000..7ded5e6621
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.interfaces;
+
+import com.baeldung.interfaces.polymorphysim.Circle;
+import com.baeldung.interfaces.polymorphysim.Shape;
+import com.baeldung.interfaces.polymorphysim.Square;
+import org.assertj.core.api.Assertions;
+import org.junit.Test;
+
+public class PolymorphysimUnitTest {
+
+ @Test
+ public void whenInterfacePointsToCircle_CircleAreaMethodisBeingCalled(){
+ double expectedArea = 12.566370614359172;
+ Shape circle = new Circle(2);
+ double actualArea = circle.area();
+ Assertions.assertThat(actualArea).isEqualTo(expectedArea);
+ }
+
+ @Test
+ public void whenInterfacePointsToSquare_SquareAreaMethodisBeingCalled(){
+ double expectedArea = 4;
+ Shape square = new Square(2);
+ double actualArea = square.area();
+ Assertions.assertThat(actualArea).isEqualTo(expectedArea);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java b/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
new file mode 100644
index 0000000000..fa351930d8
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.reduceIfelse;
+
+import com.baeldung.reducingIfElse.AddCommand;
+import com.baeldung.reducingIfElse.Calculator;
+import com.baeldung.reducingIfElse.Operator;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CalculatorUnitTest {
+
+ @Test
+ public void whenCalculateUsingStringOperator_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculate(3, 4, "add");
+ assertEquals(7, result);
+ }
+
+ @Test
+ public void whenCalculateUsingEnumOperator_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculate(3, 4, Operator.valueOf("ADD"));
+ assertEquals(7, result);
+ }
+
+ @Test
+ public void whenCalculateUsingCommand_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculate(new AddCommand(3, 7));
+ assertEquals(10, result);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java b/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
new file mode 100644
index 0000000000..4a30b3efac
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.reduceIfelse;
+
+import com.baeldung.reducingIfElse.Expression;
+import com.baeldung.reducingIfElse.Operator;
+import com.baeldung.reducingIfElse.Result;
+import com.baeldung.reducingIfElse.RuleEngine;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class RuleEngineUnitTest {
+
+ @Test
+ public void whenNumbersGivenToRuleEngine_thenReturnCorrectResult() {
+ Expression expression = new Expression(5, 5, Operator.ADD);
+ RuleEngine engine = new RuleEngine();
+ Result result = engine.process(expression);
+
+ assertNotNull(result);
+ assertEquals(10, result.getValue());
+ }
+}
diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml
index f22d0a3ed9..cd1fa74dbb 100644
--- a/core-java-9/pom.xml
+++ b/core-java-9/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-9
0.2-SNAPSHOT
core-java-9
diff --git a/core-java-arrays/.gitignore b/core-java-arrays/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-arrays/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-arrays/README.md b/core-java-arrays/README.md
new file mode 100644
index 0000000000..56110585ac
--- /dev/null
+++ b/core-java-arrays/README.md
@@ -0,0 +1,15 @@
+=========
+
+## Core Java Arrays Cookbooks and Examples
+
+### 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)
+- [Jagged 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)
+- [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)
diff --git a/core-java-arrays/pom.xml b/core-java-arrays/pom.xml
new file mode 100644
index 0000000000..d2d0453e87
--- /dev/null
+++ b/core-java-arrays/pom.xml
@@ -0,0 +1,412 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-arrays
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-arrays
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator-annprocess.version}
+
+
+ org.springframework
+ spring-web
+ ${springframework.spring-web.version}
+
+
+
+
+ core-java-arrays
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+ ${onejar-maven-plugin.version}
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-maven-plugin.version}
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ 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}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+ buildAgentLoader
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agentLoader
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/AgentLoader.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildApplication
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ application
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/MyAtm.class
+ com/baeldung/instrumentation/application/MyAtmApplication.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildAgent
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agent
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/agent/AtmTransformer.class
+ com/baeldung/instrumentation/agent/MyInstrumentationAgent.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.8.1
+ 1.16.12
+
+ 1.19
+ 1.19
+
+
+ 3.10.0
+
+
+ 2.21.0
+ 4.3.4.RELEASE
+ 3.0.0-M1
+ 3.0.2
+ 1.4.4
+ 3.1.1
+ 2.0.3.RELEASE
+ 1.6.0
+
+
+
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java
similarity index 97%
rename from core-java/src/main/java/com/baeldung/array/ArrayInitializer.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java
index 0ba6c342d9..d2b0428904 100644
--- a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java
+++ b/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java
@@ -2,7 +2,7 @@ package com.baeldung.array;
import java.util.Arrays;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
public class ArrayInitializer {
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/ArrayInverter.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
diff --git a/core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java b/core-java-arrays/src/main/java/com/baeldung/array/Find2ndLargestInArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/Find2ndLargestInArray.java
diff --git a/core-java/src/main/java/com/baeldung/array/FindElementInArray.java b/core-java-arrays/src/main/java/com/baeldung/array/FindElementInArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/FindElementInArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/FindElementInArray.java
diff --git a/core-java/src/main/java/com/baeldung/array/JaggedArray.java b/core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/JaggedArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java
diff --git a/core-java/src/main/java/com/baeldung/array/SearchArrayUnitTest.java b/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/SearchArrayUnitTest.java
rename to core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java
diff --git a/core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java b/core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java
diff --git a/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
new file mode 100644
index 0000000000..d8cc0afd61
--- /dev/null
+++ b/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
@@ -0,0 +1,211 @@
+package com.baeldung.array.operations;
+
+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.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
+ public static T getFirstObject(T[] array) {
+ return array[0];
+ }
+
+ public static int getFirstInt(int[] array) {
+ return array[0];
+ }
+
+ public static T getLastObject(T[] array) {
+ return array[array.length - 1];
+ }
+
+ public static int getLastInt(int[] array) {
+ return array[array.length - 1];
+ }
+
+ // Append a new item to an array
+ public static T[] appendObject(T[] array, T newItem) {
+ return ArrayUtils.add(array, newItem);
+ }
+
+ public static int[] appendInt(int[] array, int newItem) {
+ int[] newArray = Arrays.copyOf(array, array.length + 1);
+ newArray[newArray.length - 1] = newItem;
+ return newArray;
+ }
+
+ public static int[] appendIntWithUtils(int[] array, int newItem) {
+ return ArrayUtils.add(array, newItem);
+ }
+
+ // Compare two arrays to check if they have the same elements
+ public static boolean compareObjectArrays(T[] array1, T[] array2) {
+ return Arrays.equals(array1, array2);
+ }
+
+ public static boolean compareIntArrays(int[] array1, int[] array2) {
+ return Arrays.equals(array1, array2);
+ }
+
+ // Deep Compare (for nested arrays)
+ public static boolean deepCompareObjectArrayUsingArrays(T[][] array1, T[][] array2) {
+ // We can use Objects.deepEquals for a broader approach
+ return Arrays.deepEquals(array1, array2);
+ }
+
+ public static boolean deepCompareIntArrayUsingArrays(int[][] array1, int[][] array2) {
+ return Arrays.deepEquals(array1, array2);
+ }
+
+ // Check if array is empty
+ public static boolean isEmptyObjectArrayUsingUtils(T[] array1) {
+ return ArrayUtils.isEmpty(array1);
+ }
+
+ public static boolean isEmptyIntArrayUsingUtils(int[] array1) {
+ return ArrayUtils.isEmpty(array1);
+ }
+
+ // Remove duplicates
+ public static Integer[] removeDuplicateObjects(Integer[] array) {
+ // We can use other ways of converting the array to a set too
+ Set set = new HashSet<>(Arrays.asList(array));
+ return set.toArray(new Integer[set.size()]);
+ }
+
+ public static int[] removeDuplicateInts(int[] array) {
+ // Box
+ Integer[] list = ArrayUtils.toObject(array);
+ // Remove duplicates
+ Set set = new HashSet(Arrays.asList(list));
+ // Create array and unbox
+ return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
+ }
+
+ // Remove duplicates preserving the order
+ public static Integer[] removeDuplicateWithOrderObjectArray(Integer[] array) {
+ // We can use other ways of converting the array to a set too
+ Set set = new LinkedHashSet<>(Arrays.asList(array));
+ return set.toArray(new Integer[set.size()]);
+ }
+
+ public static int[] removeDuplicateWithOrderIntArray(int[] array) {
+ // Box
+ Integer[] list = ArrayUtils.toObject(array);
+ // Remove duplicates
+ Set set = new LinkedHashSet(Arrays.asList(list));
+ // Create array and unbox
+ return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
+ }
+
+ // Print an array
+ public static String printObjectArray(Integer[] array) {
+ return ArrayUtils.toString(array);
+ }
+
+ public static String printObjectArray(Integer[][] array) {
+ return ArrayUtils.toString(array);
+ }
+
+ public static String printIntArray(int[] array) {
+ return ArrayUtils.toString(array);
+ }
+
+ public static String printIntArray(int[][] array) {
+ return ArrayUtils.toString(array);
+ }
+
+ // Box or Unbox values
+ public static int[] unboxIntegerArray(Integer[] array) {
+ return ArrayUtils.toPrimitive(array);
+ }
+
+ public static Integer[] boxIntArray(int[] array) {
+ return ArrayUtils.toObject(array);
+ }
+
+ // Map array values
+ @SuppressWarnings("unchecked")
+ public static U[] mapObjectArray(T[] array, Function function, Class targetClazz) {
+ U[] newArray = (U[]) Array.newInstance(targetClazz, array.length);
+ for (int i = 0; i < array.length; i++) {
+ newArray[i] = function.apply(array[i]);
+ }
+ return newArray;
+ }
+
+ public static String[] mapIntArrayToString(int[] array) {
+ return Arrays.stream(array)
+ .mapToObj(value -> String.format("Value: %s", value))
+ .toArray(String[]::new);
+ }
+
+ // Filter array values
+ public static Integer[] filterObjectArray(Integer[] array, Predicate predicate) {
+ return Arrays.stream(array)
+ .filter(predicate)
+ .toArray(Integer[]::new);
+ }
+
+ public static int[] filterIntArray(int[] array, IntPredicate predicate) {
+ return Arrays.stream(array)
+ .filter(predicate)
+ .toArray();
+ }
+
+ // Insert item between others
+ public static int[] insertBetweenIntArray(int[] array, int... values) {
+ return ArrayUtils.insert(2, array, values);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static T[] insertBetweenObjectArray(T[] array, T... values) {
+ return ArrayUtils.insert(2, array, values);
+ }
+
+ // Shuffling arrays
+ public static int[] shuffleIntArray(int[] array) {
+ // we create a different array instance for testing purposes
+ int[] shuffled = Arrays.copyOf(array, array.length);
+ ArrayUtils.shuffle(shuffled);
+ return shuffled;
+ }
+
+ public static T[] shuffleObjectArray(T[] array) {
+ // we create a different array instance for testing purposes
+ T[] shuffled = Arrays.copyOf(array, array.length);
+ ArrayUtils.shuffle(shuffled);
+ return shuffled;
+ }
+
+ // Get random number
+ public static int getRandomFromIntArray(int[] array) {
+ return array[new Random().nextInt(array.length)];
+ }
+
+ public static T getRandomFromObjectArray(T[] array) {
+ return array[new Random().nextInt(array.length)];
+ }
+
+ public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b){
+ return Stream.of(a).filter(Arrays.asList(b)::contains).toArray(Integer[]::new);
+ }
+
+ public static Integer[] intersectionSet(final Integer[] a, final Integer[] b){
+ return Stream.of(a).filter(Arrays.asList(b)::contains).distinct().toArray(Integer[]::new);
+ }
+
+ public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b){
+ return Stream.of(a).filter(new LinkedList<>(Arrays.asList(b))::remove).toArray(Integer[]::new);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/arraycopy/model/Address.java b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/arraycopy/model/Address.java
rename to core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java
diff --git a/core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java
rename to core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java
diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java
diff --git a/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
new file mode 100644
index 0000000000..a9c6d97d9f
--- /dev/null
+++ b/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
@@ -0,0 +1,365 @@
+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;
+
+public class ArrayOperationsUnitTest {
+
+ private Integer[] defaultObjectArray;
+ private int[] defaultIntArray;
+ private Integer[][] defaultJaggedObjectArray;
+ private int[][] defaultJaggedIntArray;
+
+ @BeforeEach
+ public void setupDefaults() {
+ defaultObjectArray = new Integer[] { 3, 5, 2, 5, 14, 4 };
+ defaultIntArray = new int[] { 3, 5, 2, 5, 14, 4 };
+ defaultJaggedObjectArray = new Integer[][] { { 1, 3 }, { 5 }, {} };
+ defaultJaggedIntArray = new int[][] { { 1, 3 }, { 5 }, {} };
+ }
+
+ // Get the first and last item of an array
+ @Test
+ public void whenGetFirstObjectCalled_thenReturnFirstItemOfArray() {
+ Integer output = ArrayOperations.getFirstObject(defaultObjectArray);
+
+ assertThat(output).isEqualTo(3);
+ }
+
+ @Test
+ public void whenGetFirstIntCalled_thenReturnFirstItemOfArray() {
+ int output = ArrayOperations.getFirstInt(defaultIntArray);
+
+ assertThat(output).isEqualTo(3);
+ }
+
+ @Test
+ public void whenGetLastObjectCalled_thenReturnLastItemOfArray() {
+ Integer output = ArrayOperations.getLastObject(defaultObjectArray);
+
+ assertThat(output).isEqualTo(4);
+ }
+
+ @Test
+ public void whenGetLastIntCalled_thenReturnLastItemOfArray() {
+ int output = ArrayOperations.getLastInt(defaultIntArray);
+
+ assertThat(output).isEqualTo(4);
+ }
+
+ // Append a new item to an array
+ @Test
+ public void whenAppendObject_thenReturnArrayWithExtraItem() {
+ Integer[] output = ArrayOperations.appendObject(defaultObjectArray, 7);
+
+ assertThat(output).endsWith(4, 7)
+ .hasSize(7);
+ }
+
+ @Test
+ public void whenAppendInt_thenReturnArrayWithExtraItem() {
+ int[] output = ArrayOperations.appendInt(defaultIntArray, 7);
+ int[] outputUsingUtils = ArrayOperations.appendIntWithUtils(defaultIntArray, 7);
+
+ assertThat(output).endsWith(4, 7)
+ .hasSize(7);
+ assertThat(outputUsingUtils).endsWith(4, 7)
+ .hasSize(7);
+ }
+
+ // Compare two arrays to check if they have the same elements
+ @Test
+ public void whenCompareObjectArrays_thenReturnBoolean() {
+ Integer[] array2 = { 8, 7, 6 };
+ Integer[] sameArray = { 3, 5, 2, 5, 14, 4 };
+ boolean output = ArrayOperations.compareObjectArrays(defaultObjectArray, array2);
+ boolean output2 = ArrayOperations.compareObjectArrays(defaultObjectArray, sameArray);
+
+ assertThat(output).isFalse();
+ assertThat(output2).isTrue();
+ }
+
+ @Test
+ public void whenCompareIntArrays_thenReturnBoolean() {
+ int[] array2 = { 8, 7, 6 };
+ int[] sameArray = { 3, 5, 2, 5, 14, 4 };
+ boolean output = ArrayOperations.compareIntArrays(defaultIntArray, array2);
+ boolean output2 = ArrayOperations.compareIntArrays(defaultIntArray, sameArray);
+
+ assertThat(output).isFalse();
+ assertThat(output2).isTrue();
+ }
+
+ // Deep compare
+ @Test
+ public void whenDeepCompareObjectArrays_thenReturnBoolean() {
+ Integer[][] sameArray = { { 1, 3 }, { 5 }, {} };
+ Integer[][] array2 = { { 1, 3 }, { 5 }, { 3 } };
+ boolean output = ArrayOperations.deepCompareObjectArrayUsingArrays(defaultJaggedObjectArray, array2);
+ boolean output2 = ArrayOperations.deepCompareObjectArrayUsingArrays(defaultJaggedObjectArray, sameArray);
+ // Because arrays are Objects, we could wrongly use the non-deep approach
+ boolean outputUsingNonDeep = ArrayOperations.compareObjectArrays(defaultJaggedObjectArray, sameArray);
+
+ assertThat(output).isFalse();
+ assertThat(output2).isTrue();
+ // This is not what we would expect!
+ assertThat(outputUsingNonDeep).isFalse();
+ }
+
+ @Test
+ public void whenDeepCompareIntArrays_thenReturnBoolean() {
+ int[][] sameArray = { { 1, 3 }, { 5 }, {} };
+ int[][] array2 = { { 1, 3 }, { 5 }, { 3 } };
+ boolean output = ArrayOperations.deepCompareIntArrayUsingArrays(defaultJaggedIntArray, array2);
+ boolean output2 = ArrayOperations.deepCompareIntArrayUsingArrays(defaultJaggedIntArray, sameArray);
+
+ assertThat(output).isFalse();
+ assertThat(output2).isTrue();
+ }
+
+ // Empty Check
+ @Test
+ public void whenIsEmptyObjectArray_thenReturnBoolean() {
+ Integer[] array2 = {};
+ Integer[] array3 = null;
+ Integer[] array4 = { null, null, null };
+ Integer[] array5 = { null };
+ Integer[][] array6 = { {}, {}, {} };
+ boolean output = ArrayOperations.isEmptyObjectArrayUsingUtils(defaultObjectArray);
+ boolean output2 = ArrayOperations.isEmptyObjectArrayUsingUtils(array2);
+ boolean output3 = ArrayOperations.isEmptyObjectArrayUsingUtils(array3);
+ boolean output4 = ArrayOperations.isEmptyObjectArrayUsingUtils(array4);
+ boolean output5 = ArrayOperations.isEmptyObjectArrayUsingUtils(array5);
+ boolean output6 = ArrayOperations.isEmptyObjectArrayUsingUtils(array6);
+
+ assertThat(output).isFalse();
+ assertThat(output2).isTrue();
+ assertThat(output3).isTrue();
+ // Mind these edge cases!
+ assertThat(output4).isFalse();
+ assertThat(output5).isFalse();
+ assertThat(output6).isFalse();
+ }
+
+ @Test
+ public void whenIsEmptyIntArray_thenReturnBoolean() {
+ int[] array2 = {};
+ boolean output = ArrayOperations.isEmptyIntArrayUsingUtils(defaultIntArray);
+ boolean output2 = ArrayOperations.isEmptyIntArrayUsingUtils(array2);
+
+ assertThat(output).isFalse();
+ assertThat(output2).isTrue();
+ }
+
+ // Remove Duplicates
+ @Test
+ public void whenRemoveDuplicateObjectArray_thenReturnArrayWithNoDuplicates() {
+ Integer[] output = ArrayOperations.removeDuplicateObjects(defaultObjectArray);
+
+ assertThat(output).containsOnlyOnce(5)
+ .hasSize(5)
+ .doesNotHaveDuplicates();
+ }
+
+ @Test
+ public void whenRemoveDuplicateIntArray_thenReturnArrayWithNoDuplicates() {
+ int[] output = ArrayOperations.removeDuplicateInts(defaultIntArray);
+
+ assertThat(output).containsOnlyOnce(5)
+ .hasSize(5)
+ .doesNotHaveDuplicates();
+ }
+
+ // Remove Duplicates Preserving order
+ @Test
+ public void whenRemoveDuplicatePreservingOrderObjectArray_thenReturnArrayWithNoDuplicates() {
+ Integer[] array2 = { 3, 5, 2, 14, 4 };
+ Integer[] output = ArrayOperations.removeDuplicateWithOrderObjectArray(defaultObjectArray);
+
+ assertThat(output).containsOnlyOnce(5)
+ .hasSize(5)
+ .containsExactly(array2);
+ }
+
+ @Test
+ public void whenRemoveDuplicatePreservingOrderIntArray_thenReturnArrayWithNoDuplicates() {
+ int[] array2 = { 3, 5, 2, 14, 4 };
+ int[] output = ArrayOperations.removeDuplicateWithOrderIntArray(defaultIntArray);
+
+ assertThat(output).containsOnlyOnce(5)
+ .hasSize(5)
+ .containsExactly(array2);
+ }
+
+ // Print
+ @Test
+ public void whenPrintObjectArray_thenReturnString() {
+ String output = ArrayOperations.printObjectArray(defaultObjectArray);
+ String jaggedOutput = ArrayOperations.printObjectArray(defaultJaggedObjectArray);
+ // Comparing to Arrays output:
+ String wrongArraysOutput = Arrays.toString(defaultJaggedObjectArray);
+ String differentFormatArraysOutput = Arrays.toString(defaultObjectArray);
+ // We should use Arrays.deepToString for jagged arrays
+ String differentFormatJaggedArraysOutput = Arrays.deepToString(defaultJaggedObjectArray);
+
+ assertThat(output).isEqualTo("{3,5,2,5,14,4}");
+ assertThat(jaggedOutput).isEqualTo("{{1,3},{5},{}}");
+ assertThat(differentFormatArraysOutput).isEqualTo("[3, 5, 2, 5, 14, 4]");
+ assertThat(wrongArraysOutput).contains("[[Ljava.lang.Integer;@");
+ assertThat(differentFormatJaggedArraysOutput).contains("[[1, 3], [5], []]");
+ }
+
+ @Test
+ public void whenPrintIntArray_thenReturnString() {
+ String output = ArrayOperations.printIntArray(defaultIntArray);
+ String jaggedOutput = ArrayOperations.printIntArray(defaultJaggedIntArray);
+ // Comparing to Arrays output:
+ String wrongArraysOutput = Arrays.toString(defaultJaggedObjectArray);
+ String differentFormatArraysOutput = Arrays.toString(defaultObjectArray);
+
+ assertThat(output).isEqualTo("{3,5,2,5,14,4}");
+ assertThat(jaggedOutput).isEqualTo("{{1,3},{5},{}}");
+ assertThat(differentFormatArraysOutput).isEqualTo("[3, 5, 2, 5, 14, 4]");
+ assertThat(wrongArraysOutput).contains("[[Ljava.lang.Integer;@");
+ }
+
+ // Box and unbox
+ @Test
+ public void whenUnboxObjectArray_thenReturnPrimitiveArray() {
+ int[] output = ArrayOperations.unboxIntegerArray(defaultObjectArray);
+
+ assertThat(output).containsExactly(defaultIntArray);
+ }
+
+ @Test
+ public void henBoxPrimitiveArray_thenReturnObjectArray() {
+ Integer[] output = ArrayOperations.boxIntArray(defaultIntArray);
+
+ assertThat(output).containsExactly(defaultObjectArray);
+ }
+
+ // Map values
+ @Test
+ public void whenMapMultiplyingObjectArray_thenReturnMultipliedArray() {
+ Integer[] multipliedExpectedArray = new Integer[] { 6, 10, 4, 10, 28, 8 };
+ Integer[] output = ArrayOperations.mapObjectArray(defaultObjectArray, value -> value * 2, Integer.class);
+
+ assertThat(output).containsExactly(multipliedExpectedArray);
+ }
+
+ @Test
+ public void whenMapDividingObjectArray_thenReturnDividedArray() {
+ Double[] multipliedExpectedArray = new Double[] { 1.5, 2.5, 1.0, 2.5, 7.0, 2.0 };
+ Double[] output = ArrayOperations.mapObjectArray(defaultObjectArray, value -> value / 2.0, Double.class);
+
+ assertThat(output).containsExactly(multipliedExpectedArray);
+ }
+
+ @Test
+ public void whenMapIntArrayToString_thenReturnArray() {
+ String[] expectedArray = new String[] { "Value: 3", "Value: 5", "Value: 2", "Value: 5", "Value: 14",
+ "Value: 4" };
+ String[] output = ArrayOperations.mapIntArrayToString(defaultIntArray);
+
+ assertThat(output).containsExactly(expectedArray);
+ }
+
+ // Filter values
+ @Test
+ public void whenFilterObjectArray_thenReturnFilteredArray() {
+ Integer[] multipliedExpectedArray = new Integer[] { 2, 14, 4 };
+ Integer[] output = ArrayOperations.filterObjectArray(defaultObjectArray, value -> value % 2 == 0);
+
+ assertThat(output).containsExactly(multipliedExpectedArray);
+ }
+
+ @Test
+ public void whenFilterIntArray_thenReturnFilteredArray() {
+ int[] expectedArray = new int[] { 2, 14, 4 };
+ int[] output = ArrayOperations.filterIntArray(defaultIntArray, value -> (int) value % 2 == 0);
+
+ assertThat(output).containsExactly(expectedArray);
+ }
+
+ // Insert between
+ @Test
+ public void whenInsertBetweenIntArrayToString_thenReturnNewArray() {
+ int[] expectedArray = { 3, 5, 77, 88, 2, 5, 14, 4 };
+ int[] output = ArrayOperations.insertBetweenIntArray(defaultIntArray, 77, 88);
+
+ assertThat(output).containsExactly(expectedArray);
+ }
+
+ @Test
+ public void whenInsertBetweenObjectArrayToString_thenReturnNewArray() {
+ Integer[] expectedArray = { 3, 5, 77, 99, 2, 5, 14, 4 };
+ Integer[] output = ArrayOperations.insertBetweenObjectArray(defaultObjectArray, 77, 99);
+
+ assertThat(output).containsExactly(expectedArray);
+ }
+
+ // Shuffle between
+ @Test
+ public void whenShufflingIntArraySeveralTimes_thenAtLeastOneWithDifferentOrder() {
+ int[] output = ArrayOperations.shuffleIntArray(defaultIntArray);
+ int[] output2 = ArrayOperations.shuffleIntArray(defaultIntArray);
+ int[] output3 = ArrayOperations.shuffleIntArray(defaultIntArray);
+ int[] output4 = ArrayOperations.shuffleIntArray(defaultIntArray);
+ int[] output5 = ArrayOperations.shuffleIntArray(defaultIntArray);
+ int[] output6 = ArrayOperations.shuffleIntArray(defaultIntArray);
+
+ Condition atLeastOneArraysIsNotEqual = new Condition(
+ "at least one output should be different (order-wise)") {
+ @Override
+ public boolean matches(int[] value) {
+ return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3)
+ || !Arrays.equals(value, output4) || !Arrays.equals(value, output5)
+ || !Arrays.equals(value, output6);
+ }
+ };
+
+ assertThat(defaultIntArray).has(atLeastOneArraysIsNotEqual);
+ }
+
+ @Test
+ public void whenShufflingObjectArraySeveralTimes_thenAtLeastOneWithDifferentOrder() {
+ Integer[] output = ArrayOperations.shuffleObjectArray(defaultObjectArray);
+ Integer[] output2 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
+ Integer[] output3 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
+ Integer[] output4 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
+ Integer[] output5 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
+ Integer[] output6 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
+
+ Condition atLeastOneArraysIsNotEqual = new Condition(
+ "at least one output should be different (order-wise)") {
+ @Override
+ public boolean matches(Integer[] value) {
+ return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3)
+ || !Arrays.equals(value, output4) || !Arrays.equals(value, output5)
+ || !Arrays.equals(value, output6);
+ }
+ };
+
+ assertThat(defaultObjectArray).has(atLeastOneArraysIsNotEqual);
+ }
+
+ // Get random item
+ @Test
+ public void whenGetRandomFromIntArrayToString_thenReturnItemContainedInArray() {
+ int output = ArrayOperations.getRandomFromIntArray(defaultIntArray);
+
+ assertThat(defaultIntArray).contains(output);
+ }
+
+ @Test
+ public void whenGetRandomFromObjectArrayToString_thenReturnItemContainedInArray() {
+ Integer output = ArrayOperations.getRandomFromObjectArray(defaultObjectArray);
+
+ assertThat(defaultObjectArray).contains(output);
+ }
+}
diff --git a/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
new file mode 100644
index 0000000000..3c61060ea8
--- /dev/null
+++ b/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
@@ -0,0 +1,66 @@
+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 org.assertj.core.api.Assertions.assertThat;
+
+class IntersectionUnitTest {
+ private static final Integer[] a = { 1, 3, 2 };
+ private static final Integer[] b = { 4, 3, 2, 4, 2, 3, 4, 4, 3 };
+ private static final Integer[] c = { 1, 3, 2, 3, 3, 2 };
+
+ @Test
+ void whenIntersectionSimpleIsUsed_thenCommonEntriesAreInTheResult() {
+ assertThat(intersectionSimple(a, b)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionSimple(b, a)).isEqualTo(new Integer[] { 3, 2, 2, 3, 3 });
+ }
+
+ @Test
+ void whenIntersectionSimpleIsUsedWithAnArrayAndItself_thenTheResultIsTheIdentity() {
+ assertThat(intersectionSimple(b, b)).isEqualTo(b);
+ assertThat(intersectionSimple(a, a)).isEqualTo(a);
+ }
+
+ @Test
+ void whenIntersectionSetIsUsed_thenCommonEntriesAreInTheResult() {
+ assertThat(intersectionSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionSetIsUsed_thenTheNumberOfEntriesDoesNotChangeWithTheParameterOrder() {
+ assertThat(intersectionSet(a, b)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionSetIsUsedWithAnArrayAndWithItself_andTheInputHasNoDuplicateEntries_ThenTheResultIsTheIdentity() {
+ assertThat(intersectionSet(a, a)).isEqualTo(a);
+ }
+
+ @Test
+ void whenIntersectionSetIsUsedWithAnArrayAndWithItself_andTheInputHasDuplicateEntries_ThenTheResultIsNotTheIdentity() {
+ assertThat(intersectionSet(b, b)).isNotEqualTo(b);
+ }
+
+ @Test
+ void whenMultiSetIsUsed_thenCommonEntriesAreInTheResult() {
+ assertThat(intersectionMultiSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionMultiSetIsUsed_thenTheNumberOfEntriesDoesNotChangeWithTheParameterOrder() {
+ assertThat(intersectionMultiSet(a, b)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionMultiSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionMultiSet(b, c)).isEqualTo(new Integer[] { 3, 2, 2, 3, 3 });
+ assertThat(intersectionMultiSet(c, b)).isEqualTo(new Integer[] { 3, 2, 3, 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionMultiSetIsUsedWithAnArrayAndWithItself_ThenTheResultIsTheIdentity() {
+ assertThat(intersectionMultiSet(b, b)).isEqualTo(b);
+ assertThat(intersectionMultiSet(a, a)).isEqualTo(a);
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/arrays/ArraysUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
diff --git a/core-java-collections/README.md b/core-java-collections/README.md
index d0aaaa7182..4c0b24cd5d 100644
--- a/core-java-collections/README.md
+++ b/core-java-collections/README.md
@@ -39,3 +39,16 @@
- [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)
- [Guide to EnumSet](https://www.baeldung.com/java-enumset)
+- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
+- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist)
+- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items)
+- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
+- [Sorting in Java](http://www.baeldung.com/java-sorting)
+- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
+- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
+- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
+- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
+- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
+- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
+- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map)
+- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
diff --git a/core-java-collections/pom.xml b/core-java-collections/pom.xml
index 39ddc17684..2201ee8b15 100644
--- a/core-java-collections/pom.xml
+++ b/core-java-collections/pom.xml
@@ -56,16 +56,23 @@
commons-exec
1.3
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
1.19
1.2.0
- 3.5
+ 3.8.1
4.1
4.01
1.7.0
- 3.6.1
+ 3.11.1
7.1.0
+ 1.16.12
diff --git a/core-java/src/main/java/com/baeldung/classcastexception/ClassCastException.java b/core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/classcastexception/ClassCastException.java
rename to core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java b/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java
new file mode 100644
index 0000000000..3cce08eabb
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java
@@ -0,0 +1,67 @@
+package com.baeldung.java.list;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * Demonstrates the different ways to loop over
+ * the elements of a list.
+ */
+public class WaysToIterate {
+
+ List countries = Arrays.asList("Germany", "Panama", "Australia");
+
+ /**
+ * Iterate over a list using a basic for loop
+ */
+ public void iterateWithForLoop() {
+ for (int i = 0; i < countries.size(); i++) {
+ System.out.println(countries.get(i));
+ }
+ }
+
+ /**
+ * Iterate over a list using the enhanced for loop
+ */
+ public void iterateWithEnhancedForLoop() {
+ for (String country : countries) {
+ System.out.println(country);
+ }
+ }
+
+ /**
+ * Iterate over a list using an Iterator
+ */
+ public void iterateWithIterator() {
+ Iterator countriesIterator = countries.iterator();
+ while(countriesIterator.hasNext()) {
+ System.out.println(countriesIterator.next());
+ }
+ }
+
+ /**
+ * Iterate over a list using a ListIterator
+ */
+ public void iterateWithListIterator() {
+ ListIterator listIterator = countries.listIterator();
+ while(listIterator.hasNext()) {
+ System.out.println(listIterator.next());
+ }
+ }
+
+ /**
+ * Iterate over a list using the Iterable.forEach() method
+ */
+ public void iterateWithForEach() {
+ countries.forEach(System.out::println);
+ }
+
+ /**
+ * Iterate over a list using the Stream.forEach() method
+ */
+ public void iterateWithStreamForEach() {
+ countries.stream().forEach((c) -> System.out.println(c));
+ }
+}
\ No newline at end of file
diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
new file mode 100644
index 0000000000..72045d6761
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
@@ -0,0 +1,37 @@
+package com.baeldung.list.multidimensional;
+
+import java.util.ArrayList;
+
+public class ArrayListOfArrayList {
+
+ public static void main(String args[]) {
+
+ int vertex = 5;
+ ArrayList> graph = new ArrayList<>(vertex);
+
+ //Initializing each element of ArrayList with ArrayList
+ for(int i=0; i< vertex; i++) {
+ graph.add(new ArrayList());
+ }
+
+ //We can add any number of columns to each row
+ graph.get(0).add(1);
+ graph.get(0).add(5);
+ graph.get(1).add(0);
+ graph.get(1).add(2);
+ graph.get(2).add(1);
+ graph.get(2).add(3);
+ graph.get(3).add(2);
+ graph.get(3).add(4);
+ graph.get(4).add(3);
+ graph.get(4).add(5);
+
+ //Printing all the edges
+ for(int i=0; i > > space = new ArrayList<>(x_axis_length);
+
+ //Initializing each element of ArrayList with ArrayList< ArrayList >
+ for(int i=0; i< x_axis_length; i++) {
+ space.add(new ArrayList< ArrayList >(y_axis_length));
+ for(int j =0; j< y_axis_length; j++) {
+ space.get(i).add(new ArrayList(z_axis_length));
+ }
+ }
+
+ //Set Red color for points (0,0,0) and (0,0,1)
+ space.get(0).get(0).add("Red");
+ space.get(0).get(0).add("Red");
+ //Set Blue color for points (0,1,0) and (0,1,1)
+ space.get(0).get(1).add("Blue");
+ space.get(0).get(1).add("Blue");
+ //Set Green color for points (1,0,0) and (1,0,1)
+ space.get(1).get(0).add("Green");
+ space.get(1).get(0).add("Green");
+ //Set Yellow color for points (1,1,0) and (1,1,1)
+ space.get(1).get(1).add("Yellow");
+ space.get(1).get(1).add("Yellow");
+
+ //Printing colors for all the points
+ for(int i=0; i enumMap = new EnumMap<>(DummyEnum.class);
+ HashMap hashMap = new HashMap<>();
+ TreeMap treeMap = new TreeMap<>();
+ int len = DummyEnum.values().length;
+ Random random = new Random();
+ int randomIndex;
+
+ @Setup(Level.Trial)
+ public void setUp() {
+ DummyEnum[] values = DummyEnum.values();
+ for (int i = 0; i < len; i++) {
+ enumMap.put(values[i], values[i].toString());
+ hashMap.put(values[i], values[i].toString());
+ treeMap.put(values[i], values[i].toString());
+ }
+ }
+
+ @Setup(Level.Invocation)
+ public void additionalSetup() {
+ randomIndex = random.nextInt(len);
+ }
+
+ }
+
+ @Benchmark
+ public int benchmark01_EnumMapPut(BenchmarkState s) {
+ s.enumMap.put(DummyEnum.values()[s.randomIndex], DummyEnum.values()[s.randomIndex].toString());
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark01_HashMapPut(BenchmarkState s) {
+ s.hashMap.put(DummyEnum.values()[s.randomIndex], DummyEnum.values()[s.randomIndex].toString());
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark01_TreeMapPut(BenchmarkState s) {
+ s.treeMap.put(DummyEnum.values()[s.randomIndex], DummyEnum.values()[s.randomIndex].toString());
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark02_EnumMapGet(BenchmarkState s) {
+ s.enumMap.get(DummyEnum.values()[s.randomIndex]);
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark02_HashMapGet(BenchmarkState s) {
+ s.hashMap.get(DummyEnum.values()[s.randomIndex]);
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark02_TreeMapGet(BenchmarkState s) {
+ s.treeMap.get(DummyEnum.values()[s.randomIndex]);
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark03_EnumMapContainsKey(BenchmarkState s) {
+ s.enumMap.containsKey(DummyEnum.values()[s.randomIndex]);
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark03_HashMapContainsKey(BenchmarkState s) {
+ s.hashMap.containsKey(DummyEnum.values()[s.randomIndex]);
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark03_TreeMapContainsKey(BenchmarkState s) {
+ s.treeMap.containsKey(DummyEnum.values()[s.randomIndex]);
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark04_EnumMapContainsValue(BenchmarkState s) {
+ s.enumMap.containsValue(DummyEnum.values()[s.randomIndex].toString());
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark04_HashMapContainsValue(BenchmarkState s) {
+ s.hashMap.containsValue(DummyEnum.values()[s.randomIndex].toString());
+ return ++s.randomIndex;
+ }
+
+ @Benchmark
+ public int benchmark04_TreeMapContainsValue(BenchmarkState s) {
+ s.treeMap.containsValue(DummyEnum.values()[s.randomIndex].toString());
+ return ++s.randomIndex;
+ }
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder().include(EnumMapBenchmarkLiveTest.class.getSimpleName()).threads(1).forks(0).shouldFailOnError(true).shouldDoGC(false).jvmArgs("-server").build();
+ new Runner(options).run();
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/enummap/EnumMapUnitTest.java b/core-java-collections/src/test/java/com/baeldung/enummap/EnumMapUnitTest.java
new file mode 100644
index 0000000000..d9d6cf2c39
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/enummap/EnumMapUnitTest.java
@@ -0,0 +1,144 @@
+package com.baeldung.enummap;
+
+import org.junit.Test;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+import static java.util.AbstractMap.SimpleEntry;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
+public class EnumMapUnitTest {
+ public enum DayOfWeek {
+ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
+ }
+
+ @Test
+ public void whenContructedWithEnumType_ThenOnlyAcceptThatAsKey() {
+ Map dayMap = new EnumMap<>(DayOfWeek.class);
+ assertThatCode(
+ () -> dayMap.put(TimeUnit.NANOSECONDS, "NANOSECONDS"))
+ .isInstanceOf(ClassCastException.class);
+ }
+
+ @Test
+ public void whenConstructedWithEnumMap_ThenSameKeyTypeAndInitialMappings() {
+ EnumMap activityMap = new EnumMap<>(DayOfWeek.class);
+ activityMap.put(DayOfWeek.MONDAY, "Soccer");
+ activityMap.put(DayOfWeek.TUESDAY, "Basketball");
+
+ EnumMap activityMapCopy = new EnumMap<>(activityMap);
+ assertThat(activityMapCopy.size()).isEqualTo(2);
+ assertThat(activityMapCopy.get(DayOfWeek.MONDAY))
+ .isEqualTo("Soccer");
+ assertThat(activityMapCopy.get(DayOfWeek.TUESDAY))
+ .isEqualTo("Basketball");
+ }
+
+ @Test
+ public void givenEmptyMap_whenConstructedWithMap_ThenException() {
+ HashMap ordinaryMap = new HashMap();
+ assertThatCode(() -> new EnumMap(ordinaryMap))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("Specified map is empty");
+ }
+
+ @Test
+ public void givenMapWithEntries_whenConstructedWithMap_ThenSucceed() {
+ HashMap ordinaryMap = new HashMap<>();
+ ordinaryMap.put(DayOfWeek.MONDAY, "Soccer");
+ ordinaryMap.put(DayOfWeek.TUESDAY, "Basketball");
+ EnumMap enumMap = new EnumMap<>(ordinaryMap);
+ assertThat(enumMap.size()).isEqualTo(2);
+ assertThat(enumMap.get(DayOfWeek.MONDAY)).isEqualTo("Soccer");
+ assertThat(enumMap.get(DayOfWeek.TUESDAY)).isEqualTo("Basketball");
+ }
+
+ @Test
+ public void givenMapWithMultiTypeEntries_whenConstructedWithMap_ThenException() {
+ HashMap ordinaryMap = new HashMap<>();
+ ordinaryMap.put(DayOfWeek.MONDAY, "Soccer");
+ ordinaryMap.put(TimeUnit.MILLISECONDS, "Other enum type");
+ assertThatCode(() -> new EnumMap(ordinaryMap))
+ .isInstanceOf(ClassCastException.class);
+ }
+
+ @Test
+ public void whenPut_thenGet() {
+ Map activityMap = new EnumMap(DayOfWeek.class);
+ activityMap.put(DayOfWeek.WEDNESDAY, "Hiking");
+ activityMap.put(DayOfWeek.THURSDAY, null);
+ assertThat(activityMap.get(DayOfWeek.WEDNESDAY)).isEqualTo("Hiking");
+ assertThat(activityMap.get(DayOfWeek.THURSDAY)).isNull();
+ }
+
+ @Test
+ public void givenMapping_whenContains_thenTrue() {
+ EnumMap activityMap = new EnumMap(DayOfWeek.class);
+ assertThat(activityMap.containsKey(DayOfWeek.WEDNESDAY)).isFalse();
+ assertThat(activityMap.containsValue("Hiking")).isFalse();
+ activityMap.put(DayOfWeek.WEDNESDAY, "Hiking");
+ assertThat(activityMap.containsKey(DayOfWeek.WEDNESDAY)).isTrue();
+ assertThat(activityMap.containsValue("Hiking")).isTrue();
+
+ assertThat(activityMap.containsKey(DayOfWeek.SATURDAY)).isFalse();
+ assertThat(activityMap.containsValue(null)).isFalse();
+ activityMap.put(DayOfWeek.SATURDAY, null);
+ assertThat(activityMap.containsKey(DayOfWeek.SATURDAY)).isTrue();
+ assertThat(activityMap.containsValue(null)).isTrue();
+ }
+
+ @Test
+ public void whenRemove_thenRemoved() {
+ EnumMap activityMap = new EnumMap(DayOfWeek.class);
+
+ activityMap.put(DayOfWeek.MONDAY, "Soccer");
+ assertThat(activityMap.remove(DayOfWeek.MONDAY)).isEqualTo("Soccer");
+ assertThat(activityMap.containsKey(DayOfWeek.MONDAY)).isFalse();
+
+ activityMap.put(DayOfWeek.MONDAY, "Soccer");
+ assertThat(activityMap.remove(DayOfWeek.MONDAY, "Hiking")).isEqualTo(false);
+ assertThat(activityMap.remove(DayOfWeek.MONDAY, "Soccer")).isEqualTo(true);
+ }
+
+ @Test
+ public void whenSubView_thenSubViewOrdered() {
+ EnumMap activityMap = new EnumMap(DayOfWeek.class);
+ activityMap.put(DayOfWeek.THURSDAY, "Karate");
+ activityMap.put(DayOfWeek.WEDNESDAY, "Hiking");
+ activityMap.put(DayOfWeek.MONDAY, "Soccer");
+
+ Collection values = activityMap.values();
+ assertThat(values).containsExactly("Soccer", "Hiking", "Karate");
+
+ Set keys = activityMap.keySet();
+ assertThat(keys)
+ .containsExactly(DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY,DayOfWeek.THURSDAY);
+
+ assertThat(activityMap.entrySet())
+ .containsExactly(
+ new SimpleEntry(DayOfWeek.MONDAY, "Soccer"),
+ new SimpleEntry(DayOfWeek.WEDNESDAY, "Hiking"),
+ new SimpleEntry(DayOfWeek.THURSDAY, "Karate"));
+ }
+
+ @Test
+ public void givenSubView_whenChange_thenReflected() {
+ EnumMap activityMap = new EnumMap(DayOfWeek.class);
+ activityMap.put(DayOfWeek.THURSDAY, "Karate");
+ activityMap.put(DayOfWeek.WEDNESDAY, "Hiking");
+ activityMap.put(DayOfWeek.MONDAY, "Soccer");
+
+ Collection values = activityMap.values();
+ assertThat(values).containsExactly("Soccer", "Hiking", "Karate");
+
+ activityMap.put(DayOfWeek.TUESDAY, "Basketball");
+ assertThat(values)
+ .containsExactly("Soccer", "Basketball", "Hiking", "Karate");
+
+ values.remove("Hiking");
+ assertThat(activityMap.containsKey(DayOfWeek.WEDNESDAY)).isFalse();
+ assertThat(activityMap.size()).isEqualTo(3);
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
new file mode 100644
index 0000000000..973c60b233
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.java.list;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.junit.Test;
+
+public class WaysToIterateUnitTest {
+
+ List globalCountries = new ArrayList();
+ List europeanCountries = Arrays.asList("Germany", "Panama", "Australia");
+
+ @Test
+ public void whenIteratingUsingForLoop_thenReturnThreeAsSizeOfList() {
+ for (int i = 0; i < europeanCountries.size(); i++) {
+ globalCountries.add(europeanCountries.get(i));
+ }
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingEnhancedForLoop_thenReturnThreeAsSizeOfList() {
+ for (String country : europeanCountries) {
+ globalCountries.add(country);
+ }
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingIterator_thenReturnThreeAsSizeOfList() {
+ Iterator countriesIterator = europeanCountries.iterator();
+ while (countriesIterator.hasNext()) {
+ globalCountries.add(countriesIterator.next());
+ }
+
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingListIterator_thenReturnThreeAsSizeOfList() {
+ ListIterator countriesIterator = europeanCountries.listIterator();
+ while (countriesIterator.hasNext()) {
+ globalCountries.add(countriesIterator.next());
+ }
+
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingForEach_thenReturnThreeAsSizeOfList() {
+ europeanCountries.forEach(country -> globalCountries.add(country));
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingStreamForEach_thenReturnThreeAsSizeOfList() {
+ europeanCountries.stream().forEach((country) -> globalCountries.add(country));
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
rename to core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
similarity index 100%
rename from core-java/src/test/java/org/baeldung/java/sorting/Employee.java
rename to core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java b/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
rename to core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md
index eeb9a83748..2db7b91cde 100644
--- a/core-java-concurrency/README.md
+++ b/core-java-concurrency/README.md
@@ -26,7 +26,8 @@
- [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)
- [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule)
-- [A Custom Spring SecurityConfigurer](http://www.baeldung.com/spring-security-custom-configurer)
- [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)
- [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield)
+- [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads)
+- [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch)
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
index b77019eea5..0989195ba7 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
@@ -1,34 +1,52 @@
package com.baeldung.concurrent.Scheduledexecutorservice;
import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
public class ScheduledExecutorServiceDemo {
- public void execute() {
+ private void execute() {
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
-
- ScheduledFuture> scheduledFuture = executorService.schedule(() -> {
- // Task
- }, 1, TimeUnit.SECONDS);
-
- executorService.scheduleAtFixedRate(() -> {
- // Task
- }, 1, 10, TimeUnit.SECONDS);
-
- executorService.scheduleWithFixedDelay(() -> {
- // Task
- }, 1, 10, TimeUnit.SECONDS);
-
- Future future = executorService.schedule(() -> {
- // Task
- return "Hellow world";
- }, 1, TimeUnit.SECONDS);
-
+ getTasksToRun().apply(executorService);
executorService.shutdown();
}
+ private void executeWithMultiThread() {
+ ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
+ getTasksToRun().apply(executorService);
+ executorService.shutdown();
+ }
+
+ private Function getTasksToRun() {
+ return (executorService -> {
+ ScheduledFuture> scheduledFuture1 = executorService.schedule(() -> {
+ // Task
+ }, 1, TimeUnit.SECONDS);
+
+ ScheduledFuture> scheduledFuture2 = executorService.scheduleAtFixedRate(() -> {
+ // Task
+ }, 1, 10, TimeUnit.SECONDS);
+
+ ScheduledFuture> scheduledFuture3 = executorService.scheduleWithFixedDelay(() -> {
+ // Task
+ }, 1, 10, TimeUnit.SECONDS);
+
+ ScheduledFuture scheduledFuture4 = executorService.schedule(() -> {
+ // Task
+ return "Hellow world";
+ }, 1, TimeUnit.SECONDS);
+ return null;
+ });
+ }
+
+ public static void main(String... args) {
+ ScheduledExecutorServiceDemo demo = new ScheduledExecutorServiceDemo();
+ demo.execute();
+ demo.executeWithMultiThread();
+ }
+
+
}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
new file mode 100644
index 0000000000..08c7eeec03
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
@@ -0,0 +1,33 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import java.util.concurrent.CountDownLatch;
+
+public class CountdownLatchCountExample {
+
+ private int count;
+
+ public CountdownLatchCountExample(int count) {
+ this.count = count;
+ }
+
+ public boolean callTwiceInSameThread() {
+ CountDownLatch countDownLatch = new CountDownLatch(count);
+ Thread t = new Thread(() -> {
+ countDownLatch.countDown();
+ countDownLatch.countDown();
+ });
+ t.start();
+
+ try {
+ countDownLatch.await();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return countDownLatch.getCount() == 0;
+ }
+
+ public static void main(String[] args) {
+ CountdownLatchCountExample ex = new CountdownLatchCountExample(2);
+ System.out.println("Is CountDown Completed : " + ex.callTwiceInSameThread());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
new file mode 100644
index 0000000000..1828b7f91e
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
@@ -0,0 +1,41 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CountdownLatchResetExample {
+
+ private int count;
+ private int threadCount;
+ private final AtomicInteger updateCount;
+
+ CountdownLatchResetExample(int count, int threadCount) {
+ updateCount = new AtomicInteger(0);
+ this.count = count;
+ this.threadCount = threadCount;
+ }
+
+ public int countWaits() {
+ CountDownLatch countDownLatch = new CountDownLatch(count);
+ ExecutorService es = Executors.newFixedThreadPool(threadCount);
+ for (int i = 0; i < threadCount; i++) {
+ es.execute(() -> {
+ long prevValue = countDownLatch.getCount();
+ countDownLatch.countDown();
+ if (countDownLatch.getCount() != prevValue) {
+ updateCount.incrementAndGet();
+ }
+ });
+ }
+
+ es.shutdown();
+ return updateCount.get();
+ }
+
+ public static void main(String[] args) {
+ CountdownLatchResetExample ex = new CountdownLatchResetExample(5, 20);
+ System.out.println("Count : " + ex.countWaits());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
new file mode 100644
index 0000000000..7c1299da62
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
@@ -0,0 +1,45 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CyclicBarrierCompletionMethodExample {
+
+ private int count;
+ private int threadCount;
+ private final AtomicInteger updateCount;
+
+ CyclicBarrierCompletionMethodExample(int count, int threadCount) {
+ updateCount = new AtomicInteger(0);
+ this.count = count;
+ this.threadCount = threadCount;
+ }
+
+ public int countTrips() {
+
+ CyclicBarrier cyclicBarrier = new CyclicBarrier(count, () -> {
+ updateCount.incrementAndGet();
+ });
+
+ ExecutorService es = Executors.newFixedThreadPool(threadCount);
+ for (int i = 0; i < threadCount; i++) {
+ es.execute(() -> {
+ try {
+ cyclicBarrier.await();
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+ es.shutdown();
+ return updateCount.get();
+ }
+
+ public static void main(String[] args) {
+ CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(5, 20);
+ System.out.println("Count : " + ex.countTrips());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
new file mode 100644
index 0000000000..9d637b428b
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
@@ -0,0 +1,32 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+
+public class CyclicBarrierCountExample {
+
+ private int count;
+
+ public CyclicBarrierCountExample(int count) {
+ this.count = count;
+ }
+
+ public boolean callTwiceInSameThread() {
+ CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
+ Thread t = new Thread(() -> {
+ try {
+ cyclicBarrier.await();
+ cyclicBarrier.await();
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ });
+ t.start();
+ return cyclicBarrier.isBroken();
+ }
+
+ public static void main(String[] args) {
+ CyclicBarrierCountExample ex = new CyclicBarrierCountExample(7);
+ System.out.println("Count : " + ex.callTwiceInSameThread());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
new file mode 100644
index 0000000000..76b6198bc4
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
@@ -0,0 +1,46 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CyclicBarrierResetExample {
+
+ private int count;
+ private int threadCount;
+ private final AtomicInteger updateCount;
+
+ CyclicBarrierResetExample(int count, int threadCount) {
+ updateCount = new AtomicInteger(0);
+ this.count = count;
+ this.threadCount = threadCount;
+ }
+
+ public int countWaits() {
+
+ CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
+
+ ExecutorService es = Executors.newFixedThreadPool(threadCount);
+ for (int i = 0; i < threadCount; i++) {
+ es.execute(() -> {
+ try {
+ if (cyclicBarrier.getNumberWaiting() > 0) {
+ updateCount.incrementAndGet();
+ }
+ cyclicBarrier.await();
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+ es.shutdown();
+ return updateCount.get();
+ }
+
+ public static void main(String[] args) {
+ CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7, 20);
+ System.out.println("Count : " + ex.countWaits());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java
new file mode 100644
index 0000000000..492466e0c3
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java
@@ -0,0 +1,12 @@
+package com.baeldung.concurrent.daemon;
+
+public class MultipleThreadsExample {
+ public static void main(String[] args) {
+ NewThread t1 = new NewThread();
+ t1.setName("MyThread-1");
+ NewThread t2 = new NewThread();
+ t2.setName("MyThread-2");
+ t1.start();
+ t2.start();
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
index 4d87978070..370ce99c09 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
@@ -1,14 +1,18 @@
package com.baeldung.concurrent.daemon;
public class NewThread extends Thread {
-
public void run() {
long startTime = System.currentTimeMillis();
while (true) {
for (int i = 0; i < 10; i++) {
- System.out.println("New Thread is running..." + i);
+ System.out.println(this.getName() + ": New Thread is running..." + i);
+ try {
+ //Wait for one sec so it doesn't print too fast
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
}
-
// prevent the Thread to run forever. It will finish it's execution after 2 seconds
if (System.currentTimeMillis() - startTime > 2000) {
Thread.currentThread().interrupt();
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java
new file mode 100644
index 0000000000..16d8b2be1e
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java
@@ -0,0 +1,8 @@
+package com.baeldung.concurrent.daemon;
+
+public class SingleThreadExample {
+ public static void main(String[] args) {
+ NewThread t = new NewThread();
+ t.start();
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
new file mode 100644
index 0000000000..8b58916707
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
@@ -0,0 +1,75 @@
+package com.baeldung.concurrent.evenandodd;
+
+import java.util.concurrent.Semaphore;
+
+public class PrintEvenOddSemaphore {
+
+ public static void main(String[] args) {
+ SharedPrinter sp = new SharedPrinter();
+ Thread odd = new Thread(new Odd(sp, 10), "Odd");
+ Thread even = new Thread(new Even(sp, 10), "Even");
+
+ odd.start();
+ even.start();
+ }
+}
+
+class SharedPrinter {
+
+ private final Semaphore semEven = new Semaphore(0);
+ private final Semaphore semOdd = new Semaphore(1);
+
+ void printEvenNum(int num) {
+ try {
+ semEven.acquire();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ System.out.println(Thread.currentThread().getName() + ":"+num);
+ semOdd.release();
+ }
+
+ void printOddNum(int num) {
+ try {
+ semOdd.acquire();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ System.out.println(Thread.currentThread().getName() + ":"+ num);
+ semEven.release();
+ }
+}
+
+class Even implements Runnable {
+ private final SharedPrinter sp;
+ private final int max;
+
+ Even(SharedPrinter sp, int max) {
+ this.sp = sp;
+ this.max = max;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 2; i <= max; i = i + 2) {
+ sp.printEvenNum(i);
+ }
+ }
+}
+
+class Odd implements Runnable {
+ private SharedPrinter sp;
+ private int max;
+
+ Odd(SharedPrinter sp, int max) {
+ this.sp = sp;
+ this.max = max;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 1; i <= max; i = i + 2) {
+ sp.printOddNum(i);
+ }
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
new file mode 100644
index 0000000000..2b59f22a6e
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
@@ -0,0 +1,68 @@
+package com.baeldung.concurrent.evenandodd;
+
+public class PrintEvenOddWaitNotify {
+
+ public static void main(String... args) {
+ Printer print = new Printer();
+ Thread t1 = new Thread(new TaskEvenOdd(print, 10, false), "Odd");
+ Thread t2 = new Thread(new TaskEvenOdd(print, 10, true), "Even");
+ t1.start();
+ t2.start();
+ }
+}
+
+class TaskEvenOdd implements Runnable {
+ private final int max;
+ private final Printer print;
+ private final boolean isEvenNumber;
+
+ TaskEvenOdd(Printer print, int max, boolean isEvenNumber) {
+ this.print = print;
+ this.max = max;
+ this.isEvenNumber = isEvenNumber;
+ }
+
+ @Override
+ public void run() {
+ int number = isEvenNumber ? 2 : 1;
+ while (number <= max) {
+ if (isEvenNumber) {
+ print.printEven(number);
+ } else {
+ print.printOdd(number);
+ }
+ number += 2;
+ }
+ }
+}
+
+class Printer {
+ private volatile boolean isOdd;
+
+ synchronized void printEven(int number) {
+ while (!isOdd) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ System.out.println(Thread.currentThread().getName() + ":" + number);
+ isOdd = false;
+ notify();
+ }
+
+ synchronized void printOdd(int number) {
+ while (isOdd) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ System.out.println(Thread.currentThread().getName() + ":" + number);
+ isOdd = true;
+ notify();
+ }
+
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
new file mode 100644
index 0000000000..835efa53f2
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CountdownLatchCountExampleUnitTest {
+
+ @Test
+ public void whenCountDownLatch_completed() {
+ CountdownLatchCountExample ex = new CountdownLatchCountExample(2);
+ boolean isCompleted = ex.callTwiceInSameThread();
+ assertTrue(isCompleted);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
new file mode 100644
index 0000000000..d2d43f6312
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CountdownLatchResetExampleUnitTest {
+
+ @Test
+ public void whenCountDownLatch_noReset() {
+ CountdownLatchResetExample ex = new CountdownLatchResetExample(7,20);
+ int lineCount = ex.countWaits();
+ assertTrue(lineCount <= 7);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
new file mode 100644
index 0000000000..310063c86c
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class CyclicBarrierCompletionMethodExampleUnitTest {
+
+ @Test
+ public void whenCyclicBarrier_countTrips() {
+ CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(7,20);
+ int lineCount = ex.countTrips();
+ assertEquals(2, lineCount);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
new file mode 100644
index 0000000000..9b7f3d9945
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Test;
+
+public class CyclicBarrierCountExampleUnitTest {
+
+ @Test
+ public void whenCyclicBarrier_notCompleted() {
+ CyclicBarrierCountExample ex = new CyclicBarrierCountExample(2);
+ boolean isCompleted = ex.callTwiceInSameThread();
+ assertFalse(isCompleted);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
new file mode 100644
index 0000000000..8d2b148f06
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CyclicBarrierResetExampleUnitTest {
+
+ @Test
+ public void whenCyclicBarrier_reset() {
+ CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,20);
+ int lineCount = ex.countWaits();
+ assertTrue(lineCount > 7);
+ }
+}
diff --git a/core-java-io/README.md b/core-java-io/README.md
index ae4c267b8a..3d028783ed 100644
--- a/core-java-io/README.md
+++ b/core-java-io/README.md
@@ -33,3 +33,5 @@
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Read a File into an ArrayList](https://www.baeldung.com/java-file-to-arraylist)
- [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream)
+- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
+- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
diff --git a/core-java-io/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java-io/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java
new file mode 100644
index 0000000000..c7f0e878ac
--- /dev/null
+++ b/core-java-io/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java
@@ -0,0 +1,84 @@
+package com.baeldung.bufferedreader;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.stream.Collectors;
+
+public class BufferedReaderExample {
+
+ public String readAllLines(BufferedReader reader) throws IOException {
+ StringBuilder content = new StringBuilder();
+ String line;
+
+ while ((line = reader.readLine()) != null) {
+ content.append(line);
+ content.append(System.lineSeparator());
+ }
+
+ return content.toString();
+ }
+
+ public String readAllLinesWithStream(BufferedReader reader) {
+ return reader
+ .lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ }
+
+ public String readAllCharsOneByOne(BufferedReader reader) throws IOException {
+ StringBuilder content = new StringBuilder();
+
+ int value;
+ while ((value = reader.read()) != -1) {
+ content.append((char) value);
+ }
+
+ return content.toString();
+ }
+
+ public String readMultipleChars(BufferedReader reader) throws IOException {
+ int length = 5;
+ char[] chars = new char[length];
+ int charsRead = reader.read(chars, 0, length);
+
+ String result;
+ if (charsRead != -1) {
+ result = new String(chars, 0, charsRead);
+ } else {
+ result = "";
+ }
+
+ return result;
+ }
+
+ public String readFile() {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new FileReader("src/main/resources/input.txt"));
+ String content = readAllLines(reader);
+ return content;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ } finally {
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public String readFileTryWithResources() {
+ try (BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/input.txt"))) {
+ String content = readAllLines(reader);
+ return content;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+}
diff --git a/core-java-io/src/main/java/com/baeldung/download/FileDownload.java b/core-java-io/src/main/java/com/baeldung/download/FileDownload.java
index c7dd154023..a099406d4c 100644
--- a/core-java-io/src/main/java/com/baeldung/download/FileDownload.java
+++ b/core-java-io/src/main/java/com/baeldung/download/FileDownload.java
@@ -45,6 +45,7 @@ public class FileDownload {
FileOutputStream fileOutputStream = new FileOutputStream(localFilename); FileChannel fileChannel = fileOutputStream.getChannel()) {
fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
+ fileOutputStream.close();
}
}
diff --git a/core-java-io/src/main/resources/input.txt b/core-java-io/src/main/resources/input.txt
new file mode 100644
index 0000000000..650da894e8
--- /dev/null
+++ b/core-java-io/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-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java
new file mode 100644
index 0000000000..9af00c086a
--- /dev/null
+++ b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.bufferedreader;
+
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class BufferedReaderExampleUnitTest {
+
+ private static final String FILE_PATH = "src/main/resources/input.txt";
+
+ @Test
+ public void givenBufferedReader_whenReadAllLines_thenReturnsContent() throws IOException {
+ BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH));
+
+ BufferedReaderExample bre = new BufferedReaderExample();
+ String content = bre.readAllLines(reader);
+
+ assertThat(content).isNotEmpty();
+ assertThat(content).contains("Lorem ipsum");
+ }
+
+ @Test
+ public void givenBufferedReader_whenReadAllLinesWithStream_thenReturnsContent() throws IOException {
+ BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH));
+
+ BufferedReaderExample bre = new BufferedReaderExample();
+ String content = bre.readAllLinesWithStream(reader);
+
+ assertThat(content).isNotEmpty();
+ assertThat(content).contains("Lorem ipsum");
+ }
+
+ @Test
+ public void whenReadFile_thenReturnsContent() {
+ BufferedReaderExample bre = new BufferedReaderExample();
+ String content = bre.readFile();
+
+ assertThat(content.toString()).contains("Lorem ipsum");
+ }
+
+ @Test
+ public void givenBufferedReader_whenReadAllCharsOneByOne_thenReturnsContent() throws IOException {
+ BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH));
+
+ BufferedReaderExample bre = new BufferedReaderExample();
+ String content = bre.readAllCharsOneByOne(reader);
+
+ assertThat(content).isNotEmpty();
+ assertThat(content).contains("Lorem ipsum");
+ }
+
+ @Test
+ public void givenBufferedReader_whenReadMultipleChars_thenReturnsContent() throws IOException {
+ BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH));
+
+ BufferedReaderExample bre = new BufferedReaderExample();
+ String content = bre.readMultipleChars(reader);
+
+ assertThat(content).isNotEmpty();
+ assertThat(content).isEqualTo("Lorem");
+ }
+
+ @Test
+ public void whenReadFileTryWithResources_thenReturnsContent() {
+ BufferedReaderExample bre = new BufferedReaderExample();
+ String content = bre.readFileTryWithResources();
+
+ assertThat(content.toString()).contains("Lorem ipsum");
+ }
+
+}
diff --git a/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java
new file mode 100644
index 0000000000..985eb05aec
--- /dev/null
+++ b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.bufferedreader;
+
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class BufferedReaderUnitTest {
+
+ private static final String FILE_PATH = "src/main/resources/input.txt";
+
+ @Test
+ public void givenBufferedReader_whenSkipUnderscores_thenOk() throws IOException {
+ StringBuilder result = new StringBuilder();
+
+ try (BufferedReader reader = new BufferedReader(new StringReader("1__2__3__4__5"))) {
+ int value;
+ while((value = reader.read()) != -1) {
+ result.append((char) value);
+ reader.skip(2L);
+ }
+ }
+
+ assertEquals("12345", result.toString());
+ }
+
+ @Test
+ public void givenBufferedReader_whenSkipsWhitespacesAtBeginning_thenOk() throws IOException {
+ String result;
+
+ try (BufferedReader reader = new BufferedReader(new StringReader(" Lorem ipsum dolor sit amet."))) {
+ do {
+ reader.mark(1);
+ } while(Character.isWhitespace(reader.read()));
+
+ reader.reset();
+ result = reader.readLine();
+ }
+
+ assertEquals("Lorem ipsum dolor sit amet.", result);
+ }
+
+ @Test
+ public void whenCreatesNewBufferedReader_thenOk() throws IOException {
+ try(BufferedReader reader = Files.newBufferedReader(Paths.get(FILE_PATH))) {
+ assertNotNull(reader);
+ assertTrue(reader.ready());
+ }
+ }
+
+}
diff --git a/core-java-lang/.gitignore b/core-java-lang/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-lang/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-lang/README.md b/core-java-lang/README.md
new file mode 100644
index 0000000000..69209bb193
--- /dev/null
+++ b/core-java-lang/README.md
@@ -0,0 +1,61 @@
+=========
+
+## Core Java Lang Cookbooks and Examples
+
+### Relevant Articles:
+- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
+- [Introduction to Java Generics](http://www.baeldung.com/java-generics)
+- [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)
+- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
+- [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 hashCode() in Java](http://www.baeldung.com/java-hashcode)
+- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
+- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
+- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
+- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
+- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
+- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
+- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
+- [Varargs in Java](http://www.baeldung.com/java-varargs)
+- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
+- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
+- [Recursion In Java](http://www.baeldung.com/java-recursion)
+- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
+- [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)
+- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums)
+- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
+- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
+- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
+- [Using Java Assertions](http://www.baeldung.com/java-assert)
+- [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)
+- [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)
+- [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)
+- [Java Switch Statement](https://www.baeldung.com/java-switch)
+- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
+- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
+- [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)
+- [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)
+- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name)
+- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml
new file mode 100644
index 0000000000..2f307859f1
--- /dev/null
+++ b/core-java-lang/pom.xml
@@ -0,0 +1,436 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-lang
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+ com.google.code.gson
+ gson
+ ${gson.version}
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ org.springframework
+ spring-web
+ ${springframework.spring-web.version}
+
+
+ javax.mail
+ mail
+ ${javax.mail.version}
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ ${equalsverifier.version}
+ test
+
+
+
+
+ core-java-lang
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+ ${onejar-maven-plugin.version}
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-maven-plugin.version}
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ 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}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+ buildAgentLoader
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agentLoader
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/AgentLoader.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildApplication
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ application
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/MyAtm.class
+ com/baeldung/instrumentation/application/MyAtmApplication.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildAgent
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agent
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/agent/AtmTransformer.class
+ com/baeldung/instrumentation/agent/MyInstrumentationAgent.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.8.5
+ 2.8.2
+
+
+ 3.5
+ 1.16.12
+
+ 1.5.0-b01
+
+
+ 3.10.0
+
+
+ 2.21.0
+ 4.3.4.RELEASE
+ 3.0.0-M1
+ 3.0.2
+ 1.4.4
+ 3.1.1
+ 2.0.3.RELEASE
+ 1.6.0
+ 3.0.3
+
+
+
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java/src/main/java/com/baeldung/assertion/Assertion.java b/core-java-lang/src/main/java/com/baeldung/assertion/Assertion.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/assertion/Assertion.java
rename to core-java-lang/src/main/java/com/baeldung/assertion/Assertion.java
diff --git a/core-java/src/main/java/com/baeldung/binding/Animal.java b/core-java-lang/src/main/java/com/baeldung/binding/Animal.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/binding/Animal.java
rename to core-java-lang/src/main/java/com/baeldung/binding/Animal.java
diff --git a/core-java/src/main/java/com/baeldung/binding/AnimalActivity.java b/core-java-lang/src/main/java/com/baeldung/binding/AnimalActivity.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/binding/AnimalActivity.java
rename to core-java-lang/src/main/java/com/baeldung/binding/AnimalActivity.java
diff --git a/core-java/src/main/java/com/baeldung/binding/Cat.java b/core-java-lang/src/main/java/com/baeldung/binding/Cat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/binding/Cat.java
rename to core-java-lang/src/main/java/com/baeldung/binding/Cat.java
diff --git a/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
rename to core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
index ce85b487c1..23bb531273 100644
--- a/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
+++ b/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
@@ -11,6 +11,7 @@ import java.util.Map.Entry;
* @author Santosh
*
*/
+
public class BreakContinue {
public static int unlabeledBreak() {
diff --git a/core-java/src/main/java/com/baeldung/casting/Animal.java b/core-java-lang/src/main/java/com/baeldung/casting/Animal.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Animal.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Animal.java
diff --git a/core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java
rename to core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java
diff --git a/core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
rename to core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
diff --git a/core-java/src/main/java/com/baeldung/casting/Cat.java b/core-java-lang/src/main/java/com/baeldung/casting/Cat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Cat.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Cat.java
diff --git a/core-java/src/main/java/com/baeldung/casting/Dog.java b/core-java-lang/src/main/java/com/baeldung/casting/Dog.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Dog.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Dog.java
diff --git a/core-java/src/main/java/com/baeldung/casting/Mew.java b/core-java-lang/src/main/java/com/baeldung/casting/Mew.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Mew.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Mew.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
diff --git a/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java b/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java
new file mode 100644
index 0000000000..ab6c8a51ff
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java
@@ -0,0 +1,9 @@
+package com.baeldung.className;
+
+public class RetrievingClassName {
+
+ public class InnerClass {
+
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparable/Player.java b/core-java-lang/src/main/java/com/baeldung/comparable/Player.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparable/Player.java
rename to core-java-lang/src/main/java/com/baeldung/comparable/Player.java
diff --git a/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java b/core-java-lang/src/main/java/com/baeldung/comparable/PlayerSorter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java
rename to core-java-lang/src/main/java/com/baeldung/comparable/PlayerSorter.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/Player.java b/core-java-lang/src/main/java/com/baeldung/comparator/Player.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/Player.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/Player.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java
new file mode 100644
index 0000000000..3d50e85245
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java
@@ -0,0 +1,56 @@
+package com.baeldung.constructors;
+
+import java.time.LocalDateTime;
+
+class BankAccount {
+ String name;
+ LocalDateTime opened;
+ double balance;
+
+ @Override
+ public String toString() {
+ return String.format("%s, %s, %f", this.name, this.opened.toString(), this.balance);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public LocalDateTime getOpened() {
+ return opened;
+ }
+
+ public double getBalance() {
+ return this.balance;
+ }
+}
+
+class BankAccountEmptyConstructor extends BankAccount {
+ public BankAccountEmptyConstructor() {
+ this.name = "";
+ this.opened = LocalDateTime.now();
+ this.balance = 0.0d;
+ }
+}
+
+class BankAccountParameterizedConstructor extends BankAccount {
+ public BankAccountParameterizedConstructor(String name, LocalDateTime opened, double balance) {
+ this.name = name;
+ this.opened = opened;
+ this.balance = balance;
+ }
+}
+
+class BankAccountCopyConstructor extends BankAccount {
+ public BankAccountCopyConstructor(String name, LocalDateTime opened, double balance) {
+ this.name = name;
+ this.opened = opened;
+ this.balance = balance;
+ }
+
+ public BankAccountCopyConstructor(BankAccount other) {
+ this.name = other.name;
+ this.opened = LocalDateTime.now();
+ this.balance = 0.0f;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java
new file mode 100644
index 0000000000..14704f507a
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java
@@ -0,0 +1,25 @@
+package com.baeldung.constructors;
+
+import java.time.LocalDateTime;
+
+class Transaction {
+ final BankAccountEmptyConstructor bankAccount;
+ final LocalDateTime date;
+ final double amount;
+
+ public Transaction(BankAccountEmptyConstructor account, LocalDateTime date, double amount) {
+ this.bankAccount = account;
+ this.date = date;
+ this.amount = amount;
+ }
+
+ /*
+ * Compilation Error :'(, all final variables must be explicitly initialised.
+ * public Transaction() {
+ * }
+ */
+
+ public void invalidMethod() {
+ // this.amount = 102.03; // Results in a compiler error. You cannot change the value of a final variable.
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/customexception/FileManager.java b/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/customexception/FileManager.java
rename to core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java
diff --git a/core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java b/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
rename to core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
diff --git a/core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java b/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
rename to core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
diff --git a/core-java/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/deepcopy/Address.java
rename to core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java
diff --git a/core-java/src/main/java/com/baeldung/deepcopy/User.java b/core-java-lang/src/main/java/com/baeldung/deepcopy/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/deepcopy/User.java
rename to core-java-lang/src/main/java/com/baeldung/deepcopy/User.java
diff --git a/core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java b/core-java-lang/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
rename to core-java-lang/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
diff --git a/core-java/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java b/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
rename to core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
diff --git a/core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java b/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
rename to core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
diff --git a/core-java/src/main/java/com/baeldung/enums/Pizza.java b/core-java-lang/src/main/java/com/baeldung/enums/Pizza.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/Pizza.java
rename to core-java-lang/src/main/java/com/baeldung/enums/Pizza.java
diff --git a/core-java/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java b/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
rename to core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
diff --git a/core-java/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java b/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
rename to core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
diff --git a/core-java/src/main/java/com/baeldung/enums/README.md b/core-java-lang/src/main/java/com/baeldung/enums/README.md
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/README.md
rename to core-java-lang/src/main/java/com/baeldung/enums/README.md
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java
new file mode 100644
index 0000000000..60c043545d
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java
@@ -0,0 +1,36 @@
+package com.baeldung.equalshashcode;
+
+class Money {
+
+ int amount;
+ String currencyCode;
+
+ Money(int amount, String currencyCode) {
+ this.amount = amount;
+ this.currencyCode = currencyCode;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Money))
+ return false;
+ Money other = (Money)o;
+ boolean currencyCodeEquals = (this.currencyCode == null && other.currencyCode == null)
+ || (this.currencyCode != null && this.currencyCode.equals(other.currencyCode));
+ return this.amount == other.amount
+ && currencyCodeEquals;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + amount;
+ if (currencyCode != null) {
+ result = 31 * result + currencyCode.hashCode();
+ }
+ return result;
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java
new file mode 100644
index 0000000000..c2dee1de6b
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java
@@ -0,0 +1,39 @@
+package com.baeldung.equalshashcode;
+
+class Team {
+
+ final String city;
+ final String department;
+
+ Team(String city, String department) {
+ this.city = city;
+ this.department = department;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Team))
+ return false;
+ Team otherTeam = (Team)o;
+ boolean cityEquals = (this.city == null && otherTeam.city == null)
+ || this.city != null && this.city.equals(otherTeam.city);
+ boolean departmentEquals = (this.department == null && otherTeam.department == null)
+ || this.department != null && this.department.equals(otherTeam.department);
+ return cityEquals && departmentEquals;
+ }
+
+ @Override
+ public final int hashCode() {
+ int result = 17;
+ if (city != null) {
+ result = 31 * result + city.hashCode();
+ }
+ if (department != null) {
+ result = 31 * result + department.hashCode();
+ }
+ return result;
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java
new file mode 100644
index 0000000000..19f46e0358
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java
@@ -0,0 +1,38 @@
+package com.baeldung.equalshashcode;
+
+class Voucher {
+
+ private Money value;
+ private String store;
+
+ Voucher(int amount, String currencyCode, String store) {
+ this.value = new Money(amount, currencyCode);
+ this.store = store;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Voucher))
+ return false;
+ Voucher other = (Voucher)o;
+ boolean valueEquals = (this.value == null && other.value == null)
+ || (this.value != null && this.value.equals(other.value));
+ boolean storeEquals = (this.store == null && other.store == null)
+ || (this.store != null && this.store.equals(other.store));
+ return valueEquals && storeEquals;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ if (this.value != null) {
+ result = 31 * result + value.hashCode();
+ }
+ if (this.store != null) {
+ result = 31 * result + store.hashCode();
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
new file mode 100644
index 0000000000..c4477aa790
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
@@ -0,0 +1,30 @@
+package com.baeldung.equalshashcode;
+
+/* (non-Javadoc)
+* This class overrides equals, but it doesn't override hashCode.
+*
+* To see which problems this leads to:
+* TeamUnitTest.givenMapKeyWithoutHashCode_whenSearched_thenReturnsWrongValue
+*/
+class WrongTeam {
+
+ String city;
+ String department;
+
+ WrongTeam(String city, String department) {
+ this.city = city;
+ this.department = department;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof WrongTeam))
+ return false;
+ WrongTeam otherTeam = (WrongTeam)o;
+ return this.city == otherTeam.city
+ && this.department == otherTeam.department;
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
new file mode 100644
index 0000000000..97935bf8de
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
@@ -0,0 +1,47 @@
+package com.baeldung.equalshashcode;
+
+/* (non-Javadoc)
+* This class extends the Money class that has overridden the equals method and once again overrides the equals method.
+*
+* To see which problems this leads to:
+* MoneyUnitTest.givenMoneyAndVoucherInstances_whenEquals_thenReturnValuesArentSymmetric
+*/
+class WrongVoucher extends Money {
+
+ private String store;
+
+ WrongVoucher(int amount, String currencyCode, String store) {
+ super(amount, currencyCode);
+
+ this.store = store;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof WrongVoucher))
+ return false;
+ WrongVoucher other = (WrongVoucher)o;
+ boolean currencyCodeEquals = (this.currencyCode == null && other.currencyCode == null)
+ || (this.currencyCode != null && this.currencyCode.equals(other.currencyCode));
+ boolean storeEquals = (this.store == null && other.store == null)
+ || (this.store != null && this.store.equals(other.store));
+ return this.amount == other.amount
+ && currencyCodeEquals
+ && storeEquals;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + amount;
+ if (this.currencyCode != null) {
+ result = 31 * result + currencyCode.hashCode();
+ }
+ if (this.store != null) {
+ result = 31 * result + store.hashCode();
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/Exceptions.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/MyException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/MyException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/Player.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/Player.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
diff --git a/core-java/src/main/java/com/baeldung/finalize/CloseableResource.java b/core-java-lang/src/main/java/com/baeldung/finalize/CloseableResource.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalize/CloseableResource.java
rename to core-java-lang/src/main/java/com/baeldung/finalize/CloseableResource.java
diff --git a/core-java/src/main/java/com/baeldung/finalize/Finalizable.java b/core-java-lang/src/main/java/com/baeldung/finalize/Finalizable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalize/Finalizable.java
rename to core-java-lang/src/main/java/com/baeldung/finalize/Finalizable.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/BlackCat.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/BlackDog.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/Cat.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/Dog.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java
diff --git a/core-java/src/main/java/com/baeldung/generics/Building.java b/core-java-lang/src/main/java/com/baeldung/generics/Building.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/generics/Building.java
rename to core-java-lang/src/main/java/com/baeldung/generics/Building.java
diff --git a/core-java/src/main/java/com/baeldung/generics/Generics.java b/core-java-lang/src/main/java/com/baeldung/generics/Generics.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/generics/Generics.java
rename to core-java-lang/src/main/java/com/baeldung/generics/Generics.java
diff --git a/core-java/src/main/java/com/baeldung/generics/House.java b/core-java-lang/src/main/java/com/baeldung/generics/House.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/generics/House.java
rename to core-java-lang/src/main/java/com/baeldung/generics/House.java
diff --git a/core-java/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/hashcode/entities/User.java
rename to core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java
diff --git a/core-java/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/BMW.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Car.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Car.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Car.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Car.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Employee.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Floatable.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Flyable.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/initializationguide/User.java
rename to core-java-lang/src/main/java/com/baeldung/initializationguide/User.java
diff --git a/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java b/core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
diff --git a/core-java/src/main/java/com/baeldung/interfaces/Customer.java b/core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/interfaces/Customer.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Animal.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Animal.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Bird.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Bird.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Eating.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Eating.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Goat.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Goat.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Greeter.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Greeter.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Greetings.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Greetings.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Locomotion.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Locomotion.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Operations.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Operations.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Person.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Person.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/KeywordDemo.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalkeyword/Child.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java b/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
diff --git a/core-java/src/main/java/com/baeldung/loops/InfiniteLoops.java b/core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/loops/InfiniteLoops.java
rename to core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java
diff --git a/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/loops/LoopsInJava.java
rename to core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
diff --git a/core-java/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java b/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
rename to core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
diff --git a/core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java b/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
rename to core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
diff --git a/core-java/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java b/core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
rename to core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
diff --git a/core-java/src/main/java/com/baeldung/parameterpassing/Primitives.java b/core-java-lang/src/main/java/com/baeldung/parameterpassing/Primitives.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/parameterpassing/Primitives.java
rename to core-java-lang/src/main/java/com/baeldung/parameterpassing/Primitives.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/FileManager.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/TextFile.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java
diff --git a/core-java/src/main/java/com/baeldung/recursion/BinaryNode.java b/core-java-lang/src/main/java/com/baeldung/recursion/BinaryNode.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/recursion/BinaryNode.java
rename to core-java-lang/src/main/java/com/baeldung/recursion/BinaryNode.java
diff --git a/core-java/src/main/java/com/baeldung/recursion/RecursionExample.java b/core-java-lang/src/main/java/com/baeldung/recursion/RecursionExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/recursion/RecursionExample.java
rename to core-java-lang/src/main/java/com/baeldung/recursion/RecursionExample.java
diff --git a/core-java/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
rename to core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
diff --git a/core-java/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
rename to core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
diff --git a/core-java/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
rename to core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/ChildVariable.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/HideVariable.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/ParentVariable.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
diff --git a/core-java/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java b/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
rename to core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
diff --git a/core-java/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java b/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
rename to core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
diff --git a/core-java/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/staticdemo/Car.java
rename to core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java
diff --git a/core-java/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/staticdemo/Singleton.java
rename to core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java
diff --git a/core-java/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/staticdemo/StaticBlock.java
rename to core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java
diff --git a/core-java/src/main/java/com/baeldung/switchstatement/SwitchStatement.java b/core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
rename to core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/ChatWindow.java
rename to core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
diff --git a/core-java/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/DateTimeService.java
rename to core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
diff --git a/core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java
rename to core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
diff --git a/core-java/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/SystemErrDemo.java
rename to core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/SystemExitDemo.java
rename to core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/SystemOutDemo.java
rename to core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/UserCredentials.java
rename to core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/DataAccessException.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/DataAccessException.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/Main.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/Main.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/SimpleService.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/SimpleService.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/TryCatch.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/TryCatch.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/Stack.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java
diff --git a/core-java/src/main/resources/file.txt b/core-java-lang/src/main/resources/file.txt
similarity index 100%
rename from core-java/src/main/resources/file.txt
rename to core-java-lang/src/main/resources/file.txt
diff --git a/core-java/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java b/core-java-lang/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/binding/AnimalUnitTest.java b/core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/binding/AnimalUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/binding/CatUnitTest.java b/core-java-lang/src/test/java/com/baeldung/binding/CatUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/binding/CatUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/binding/CatUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java b/core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/casting/CastingUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java b/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java
new file mode 100644
index 0000000000..f9dbf91d2c
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java
@@ -0,0 +1,156 @@
+package com.baeldung.className;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class RetrievingClassNameUnitTest {
+
+ // Retrieving Simple Name
+ @Test
+ public void givenRetrievingClassName_whenGetSimpleName_thenRetrievingClassName() {
+ assertEquals("RetrievingClassName", RetrievingClassName.class.getSimpleName());
+ }
+
+ @Test
+ public void givenPrimitiveInt_whenGetSimpleName_thenInt() {
+ assertEquals("int", int.class.getSimpleName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetSimpleName_thenRetrievingClassNameWithBrackets() {
+ assertEquals("RetrievingClassName[]", RetrievingClassName[].class.getSimpleName());
+ assertEquals("RetrievingClassName[][]", RetrievingClassName[][].class.getSimpleName());
+ }
+
+ @Test
+ public void givenAnonymousClass_whenGetSimpleName_thenEmptyString() {
+ assertEquals("", new RetrievingClassName() {}.getClass().getSimpleName());
+ }
+
+ // Retrieving Other Names
+ // - Primitive Types
+ @Test
+ public void givenPrimitiveInt_whenGetName_thenInt() {
+ assertEquals("int", int.class.getName());
+ }
+
+ @Test
+ public void givenPrimitiveInt_whenGetTypeName_thenInt() {
+ assertEquals("int", int.class.getTypeName());
+ }
+
+ @Test
+ public void givenPrimitiveInt_whenGetCanonicalName_thenInt() {
+ assertEquals("int", int.class.getCanonicalName());
+ }
+
+ // - Object Types
+ @Test
+ public void givenRetrievingClassName_whenGetName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassName_whenGetTypeName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassName_whenGetCanonicalName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getCanonicalName());
+ }
+
+ // - Inner Classes
+ @Test
+ public void givenRetrievingClassNameInnerClass_whenGetName_thenCanonicalNameWithDollarSeparator() {
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass", RetrievingClassName.InnerClass.class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClass_whenGetTypeName_thenCanonicalNameWithDollarSeparator() {
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass", RetrievingClassName.InnerClass.class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClass_whenGetCanonicalName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName.InnerClass", RetrievingClassName.InnerClass.class.getCanonicalName());
+ }
+
+ // - Anonymous Classes
+ @Test
+ public void givenAnonymousClass_whenGetName_thenCallingClassCanonicalNameWithDollarSeparatorAndCountNumber() {
+ // These are the second and third appearences of an anonymous class in RetrievingClassNameUnitTest, hence $2 and $3 expectations
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$2", new RetrievingClassName() {}.getClass().getName());
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$3", new RetrievingClassName() {}.getClass().getName());
+ }
+
+ @Test
+ public void givenAnonymousClass_whenGetTypeName_thenCallingClassCanonicalNameWithDollarSeparatorAndCountNumber() {
+ // These are the fourth and fifth appearences of an anonymous class in RetrievingClassNameUnitTest, hence $4 and $5 expectations
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$4", new RetrievingClassName() {}.getClass().getTypeName());
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$5", new RetrievingClassName() {}.getClass().getTypeName());
+ }
+
+ @Test
+ public void givenAnonymousClass_whenGetCanonicalName_thenNull() {
+ assertNull(new RetrievingClassName() {}.getClass().getCanonicalName());
+ }
+
+ // - Arrays
+ @Test
+ public void givenPrimitiveIntArray_whenGetName_thenOpeningBracketsAndPrimitiveIntLetter() {
+ assertEquals("[I", int[].class.getName());
+ assertEquals("[[I", int[][].class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetName_thenOpeningBracketsLetterLAndRetrievingClassNameGetName() {
+ assertEquals("[Lcom.baeldung.className.RetrievingClassName;", RetrievingClassName[].class.getName());
+ assertEquals("[[Lcom.baeldung.className.RetrievingClassName;", RetrievingClassName[][].class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClassArray_whenGetName_thenOpeningBracketsLetterLAndRetrievingClassNameInnerClassGetName() {
+ assertEquals("[Lcom.baeldung.className.RetrievingClassName$InnerClass;", RetrievingClassName.InnerClass[].class.getName());
+ assertEquals("[[Lcom.baeldung.className.RetrievingClassName$InnerClass;", RetrievingClassName.InnerClass[][].class.getName());
+ }
+
+ @Test
+ public void givenPrimitiveIntArray_whenGetTypeName_thenPrimitiveIntGetTypeNameWithBrackets() {
+ assertEquals("int[]", int[].class.getTypeName());
+ assertEquals("int[][]", int[][].class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetTypeName_thenRetrievingClassNameGetTypeNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName[]", RetrievingClassName[].class.getTypeName());
+ assertEquals("com.baeldung.className.RetrievingClassName[][]", RetrievingClassName[][].class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClassArray_whenGetTypeName_thenRetrievingClassNameInnerClassGetTypeNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass[]", RetrievingClassName.InnerClass[].class.getTypeName());
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass[][]", RetrievingClassName.InnerClass[][].class.getTypeName());
+ }
+
+ @Test
+ public void givenPrimitiveIntArray_whenGetCanonicalName_thenPrimitiveIntGetCanonicalNameWithBrackets() {
+ assertEquals("int[]", int[].class.getCanonicalName());
+ assertEquals("int[][]", int[][].class.getCanonicalName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetCanonicalName_thenRetrievingClassNameGetCanonicalNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName[]", RetrievingClassName[].class.getCanonicalName());
+ assertEquals("com.baeldung.className.RetrievingClassName[][]", RetrievingClassName[][].class.getCanonicalName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClassArray_whenGetCanonicalName_thenRetrievingClassNameInnerClassGetCanonicalNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName.InnerClass[]", RetrievingClassName.InnerClass[].class.getCanonicalName());
+ assertEquals("com.baeldung.className.RetrievingClassName.InnerClass[][]", RetrievingClassName.InnerClass[][].class.getCanonicalName());
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java b/core-java-lang/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
new file mode 100644
index 0000000000..532776edd4
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
@@ -0,0 +1,111 @@
+package com.baeldung.compoundoperators;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CompoundOperatorsUnitTest {
+
+ @Test
+ public void whenAssignmentOperatorIsUsed_thenValueIsAssigned() {
+ int x = 5;
+
+ assertEquals(5, x);
+ }
+
+ @Test
+ public void whenCompoundAssignmentUsed_thenSameAsSimpleAssignment() {
+ int a = 3, b = 3, c = -2;
+ a = a * c; // Simple assignment operator
+ b *= c; // Compound assignment operator
+
+ assertEquals(a, b);
+ }
+
+ @Test
+ public void whenAssignmentOperatorIsUsed_thenValueIsReturned() {
+ long x = 1;
+ long y = (x+=2);
+
+ assertEquals(3, y);
+ assertEquals(y, x);
+ }
+
+ @Test
+ public void whenCompoundOperatorsAreUsed_thenOperationsArePerformedAndAssigned() {
+ //Simple assignment
+ int x = 5; //x is 5
+
+ //Incrementation
+ x += 5; //x is 10
+ assertEquals(10, x);
+
+ //Decrementation
+ x -= 2; //x is 8
+ assertEquals(8, x);
+
+ //Multiplication
+ x *= 2; //x is 16
+ assertEquals(16, x);
+
+ //Division
+ x /= 4; //x is 4
+ assertEquals(4, x);
+
+ //Modulus
+ x %= 3; //x is 1
+ assertEquals(1, x);
+
+
+ //Binary AND
+ x &= 4; //x is 0
+ assertEquals(0, x);
+
+ //Binary exclusive OR
+ x ^= 4; //x is 4
+ assertEquals(4, x);
+
+ //Binary inclusive OR
+ x |= 8; //x is 12
+ assertEquals(12, x);
+
+
+ //Binary Left Shift
+ x <<= 2; //x is 48
+ assertEquals(48, x);
+
+ //Binary Right Shift
+ x >>= 2; //x is 12
+ assertEquals(12, x);
+
+ //Shift right zero fill
+ x >>>= 1; //x is 6
+ assertEquals(6, x);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void whenArrayIsNull_thenThrowNullException() {
+ int[] numbers = null;
+
+ //Trying Incrementation
+ numbers[2] += 5;
+ }
+
+ @Test(expected = ArrayIndexOutOfBoundsException.class)
+ public void whenArrayIndexNotCorrect_thenThrowArrayIndexException() {
+ int[] numbers = {0, 1};
+
+ //Trying Incrementation
+ numbers[2] += 5;
+ }
+
+ @Test
+ public void whenArrayIndexIsCorrect_thenPerformOperation() {
+ int[] numbers = {0, 1};
+
+ //Incrementation
+ numbers[1] += 5;
+ assertEquals(6, numbers[1]);
+ }
+
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
new file mode 100644
index 0000000000..2cd8832fbf
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.constructors;
+
+import com.baeldung.constructors.*;
+
+import java.util.logging.Logger;
+import java.time.LocalDateTime;
+import java.time.Month;
+
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+public class ConstructorUnitTest {
+ final static Logger LOGGER = Logger.getLogger(ConstructorUnitTest.class.getName());
+
+ @Test
+ public void givenNoExplicitContructor_whenUsed_thenFails() {
+ BankAccount account = new BankAccount();
+ assertThatThrownBy(() -> { account.toString(); }).isInstanceOf(Exception.class);
+ }
+
+ @Test
+ public void givenNoArgumentConstructor_whenUsed_thenSucceeds() {
+ BankAccountEmptyConstructor account = new BankAccountEmptyConstructor();
+ assertThatCode(() -> {
+ account.toString();
+ }).doesNotThrowAnyException();
+ }
+
+ @Test
+ public void givenParameterisedConstructor_whenUsed_thenSucceeds() {
+ LocalDateTime opened = LocalDateTime.of(2018, Month.JUNE, 29, 06, 30, 00);
+ BankAccountParameterizedConstructor account =
+ new BankAccountParameterizedConstructor("Tom", opened, 1000.0f);
+
+ assertThatCode(() -> {
+ account.toString();
+ }).doesNotThrowAnyException();
+ }
+
+ @Test
+ public void givenCopyContructor_whenUser_thenMaintainsLogic() {
+ LocalDateTime opened = LocalDateTime.of(2018, Month.JUNE, 29, 06, 30, 00);
+ BankAccountCopyConstructor account = new BankAccountCopyConstructor("Tim", opened, 1000.0f);
+ BankAccountCopyConstructor newAccount = new BankAccountCopyConstructor(account);
+
+ assertThat(account.getName()).isEqualTo(newAccount.getName());
+ assertThat(account.getOpened()).isNotEqualTo(newAccount.getOpened());
+
+ assertThat(newAccount.getBalance()).isEqualTo(0.0f);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
index 196b69fbf7..d6b1cd90b9 100644
--- a/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
@@ -4,7 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
-import org.apache.commons.lang.SerializationUtils;
+import org.apache.commons.lang3.SerializationUtils;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
new file mode 100644
index 0000000000..60584fdb53
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.equalshashcode;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Test;
+
+public class MoneyUnitTest {
+
+ @Test
+ public void givenMoneyInstancesWithSameAmountAndCurrency_whenEquals_thenReturnsTrue() {
+ Money income = new Money(55, "USD");
+ Money expenses = new Money(55, "USD");
+
+ assertTrue(income.equals(expenses));
+ }
+
+ @Test
+ public void givenMoneyAndVoucherInstances_whenEquals_thenReturnValuesArentSymmetric() {
+ Money cash = new Money(42, "USD");
+ WrongVoucher voucher = new WrongVoucher(42, "USD", "Amazon");
+
+ assertFalse(voucher.equals(cash));
+ assertTrue(cash.equals(voucher));
+ }
+
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
new file mode 100644
index 0000000000..a2de408796
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.equalshashcode;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class TeamUnitTest {
+
+ @Test
+ public void givenMapKeyWithHashCode_whenSearched_thenReturnsCorrectValue() {
+ Map leaders = new HashMap<>();
+ leaders.put(new Team("New York", "development"), "Anne");
+ leaders.put(new Team("Boston", "development"), "Brian");
+ leaders.put(new Team("Boston", "marketing"), "Charlie");
+
+ Team myTeam = new Team("New York", "development");
+ String myTeamleader = leaders.get(myTeam);
+
+ assertEquals("Anne", myTeamleader);
+ }
+
+ @Test
+ public void givenMapKeyWithoutHashCode_whenSearched_thenReturnsWrongValue() {
+ Map leaders = new HashMap<>();
+ leaders.put(new WrongTeam("New York", "development"), "Anne");
+ leaders.put(new WrongTeam("Boston", "development"), "Brian");
+ leaders.put(new WrongTeam("Boston", "marketing"), "Charlie");
+
+ WrongTeam myTeam = new WrongTeam("New York", "development");
+ String myTeamleader = leaders.get(myTeam);
+
+ assertFalse("Anne".equals(myTeamleader));
+ }
+
+ @Test
+ public void equalsContract() {
+ EqualsVerifier.forClass(Team.class).verify();
+ }
+
+}
diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
similarity index 95%
rename from core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
index 680a6d57b5..0cb4ace0ab 100644
--- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.equalshashcode.entities;
+package com.baeldung.equalshashcode.entities;
import java.util.ArrayList;
import java.util.HashSet;
diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
similarity index 85%
rename from core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
index f4e9f2b99f..457d7a2b5e 100644
--- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
@@ -1,10 +1,8 @@
-package org.baeldung.equalshashcode.entities;
+package com.baeldung.equalshashcode.entities;
import org.junit.Assert;
import org.junit.Test;
-import com.baeldung.equalshashcode.entities.PrimitiveClass;
-
public class PrimitiveClassUnitTest {
@Test
diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
similarity index 93%
rename from core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
index 5c860bd62d..a25e8bd486 100644
--- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.equalshashcode.entities;
+package com.baeldung.equalshashcode.entities;
import java.awt.Color;
diff --git a/core-java/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java b/core-java-lang/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/generics/GenericsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/generics/GenericsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritance/AppUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Car.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
similarity index 64%
rename from core-java/src/test/java/org/baeldung/java/diamond/Car.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
index 9f923e0f3b..a680c4e670 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Car.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public class Car implements Vehicle {
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
similarity index 88%
rename from core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
index f6c7f7162f..ee5f639926 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
import static org.junit.Assert.assertNotNull;
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
similarity index 78%
rename from core-java/src/test/java/org/baeldung/java/diamond/Diesel.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
index dc4256cdae..90eb7d9340 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public class Diesel implements Engine {
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Engine.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
similarity index 56%
rename from core-java/src/test/java/org/baeldung/java/diamond/Engine.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
index c18a8f64b5..746baf3254 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Engine.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public interface Engine {
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
similarity index 58%
rename from core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
index f61cf59620..8395cdd970 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public interface Vehicle {
diff --git a/core-java/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
diff --git a/core-java/src/main/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java b/core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
rename to core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
diff --git a/core-java/src/main/java/com/baeldung/java/enumiteration/EnumIterationExamples.java b/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
rename to core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
diff --git a/core-java/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java
rename to core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java
diff --git a/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/Outer.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java
diff --git a/core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java b/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
similarity index 99%
rename from core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
index 69a6c18dfd..cb83f4a5ed 100644
--- a/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.primitiveconversion;
import org.junit.Test;
import org.slf4j.Logger;
diff --git a/core-java/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java b/core-java-lang/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java b/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java b/core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java b/core-java-lang/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/varargs/FormatterUnitTest.java b/core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
diff --git a/core-java/src/test/resources/correctFileNameWithoutProperExtension b/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension
similarity index 100%
rename from core-java/src/test/resources/correctFileNameWithoutProperExtension
rename to core-java-lang/src/test/resources/correctFileNameWithoutProperExtension
diff --git a/core-java-networking/.gitignore b/core-java-networking/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-networking/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-networking/README.md b/core-java-networking/README.md
new file mode 100644
index 0000000000..626ea794e6
--- /dev/null
+++ b/core-java-networking/README.md
@@ -0,0 +1,7 @@
+=========
+
+## Core Java Networking
+
+### Relevant Articles
+
+- [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server)
diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml
new file mode 100644
index 0000000000..178295e1ec
--- /dev/null
+++ b/core-java-networking/pom.xml
@@ -0,0 +1,19 @@
+
+ 4.0.0
+ core-java-networking
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-networking
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+ core-java-networking
+
+
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java
new file mode 100644
index 0000000000..bbc8a81c98
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java
@@ -0,0 +1,17 @@
+package com.baeldung.networking.proxies;
+
+import java.net.URL;
+import java.net.URLConnection;
+
+public class CommandLineProxyDemo {
+
+ public static final String RESOURCE_URL = "http://www.google.com";
+
+ public static void main(String[] args) throws Exception {
+
+ URL url = new URL(RESOURCE_URL);
+ URLConnection con = url.openConnection();
+ System.out.println(UrlConnectionUtils.contentAsString(con));
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java
new file mode 100644
index 0000000000..07a7880886
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java
@@ -0,0 +1,20 @@
+package com.baeldung.networking.proxies;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.Proxy;
+import java.net.URL;
+
+public class DirectProxyDemo {
+
+ private static final String URL_STRING = "http://www.google.com";
+
+ public static void main(String... args) throws IOException {
+
+ URL weburl = new URL(URL_STRING);
+ HttpURLConnection directConnection
+ = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);
+ System.out.println(UrlConnectionUtils.contentAsString(directConnection));
+ }
+
+}
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java
new file mode 100644
index 0000000000..e7ac3c0264
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java
@@ -0,0 +1,32 @@
+package com.baeldung.networking.proxies;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.Socket;
+import java.net.URL;
+
+public class SocksProxyDemo {
+
+ private static final String URL_STRING = "http://www.google.com";
+ private static final String SOCKET_SERVER_HOST = "someserver.baeldung.com";
+ private static final int SOCKET_SERVER_PORT = 1111;
+
+ public static void main(String... args) throws IOException {
+
+ URL weburl = new URL(URL_STRING);
+ Proxy socksProxy
+ = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
+ HttpURLConnection socksConnection
+ = (HttpURLConnection) weburl.openConnection(socksProxy);
+ System.out.println(UrlConnectionUtils.contentAsString(socksConnection));
+
+ Socket proxySocket = new Socket(socksProxy);
+ InetSocketAddress socketHost
+ = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);
+ proxySocket.connect(socketHost);
+ // do stuff with the socket
+ }
+
+}
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java
new file mode 100644
index 0000000000..1f589eac58
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java
@@ -0,0 +1,23 @@
+package com.baeldung.networking.proxies;
+
+import java.net.URL;
+import java.net.URLConnection;
+
+public class SystemPropertyProxyDemo {
+
+ public static final String RESOURCE_URL = "http://www.google.com";
+
+ public static void main(String[] args) throws Exception {
+
+ System.setProperty("http.proxyHost", "127.0.0.1");
+ System.setProperty("http.proxyPort", "3128");
+
+ URL url = new URL(RESOURCE_URL);
+ URLConnection con = url.openConnection();
+ System.out.println(UrlConnectionUtils.contentAsString(con));
+
+ System.setProperty("http.proxyHost", null);
+ // proxy will no longer be used for http connections
+ }
+
+}
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java
new file mode 100644
index 0000000000..aa12824a90
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java
@@ -0,0 +1,21 @@
+package com.baeldung.networking.proxies;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URLConnection;
+
+class UrlConnectionUtils {
+
+ public static String contentAsString(URLConnection con) throws IOException {
+ StringBuilder builder = new StringBuilder();
+ try (BufferedReader reader
+ = new BufferedReader(new InputStreamReader(con.getInputStream()))){
+ while (reader.ready()) {
+ builder.append(reader.readLine());
+ }
+ }
+ return builder.toString();
+ }
+
+}
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java
new file mode 100644
index 0000000000..41caaf3439
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java
@@ -0,0 +1,23 @@
+package com.baeldung.networking.proxies;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.URL;
+
+public class WebProxyDemo {
+
+ private static final String URL_STRING = "http://www.google.com";
+
+ public static void main(String... args) throws IOException {
+
+ URL weburl = new URL(URL_STRING);
+ Proxy webProxy
+ = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
+ HttpURLConnection webProxyConnection
+ = (HttpURLConnection) weburl.openConnection(webProxy);
+ System.out.println(UrlConnectionUtils.contentAsString(webProxyConnection));
+ }
+
+}
diff --git a/spring-rest-template/.gitignore b/core-java-networking/src/test/resources/.gitignore
similarity index 92%
rename from spring-rest-template/.gitignore
rename to core-java-networking/src/test/resources/.gitignore
index afdfaa6ded..83c05e60c8 100644
--- a/spring-rest-template/.gitignore
+++ b/core-java-networking/src/test/resources/.gitignore
@@ -6,7 +6,6 @@
/data
/src/main/webapp/WEB-INF/classes
*/META-INF/*
-*/.idea/*
# Packaged files #
*.jar
diff --git a/core-java/README.md b/core-java/README.md
index 59aab91aa9..20f6ef5ea7 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -6,117 +6,56 @@
- [Java Timer](http://www.baeldung.com/java-timer-and-timertask)
- [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java)
- [MD5 Hashing in Java](http://www.baeldung.com/java-md5)
-- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets)
-- [Java – Try with Resources](http://www.baeldung.com/java-try-with-resources)
- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join)
- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
-- [Introduction to Java Generics](http://www.baeldung.com/java-generics)
-- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode)
- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java)
-- [Sorting in Java](http://www.baeldung.com/java-sorting)
- [Getting Started with Java Properties](http://www.baeldung.com/java-properties)
-- [Grep in Java](http://www.baeldung.com/grep-in-java)
-- [Simulated Annealing for Travelling Salesman Problem](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
-- [Slope One Algorithm: Collaborative Filtering Recommendation Systems](http://www.baeldung.com/java-collaborative-filtering-recommendations)
- [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java)
- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding)
-- [The Basics of Java Generics](http://www.baeldung.com/java-generics)
-- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm)
- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
-- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
-- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
- [JVM Log Forging](http://www.baeldung.com/jvm-log-forging)
- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe)
- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
-- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
- [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend)
-- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)
-- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
- [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null)
-- [Changing the Order in a Sum Operation Can Produce Different Results?](http://www.baeldung.com/java-floating-point-sum-order)
- [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method)
-- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies)
-- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy)
- [Converting a Stack Trace to a String in Java](http://www.baeldung.com/java-stacktrace-to-string)
-- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
-- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error)
- [Introduction to Java Serialization](http://www.baeldung.com/java-serialization)
-- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
- [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char)
-- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode)
- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri)
- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast)
- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
-- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
-- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws)
- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded)
- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
-- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
-- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
-- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
- [Quick Guide to Java Stack](http://www.baeldung.com/java-stack)
-- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter)
-- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
-- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class)
-- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
-- [Implementing a Binary Tree in Java](http://www.baeldung.com/java-binary-tree)
- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random)
-- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
-- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
-- [Varargs in Java](http://www.baeldung.com/java-varargs)
-- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
-- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
-- [Recursion In Java](http://www.baeldung.com/java-recursion)
-- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac)
-- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override)
-- [Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random)
- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator)
- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java)
- [Introduction to Javadoc](http://www.baeldung.com/javadoc)
-- [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)
- [Guide to Externalizable Interface in Java](http://www.baeldung.com/java-externalizable)
-- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting)
- [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat)
- [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os)
- [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java)
-- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
-- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max)
-- [The "final" Keyword in Java](http://www.baeldung.com/java-final)
- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java)
-- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
-- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
-- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
- [Class Loaders in Java](http://www.baeldung.com/java-classloaders)
-- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average)
-- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
-- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
-- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
-- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
- [Sending Emails with Java](http://www.baeldung.com/java-email)
- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl)
- [Java KeyStore API](http://www.baeldung.com/java-keystore)
- [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking)
- [Guide to Java Clock Class](http://www.baeldung.com/java-clock)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
-- [Using Java Assertions](http://www.baeldung.com/java-assert)
-- [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)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns)
- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns)
- [Singletons in Java](http://www.baeldung.com/java-singleton)
@@ -124,37 +63,32 @@
- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern)
- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern)
- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join)
-- [Guide to the super Java Keyword](http://www.baeldung.com/java-super)
-- [Guide to the this Java Keyword](http://www.baeldung.com/java-this)
-- [Jagged Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class)
- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension)
-- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object)
- [Console I/O in Java](http://www.baeldung.com/java-console-input-output)
-- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays)
-- [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception)
- [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler)
- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream)
- [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object)
-- [Exception Handling in Java](http://www.baeldung.com/java-exceptions)
- [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation)
- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
- [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions)
- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods)
-- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize)
-- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
-- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
-- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws)
-- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception)
- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string)
-- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
- [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)
- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture)
-- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing)
-- [Java Switch Statement](https://www.baeldung.com/java-switch)
-- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
-- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
+- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
+- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks)
+- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
+- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures)
+- [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree)
+- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order)
+- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources)
+- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
+- [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding)
+- [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)
+- [Graphs in Java](https://www.baeldung.com/java-graphs)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 477a01375d..64345ab14c 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -1,11 +1,10 @@
4.0.0
- com.baeldung
core-java
0.1.0-SNAPSHOT
- jar
core-java
+ jar
com.baeldung
@@ -157,7 +156,7 @@
com.sun
tools
- 1.8.0
+ ${sun.tools.version}
system
${java.home}/../lib/tools.jar
@@ -173,21 +172,6 @@
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*LiveTest.java
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
-
- true
-
-
-
org.apache.maven.plugins
maven-dependency-plugin
@@ -542,6 +526,7 @@
0.1.5
3.21.0-GA
+
+ 1.8.0
-
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java b/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
new file mode 100644
index 0000000000..3180762227
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
@@ -0,0 +1,29 @@
+package com.baeldung.abstractclasses.application;
+
+import com.baeldung.abstractclasses.filereaders.BaseFileReader;
+import com.baeldung.abstractclasses.filereaders.LowercaseFileReader;
+import com.baeldung.abstractclasses.filereaders.UppercaseFileReader;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class Application {
+
+ public static void main(String[] args) throws IOException, URISyntaxException {
+
+ Application application = new Application();
+ Path path = application.getPathFromResourcesFile("files/test.txt");
+ BaseFileReader lowercaseFileReader = new LowercaseFileReader(path);
+ lowercaseFileReader.readFile().forEach(line -> System.out.println(line));
+
+ BaseFileReader uppercaseFileReader = new UppercaseFileReader(path);
+ uppercaseFileReader.readFile().forEach(line -> System.out.println(line));
+
+ }
+
+ private Path getPathFromResourcesFile(String filePath) throws URISyntaxException {
+ return Paths.get(getClass().getClassLoader().getResource(filePath).toURI());
+
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
new file mode 100644
index 0000000000..97452a9eca
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
@@ -0,0 +1,27 @@
+package com.baeldung.abstractclasses.filereaders;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public abstract class BaseFileReader {
+
+ protected Path filePath;
+
+ protected BaseFileReader(Path filePath) {
+ this.filePath = filePath;
+ }
+
+ public Path getFilePath() {
+ return filePath;
+ }
+
+ public List readFile() throws IOException {
+ return Files.lines(filePath)
+ .map(this::mapFileLine).collect(Collectors.toList());
+ }
+
+ protected abstract String mapFileLine(String line);
+}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
new file mode 100644
index 0000000000..53820d393c
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
@@ -0,0 +1,15 @@
+package com.baeldung.abstractclasses.filereaders;
+
+import java.nio.file.Path;
+
+public class LowercaseFileReader extends BaseFileReader {
+
+ public LowercaseFileReader(Path filePath) {
+ super(filePath);
+ }
+
+ @Override
+ public String mapFileLine(String line) {
+ return line.toLowerCase();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
new file mode 100644
index 0000000000..3144a4f27f
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
@@ -0,0 +1,15 @@
+package com.baeldung.abstractclasses.filereaders;
+
+import java.nio.file.Path;
+
+public class UppercaseFileReader extends BaseFileReader {
+
+ public UppercaseFileReader(Path filePath) {
+ super(filePath);
+ }
+
+ @Override
+ public String mapFileLine(String line) {
+ return line.toUpperCase();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/area/circle/Circle.java b/core-java/src/main/java/com/baeldung/area/circle/Circle.java
new file mode 100644
index 0000000000..40eed079e4
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/area/circle/Circle.java
@@ -0,0 +1,26 @@
+package com.baeldung.area.circle;
+
+public class Circle {
+
+ private double radius;
+
+ public Circle(double radius) {
+ this.radius = radius;
+ }
+
+ public double getRadius() {
+ return radius;
+ }
+
+ public void setRadius(double radius) {
+ this.radius = radius;
+ }
+
+ private double calculateArea() {
+ return radius * radius * Math.PI;
+ }
+
+ public String toString() {
+ return "The area of the circle [radius = " + radius + "]: " + calculateArea();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java b/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java
new file mode 100644
index 0000000000..4d78637af6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java
@@ -0,0 +1,36 @@
+package com.baeldung.area.circle;
+
+import java.util.InputMismatchException;
+import java.util.Scanner;
+
+public class CircleArea {
+
+ public static void main(String[] args) {
+ if (args.length > 0) {
+ try {
+ double radius = Double.parseDouble(args[0]);
+ calculateArea(radius);
+ } catch (NumberFormatException nfe) {
+ System.out.println("Invalid value for radius");
+ System.exit(0);
+ }
+ }
+
+ try (Scanner scanner = new Scanner(System.in)) {
+ System.out.println("Please enter radius value: ");
+ double radius = scanner.nextDouble();
+ calculateArea(radius);
+ } catch (InputMismatchException e) {
+ System.out.println("Invalid value for radius");
+ System.exit(0);
+ }
+
+ Circle circle = new Circle(7);
+ System.out.println(circle);
+ }
+
+ private static void calculateArea(double radius) {
+ double area = radius * radius * Math.PI;
+ System.out.println("The area of the circle [radius = " + radius + "]: " + area);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java b/core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java
new file mode 100644
index 0000000000..20a13178cc
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java
@@ -0,0 +1,11 @@
+package com.baeldung.basicsyntax;
+
+public class SimpleAddition {
+
+ public static void main(String[] args) {
+ int a = 10;
+ int b = 5;
+ double c = a + b;
+ System.out.println( a + " + " + b + " = " + c);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
new file mode 100644
index 0000000000..bdd92e37f6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
@@ -0,0 +1,32 @@
+package com.baeldung.encoding;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+
+public class CharacterEncodingExamples {
+
+ static String readFile(String filePath, String encoding) throws IOException {
+ File file = new File(filePath);
+ StringBuffer buffer = new StringBuffer();
+ try (InputStreamReader isr = new InputStreamReader(new FileInputStream(file), encoding)) {
+ int data;
+ while ((data = isr.read()) != -1) {
+ buffer.append((char) data);
+ }
+ }
+ return buffer.toString();
+ }
+
+ static String convertToBinary(String input, String encoding) throws UnsupportedEncodingException {
+ byte[] bytes = input.getBytes(encoding);
+ StringBuffer buffer = new StringBuffer();
+ for (int b : bytes) {
+ buffer.append(Integer.toBinaryString((b + 256) % 256));
+ buffer.append(" ");
+ }
+ return buffer.toString();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/graph/Graph.java b/core-java/src/main/java/com/baeldung/graph/Graph.java
new file mode 100644
index 0000000000..43b5c0aa08
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/graph/Graph.java
@@ -0,0 +1,76 @@
+package com.baeldung.graph;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class Graph {
+ private Map> adjVertices;
+
+ Graph() {
+ this.adjVertices = new HashMap>();
+ }
+
+ void addVertex(String label) {
+ adjVertices.putIfAbsent(new Vertex(label), new ArrayList<>());
+ }
+
+ void removeVertex(String label) {
+ Vertex v = new Vertex(label);
+ adjVertices.values().stream().map(e -> e.remove(v)).collect(Collectors.toList());
+ adjVertices.remove(new Vertex(label));
+ }
+
+ void addEdge(String label1, String label2) {
+ Vertex v1 = new Vertex(label1);
+ Vertex v2 = new Vertex(label2);
+ adjVertices.get(v1).add(v2);
+ adjVertices.get(v2).add(v1);
+ }
+
+ void removeEdge(String label1, String label2) {
+ Vertex v1 = new Vertex(label1);
+ Vertex v2 = new Vertex(label2);
+ List eV1 = adjVertices.get(v1);
+ List eV2 = adjVertices.get(v2);
+ if (eV1 != null)
+ eV1.remove(v2);
+ if (eV2 != null)
+ eV2.remove(v1);
+ }
+
+ List getAdjVertices(String label) {
+ return adjVertices.get(new Vertex(label));
+ }
+
+ String printGraph() {
+ StringBuffer sb = new StringBuffer();
+ for(Vertex v : adjVertices.keySet()) {
+ sb.append(v);
+ sb.append(adjVertices.get(v));
+ }
+ return sb.toString();
+ }
+
+ class Vertex {
+ String label;
+ Vertex(String label) {
+ this.label = label;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ Vertex vertex = (Vertex) obj;
+ return vertex.label == label;
+ }
+ @Override
+ public int hashCode() {
+ return label.hashCode();
+ }
+ @Override
+ public String toString() {
+ return label;
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java b/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java
new file mode 100644
index 0000000000..479e653a5c
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java
@@ -0,0 +1,44 @@
+package com.baeldung.graph;
+
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+import java.util.Stack;
+
+import com.baeldung.graph.Graph.Vertex;
+
+public class GraphTraversal {
+ static Set depthFirstTraversal(Graph graph, String root) {
+ Set visited = new LinkedHashSet();
+ Stack stack = new Stack();
+ stack.push(root);
+ while (!stack.isEmpty()) {
+ String vertex = stack.pop();
+ if (!visited.contains(vertex)) {
+ visited.add(vertex);
+ for (Vertex v : graph.getAdjVertices(vertex)) {
+ stack.push(v.label);
+ }
+ }
+ }
+ return visited;
+ }
+
+ static Set breadthFirstTraversal(Graph graph, String root) {
+ Set visited = new LinkedHashSet();
+ Queue queue = new LinkedList();
+ queue.add(root);
+ visited.add(root);
+ while (!queue.isEmpty()) {
+ String vertex = queue.poll();
+ for (Vertex v : graph.getAdjVertices(vertex)) {
+ if (!visited.contains(v.label)) {
+ visited.add(v.label);
+ queue.add(v.label);
+ }
+ }
+ }
+ return visited;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java b/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java
new file mode 100644
index 0000000000..3d451f6f50
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java
@@ -0,0 +1,61 @@
+package com.baeldung.printf;
+
+import java.util.Date;
+import java.util.Locale;
+
+public class PrintfExamples {
+
+ public static void main(String[] args) {
+
+ printfNewLine();
+ printfChar();
+ printfString();
+ printfNumber();
+ printfDateTime();
+ printfBoolean();
+ }
+
+ private static void printfNewLine() {
+ System.out.printf("baeldung%nline%nterminator");
+ }
+
+ private static void printfString() {
+ System.out.printf("'%s' %n", "baeldung");
+ System.out.printf("'%S' %n", "baeldung");
+ System.out.printf("'%15s' %n", "baeldung");
+ System.out.printf("'%-10s' %n", "baeldung");
+ }
+
+ private static void printfChar() {
+ System.out.printf("%c%n", 's');
+ System.out.printf("%C%n", 's');
+ }
+
+ private static void printfNumber() {
+ System.out.printf("simple integer: %d%n", 10000L);
+
+ System.out.printf(Locale.US, "%,d %n", 10000);
+ System.out.printf(Locale.ITALY, "%,d %n", 10000);
+
+ System.out.printf("%f%n", 5.1473);
+ System.out.printf("'%5.2f'%n", 5.1473);
+ System.out.printf("'%5.2e'%n", 5.1473);
+ }
+
+ private static void printfBoolean() {
+ System.out.printf("%b%n", null);
+ System.out.printf("%B%n", false);
+ System.out.printf("%B%n", 5.3);
+ System.out.printf("%b%n", "random text");
+ }
+
+ private static void printfDateTime() {
+ Date date = new Date();
+ System.out.printf("%tT%n", date);
+ System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);
+ System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date);
+
+ System.out.printf("%1$tA %1$tB %1$tY %n", date);
+ System.out.printf("%1$td.%1$tm.%1$ty %n", date);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java b/core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java
index c641a58a78..d6efc34c3e 100644
--- a/core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java
+++ b/core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java
@@ -8,22 +8,26 @@ import java.net.Socket;
import javax.net.SocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.SSLParameters;
public class SimpleClient {
- static void startClient(String host, int port) throws IOException {
+ static String startClient(String host, int port) throws IOException {
SocketFactory factory = SSLSocketFactory.getDefault();
+
try (Socket connection = factory.createSocket(host, port)) {
((SSLSocket) connection).setEnabledCipherSuites(
new String[] { "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"});
((SSLSocket) connection).setEnabledProtocols(
new String[] { "TLSv1.2"});
- BufferedReader input = new BufferedReader(
- new InputStreamReader(connection.getInputStream()));
- System.out.println(input.readLine());
+ SSLParameters sslParams = new SSLParameters();
+ sslParams.setEndpointIdentificationAlgorithm("HTTPS");
+ ((SSLSocket) connection).setSSLParameters(sslParams);
+ BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ return input.readLine();
}
}
public static void main(String[] args) throws IOException {
- startClient("localhost", 1234);
+ System.out.println(startClient("localhost", 8443));
}
}
diff --git a/core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java b/core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java
index 3bbabdfbb8..27d15d04d7 100644
--- a/core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java
+++ b/core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java
@@ -4,7 +4,6 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
-import java.util.Date;
import javax.net.ServerSocketFactory;
import javax.net.ssl.SSLServerSocket;
@@ -13,6 +12,7 @@ import javax.net.ssl.SSLServerSocketFactory;
public class SimpleServer {
static void startServer(int port) throws IOException {
ServerSocketFactory factory = SSLServerSocketFactory.getDefault();
+
try (ServerSocket listener = factory.createServerSocket(port)) {
((SSLServerSocket) listener).setNeedClientAuth(true);
((SSLServerSocket) listener).setEnabledCipherSuites(
@@ -22,13 +22,13 @@ public class SimpleServer {
while (true) {
try (Socket socket = listener.accept()) {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
- out.println(new Date().toString());
+ out.println("Hello World!");
}
}
}
}
public static void main(String[] args) throws IOException {
- startServer(1234);
+ startServer(8443);
}
-}
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java
deleted file mode 100644
index 6329f41252..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-import java.util.List;
-import java.util.Set;
-
-public class ComplexClass {
-
- private List> genericList;
- private Set integerSet;
-
- public ComplexClass(List> genericArrayList, Set integerHashSet) {
- super();
- this.genericList = genericArrayList;
- this.integerSet = integerHashSet;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((genericList == null) ? 0 : genericList.hashCode());
- result = prime * result + ((integerSet == null) ? 0 : integerSet.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (!(obj instanceof ComplexClass))
- return false;
- ComplexClass other = (ComplexClass) obj;
- if (genericList == null) {
- if (other.genericList != null)
- return false;
- } else if (!genericList.equals(other.genericList))
- return false;
- if (integerSet == null) {
- if (other.integerSet != null)
- return false;
- } else if (!integerSet.equals(other.integerSet))
- return false;
- return true;
- }
-
- protected List> getGenericList() {
- return genericList;
- }
-
- protected void setGenericArrayList(List> genericList) {
- this.genericList = genericList;
- }
-
- protected Set getIntegerSet() {
- return integerSet;
- }
-
- protected void setIntegerSet(Set integerSet) {
- this.integerSet = integerSet;
- }
-}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java
deleted file mode 100644
index ebe005688c..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-public class PrimitiveClass {
-
- private boolean primitiveBoolean;
- private int primitiveInt;
-
- public PrimitiveClass(boolean primitiveBoolean, int primitiveInt) {
- super();
- this.primitiveBoolean = primitiveBoolean;
- this.primitiveInt = primitiveInt;
- }
-
- protected boolean isPrimitiveBoolean() {
- return primitiveBoolean;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + (primitiveBoolean ? 1231 : 1237);
- result = prime * result + primitiveInt;
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- PrimitiveClass other = (PrimitiveClass) obj;
- if (primitiveBoolean != other.primitiveBoolean)
- return false;
- if (primitiveInt != other.primitiveInt)
- return false;
- return true;
- }
-
- protected void setPrimitiveBoolean(boolean primitiveBoolean) {
- this.primitiveBoolean = primitiveBoolean;
- }
-
- protected int getPrimitiveInt() {
- return primitiveInt;
- }
-
- protected void setPrimitiveInt(int primitiveInt) {
- this.primitiveInt = primitiveInt;
- }
-}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java
deleted file mode 100644
index 5e38eb6088..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-public class Rectangle extends Shape {
- private double width;
- private double length;
-
- Rectangle(double width, double length) {
- this.width = width;
- this.length = length;
- }
-
- @Override
- public double area() {
- return width * length;
- }
-
- @Override
- public double perimeter() {
- return 2 * (width + length);
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- long temp;
- temp = Double.doubleToLongBits(length);
- result = prime * result + (int) (temp ^ (temp >>> 32));
- temp = Double.doubleToLongBits(width);
- result = prime * result + (int) (temp ^ (temp >>> 32));
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Rectangle other = (Rectangle) obj;
- if (Double.doubleToLongBits(length) != Double.doubleToLongBits(other.length))
- return false;
- if (Double.doubleToLongBits(width) != Double.doubleToLongBits(other.width))
- return false;
- return true;
- }
-
- protected double getWidth() {
- return width;
- }
-
- protected double getLength() {
- return length;
- }
-
-}
\ No newline at end of file
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java
deleted file mode 100644
index 3bfc81da8f..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-public abstract class Shape {
- public abstract double area();
-
- public abstract double perimeter();
-}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java
deleted file mode 100644
index f11e34f0ba..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-import java.awt.Color;
-
-public class Square extends Rectangle {
-
- Color color;
-
- public Square(double width, Color color) {
- super(width, width);
- this.color = color;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#hashCode()
- */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((color == null) ? 0 : color.hashCode());
- return result;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#equals(java.lang.Object)
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof Square)) {
- return false;
- }
- Square other = (Square) obj;
- if (color == null) {
- if (other.color != null) {
- return false;
- }
- } else if (!color.equals(other.color)) {
- return false;
- }
- return true;
- }
-
- protected Color getColor() {
- return color;
- }
-
- protected void setColor(Color color) {
- this.color = color;
- }
-
-}
diff --git a/core-java/src/main/resources/files/test.txt b/core-java/src/main/resources/files/test.txt
new file mode 100644
index 0000000000..08e53af69d
--- /dev/null
+++ b/core-java/src/main/resources/files/test.txt
@@ -0,0 +1,10 @@
+This is line 1
+This is line 2
+This is line 3
+This is line 4
+This is line 5
+This is line 6
+This is line 7
+This is line 8
+This is line 9
+This is line 10
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
new file mode 100644
index 0000000000..4f0d3a7cd5
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.abstractclasses.test;
+
+import com.baeldung.abstractclasses.filereaders.BaseFileReader;
+import com.baeldung.abstractclasses.filereaders.LowercaseFileReader;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
+
+public class LowercaseFileReaderUnitTest {
+
+ @Test
+ public void givenLowercaseFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
+ Path path = Paths.get(getClass().getClassLoader().getResource("files/test.txt").toURI());
+ BaseFileReader lowercaseFileReader = new LowercaseFileReader(path);
+
+ assertThat(lowercaseFileReader.readFile()).isInstanceOf(List.class);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
new file mode 100644
index 0000000000..e11db57000
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.abstractclasses.test;
+
+import com.baeldung.abstractclasses.filereaders.BaseFileReader;
+import com.baeldung.abstractclasses.filereaders.UppercaseFileReader;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
+
+public class UppercaseFileReaderUnitTest {
+
+ @Test
+ public void givenUppercaseFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
+ Path path = Paths.get(getClass().getClassLoader().getResource("files/test.txt").toURI());
+ BaseFileReader uppercaseFileReader = new UppercaseFileReader(path);
+
+ assertThat(uppercaseFileReader.readFile()).isInstanceOf(List.class);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
new file mode 100644
index 0000000000..95b3605d95
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.encoding;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CharacterEncodingExamplesUnitTest {
+
+ @Test
+ public void givenTextFile_whenCalledWithEncodingASCII_thenProduceIncorrectResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.readFile(
+ "src/test/resources/encoding.txt", "US-ASCII"),
+ "The fa��ade pattern is a software-design pattern commonly used with object-oriented programming.");
+ }
+
+ @Test
+ public void givenTextFile_whenCalledWithEncodingUTF8_thenProduceCorrectResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.readFile(
+ "src/test/resources/encoding.txt", "UTF-8"),
+ "The façade pattern is a software-design pattern commonly used with object-oriented programming.");
+ }
+
+ @Test
+ public void givenCharacterA_whenConvertedtoBinaryWithEncodingASCII_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("A", "US-ASCII"),
+ "1000001 ");
+ }
+
+ @Test
+ public void givenCharacterA_whenConvertedtoBinaryWithEncodingUTF8_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("A", "UTF-8"),
+ "1000001 ");
+ }
+
+ @Test
+ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingBig5_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("語", "Big5"),
+ "10111011 1111001 ");
+ }
+
+ @Test
+ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingUTF8_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("語", "UTF-8"),
+ "11101000 10101010 10011110 ");
+ }
+
+ @Test
+ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingUTF32_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("語", "UTF-32"),
+ "0 0 10001010 10011110 ");
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java
new file mode 100644
index 0000000000..d955d56d95
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.graph;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GraphTraversalUnitTest {
+ @Test
+ public void givenAGraph_whenTraversingDepthFirst_thenExpectedResult() {
+ Graph graph = createGraph();
+ Assert.assertEquals("[Bob, Rob, Maria, Alice, Mark]",
+ GraphTraversal.depthFirstTraversal(graph, "Bob").toString());
+ }
+
+ @Test
+ public void givenAGraph_whenTraversingBreadthFirst_thenExpectedResult() {
+ Graph graph = createGraph();
+ Assert.assertEquals("[Bob, Alice, Rob, Mark, Maria]",
+ GraphTraversal.breadthFirstTraversal(graph, "Bob").toString());
+ }
+
+ Graph createGraph() {
+ Graph graph = new Graph();
+ graph.addVertex("Bob");
+ graph.addVertex("Alice");
+ graph.addVertex("Mark");
+ graph.addVertex("Rob");
+ graph.addVertex("Maria");
+ graph.addEdge("Bob", "Alice");
+ graph.addEdge("Bob", "Rob");
+ graph.addEdge("Alice", "Mark");
+ graph.addEdge("Rob", "Mark");
+ graph.addEdge("Alice", "Maria");
+ graph.addEdge("Rob", "Maria");
+ return graph;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java b/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java
new file mode 100644
index 0000000000..6d1872f05f
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java
@@ -0,0 +1,175 @@
+package com.baeldung.java.math;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class MathUnitTest {
+
+ @Test
+ public void whenAbsInteger_thenReturnAbsoluteValue() {
+ assertEquals(5,Math.abs(-5));
+ }
+
+ @Test
+ public void whenMaxBetweenTwoValue_thenReturnMaximum() {
+ assertEquals(10, Math.max(5,10));
+ }
+
+ @Test
+ public void whenMinBetweenTwoValue_thenReturnMinimum() {
+ assertEquals(5, Math.min(5,10));
+ }
+
+ @Test
+ public void whenSignumWithNegativeNumber_thenReturnMinusOne() {
+ assertEquals(-1, Math.signum(-5), 0);
+ }
+
+ @Test
+ public void whenCopySignWithNegativeSign_thenReturnNegativeArgument() {
+ assertEquals(-5, Math.copySign(5,-1), 0);
+ }
+
+ @Test
+ public void whenPow_thenReturnPoweredValue() {
+ assertEquals(25, Math.pow(5,2),0);
+ }
+
+ @Test
+ public void whenSqrt_thenReturnSquareRoot() {
+ assertEquals(5, Math.sqrt(25),0);
+ }
+
+ @Test
+ public void whenCbrt_thenReturnCubeRoot() {
+ assertEquals(5, Math.cbrt(125),0);
+ }
+
+ @Test
+ public void whenExp_thenReturnEulerNumberRaised() {
+ assertEquals(2.718, Math.exp(1),0.1);
+ }
+
+ @Test
+ public void whenExpm1_thenReturnEulerNumberMinusOne() {
+ assertEquals(1.718, Math.expm1(1),0.1);
+ }
+
+ @Test
+ public void whenGetExponent_thenReturnUnbiasedExponent() {
+ assertEquals(8, Math.getExponent(333.3),0);
+ assertEquals(7, Math.getExponent(222.2f),0);
+ }
+
+ @Test
+ public void whenLog_thenReturnValue() {
+ assertEquals(1, Math.log(Math.E),0);
+ }
+
+ @Test
+ public void whenLog10_thenReturnValue() {
+ assertEquals(1, Math.log10(10),0);
+ }
+
+ @Test
+ public void whenLog1p_thenReturnValue() {
+ assertEquals(1.31, Math.log1p(Math.E),0.1);
+ }
+
+ @Test
+ public void whenSin_thenReturnValue() {
+ assertEquals(1, Math.sin(Math.PI/2),0);
+ }
+
+ @Test
+ public void whenCos_thenReturnValue() {
+ assertEquals(1, Math.cos(0),0);
+ }
+
+ @Test
+ public void whenTan_thenReturnValue() {
+ assertEquals(1, Math.tan(Math.PI/4),0.1);
+ }
+
+ @Test
+ public void whenAsin_thenReturnValue() {
+ assertEquals(Math.PI/2, Math.asin(1),0);
+ }
+
+ @Test
+ public void whenAcos_thenReturnValue() {
+ assertEquals(Math.PI/2, Math.acos(0),0);
+ }
+
+ @Test
+ public void whenAtan_thenReturnValue() {
+ assertEquals(Math.PI/4, Math.atan(1),0);
+ }
+
+ @Test
+ public void whenAtan2_thenReturnValue() {
+ assertEquals(Math.PI/4, Math.atan2(1,1),0);
+ }
+
+ @Test
+ public void whenToDegrees_thenReturnValue() {
+ assertEquals(180, Math.toDegrees(Math.PI),0);
+ }
+
+ @Test
+ public void whenToRadians_thenReturnValue() {
+ assertEquals(Math.PI, Math.toRadians(180),0);
+ }
+
+ @Test
+ public void whenCeil_thenReturnValue() {
+ assertEquals(4, Math.ceil(Math.PI),0);
+ }
+
+ @Test
+ public void whenFloor_thenReturnValue() {
+ assertEquals(3, Math.floor(Math.PI),0);
+ }
+
+ @Test
+ public void whenGetExponent_thenReturnValue() {
+ assertEquals(8, Math.getExponent(333.3),0);
+ }
+
+ @Test
+ public void whenIEEERemainder_thenReturnValue() {
+ assertEquals(1.0, Math.IEEEremainder(5,2),0);
+ }
+
+ @Test
+ public void whenNextAfter_thenReturnValue() {
+ assertEquals(1.9499999284744263, Math.nextAfter(1.95f,1),0.0000001);
+ }
+
+ @Test
+ public void whenNextUp_thenReturnValue() {
+ assertEquals(1.9500002, Math.nextUp(1.95f),0.0000001);
+ }
+
+ @Test
+ public void whenRint_thenReturnValue() {
+ assertEquals(2.0, Math.rint(1.95f),0.0);
+ }
+
+ @Test
+ public void whenRound_thenReturnValue() {
+ assertEquals(2.0, Math.round(1.95f),0.0);
+ }
+
+ @Test
+ public void whenScalb_thenReturnValue() {
+ assertEquals(48, Math.scalb(3, 4),0.0);
+ }
+
+ @Test
+ public void whenHypot_thenReturnValue() {
+ assertEquals(5, Math.hypot(4, 3),0.0);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java b/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java
new file mode 100644
index 0000000000..b669947d9c
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java
@@ -0,0 +1,171 @@
+package com.baeldung.java.properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.junit.Test;
+
+public class PropertiesUnitTest {
+
+ @Test
+ public void givenPropertyValue_whenPropertiesFileLoaded_thenCorrect() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appConfigPath = rootPath + "app.properties";
+ String catalogConfigPath = rootPath + "catalog";
+
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appConfigPath));
+
+ Properties catalogProps = new Properties();
+ catalogProps.load(new FileInputStream(catalogConfigPath));
+
+ String appVersion = appProps.getProperty("version");
+ assertEquals("1.0", appVersion);
+
+ assertEquals("files", catalogProps.getProperty("c1"));
+ }
+
+ @Test
+ public void givenPropertyValue_whenXMLPropertiesFileLoaded_thenCorrect() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String iconConfigPath = rootPath + "icons.xml";
+ Properties iconProps = new Properties();
+ iconProps.loadFromXML(new FileInputStream(iconConfigPath));
+
+ assertEquals("icon1.jpg", iconProps.getProperty("fileIcon"));
+ }
+
+ @Test
+ public void givenAbsentProperty_whenPropertiesFileLoaded_thenReturnsDefault() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appConfigPath = rootPath + "app.properties";
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appConfigPath));
+
+ String appVersion = appProps.getProperty("version");
+ String appName = appProps.getProperty("name", "defaultName");
+ String appGroup = appProps.getProperty("group", "baeldung");
+ String appDownloadAddr = appProps.getProperty("downloadAddr");
+
+ assertEquals("1.0", appVersion);
+ assertEquals("TestApp", appName);
+ assertEquals("baeldung", appGroup);
+ assertNull(appDownloadAddr);
+ }
+
+ @Test(expected = Exception.class)
+ public void givenImproperObjectCasting_whenPropertiesFileLoaded_thenThrowsException() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appConfigPath = rootPath + "app.properties";
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appConfigPath));
+
+ float appVerFloat = (float) appProps.get("version");
+ }
+
+ @Test
+ public void givenPropertyValue_whenPropertiesSet_thenCorrect() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appConfigPath = rootPath + "app.properties";
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appConfigPath));
+
+ appProps.setProperty("name", "NewAppName");
+ appProps.setProperty("downloadAddr", "www.baeldung.com/downloads");
+
+ String newAppName = appProps.getProperty("name");
+ assertEquals("NewAppName", newAppName);
+
+ String newAppDownloadAddr = appProps.getProperty("downloadAddr");
+ assertEquals("www.baeldung.com/downloads", newAppDownloadAddr);
+ }
+
+ @Test
+ public void givenPropertyValueNull_whenPropertiesRemoved_thenCorrect() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appConfigPath = rootPath + "app.properties";
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appConfigPath));
+
+ String versionBeforeRemoval = appProps.getProperty("version");
+ assertEquals("1.0", versionBeforeRemoval);
+
+ appProps.remove("version");
+ String versionAfterRemoval = appProps.getProperty("version");
+ assertNull(versionAfterRemoval);
+ }
+
+ @Test
+ public void whenPropertiesStoredInFile_thenCorrect() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appConfigPath = rootPath + "app.properties";
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appConfigPath));
+
+ String newAppConfigPropertiesFile = rootPath + "newApp.properties";
+ appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");
+
+ String newAppConfigXmlFile = rootPath + "newApp.xml";
+ appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");
+ }
+
+ @Test
+ public void givenPropertyValueAbsent_LoadsValuesFromDefaultProperties() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+
+ String defaultConfigPath = rootPath + "default.properties";
+ Properties defaultProps = new Properties();
+ defaultProps.load(new FileInputStream(defaultConfigPath));
+
+ String appConfigPath = rootPath + "app.properties";
+ Properties appProps = new Properties(defaultProps);
+ appProps.load(new FileInputStream(appConfigPath));
+
+ String appName = appProps.getProperty("name");
+ String appVersion = appProps.getProperty("version");
+ String defaultSite = appProps.getProperty("site");
+
+ assertEquals("1.0", appVersion);
+ assertEquals("TestApp", appName);
+ assertEquals("www.google.com", defaultSite);
+ }
+
+ @Test
+ public void givenPropertiesSize_whenPropertyFileLoaded_thenCorrect() throws IOException {
+
+ String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
+ String appPropsPath = rootPath + "app.properties";
+ Properties appProps = new Properties();
+ appProps.load(new FileInputStream(appPropsPath));
+
+ appProps.list(System.out); // list all key-value pairs
+
+ Enumeration