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/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/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..bda2cf90bf
--- /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)
+
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
+
+
+
+
+
+
+
+ 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-collections/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/array/operations/ArrayOperations.java
rename to core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
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-collections/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
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..0fcf7367c7 100644
--- a/core-java-collections/README.md
+++ b/core-java-collections/README.md
@@ -39,3 +39,14 @@
- [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)
diff --git a/core-java-collections/pom.xml b/core-java-collections/pom.xml
index 31f0d7419f..2201ee8b15 100644
--- a/core-java-collections/pom.xml
+++ b/core-java-collections/pom.xml
@@ -56,6 +56,12 @@
commons-exec
1.3
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
@@ -67,5 +73,6 @@
1.7.0
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/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/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
similarity index 60%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
index c3afba1f68..8b58916707 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
@@ -2,55 +2,47 @@ package com.baeldung.concurrent.evenandodd;
import java.util.concurrent.Semaphore;
-public class SemaphoreDemo {
+public class PrintEvenOddSemaphore {
public static void main(String[] args) {
-
SharedPrinter sp = new SharedPrinter();
- Thread odd = new Thread(new Odd(sp, 10));
- odd.setName("Odd");
- Thread even = new Thread(new Even(sp, 10));
- even.setName("Even");
+ Thread odd = new Thread(new Odd(sp, 10), "Odd");
+ Thread even = new Thread(new Even(sp, 10), "Even");
odd.start();
even.start();
-
}
-
}
class SharedPrinter {
- Semaphore semEven = new Semaphore(0);
- Semaphore semOdd = new Semaphore(1);
+ private final Semaphore semEven = new Semaphore(0);
+ private final Semaphore semOdd = new Semaphore(1);
- public void printEvenNum(int num) {
+ void printEvenNum(int num) {
try {
semEven.acquire();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
- System.out.println(Thread.currentThread()
- .getName() + ":"+num);
+ System.out.println(Thread.currentThread().getName() + ":"+num);
semOdd.release();
}
- public void printOddNum(int num) {
+ void printOddNum(int num) {
try {
semOdd.acquire();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
- System.out.println(Thread.currentThread()
- .getName() + ":"+ num);
+ System.out.println(Thread.currentThread().getName() + ":"+ num);
semEven.release();
-
}
}
class Even implements Runnable {
- SharedPrinter sp;
- int max;
+ private final SharedPrinter sp;
+ private final int max;
Even(SharedPrinter sp, int max) {
this.sp = sp;
@@ -66,8 +58,8 @@ class Even implements Runnable {
}
class Odd implements Runnable {
- SharedPrinter sp;
- int max;
+ private SharedPrinter sp;
+ private int max;
Odd(SharedPrinter sp, int max) {
this.sp = sp;
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
similarity index 64%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
index 54d89382b9..2b59f22a6e 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
@@ -1,22 +1,20 @@
package com.baeldung.concurrent.evenandodd;
-public class PrintEvenOdd {
+public class PrintEvenOddWaitNotify {
public static void main(String... args) {
Printer print = new Printer();
- Thread t1 = new Thread(new TaskEvenOdd(print, 10, false));
- t1.setName("Odd");
- Thread t2 = new Thread(new TaskEvenOdd(print, 10, true));
- t2.setName("Even");
+ 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 int max;
- private Printer print;
- private boolean isEvenNumber;
+ private final int max;
+ private final Printer print;
+ private final boolean isEvenNumber;
TaskEvenOdd(Printer print, int max, boolean isEvenNumber) {
this.print = print;
@@ -26,7 +24,7 @@ class TaskEvenOdd implements Runnable {
@Override
public void run() {
- int number = isEvenNumber == true ? 2 : 1;
+ int number = isEvenNumber ? 2 : 1;
while (number <= max) {
if (isEvenNumber) {
print.printEven(number);
@@ -39,32 +37,30 @@ class TaskEvenOdd implements Runnable {
}
class Printer {
- boolean isOdd = false;
+ private volatile boolean isOdd;
synchronized void printEven(int number) {
- while (isOdd == false) {
+ while (!isOdd) {
try {
wait();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
}
- System.out.println(Thread.currentThread()
- .getName() + ":" + number);
+ System.out.println(Thread.currentThread().getName() + ":" + number);
isOdd = false;
notify();
}
synchronized void printOdd(int number) {
- while (isOdd == true) {
+ while (isOdd) {
try {
wait();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
}
- System.out.println(Thread.currentThread()
- .getName() + ":" + number);
+ System.out.println(Thread.currentThread().getName() + ":" + number);
isOdd = true;
notify();
}
diff --git a/core-java-io/README.md b/core-java-io/README.md
index ae4c267b8a..c81e466b57 100644
--- a/core-java-io/README.md
+++ b/core-java-io/README.md
@@ -33,3 +33,4 @@
- [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)
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..85312cba68
--- /dev/null
+++ b/core-java-lang/README.md
@@ -0,0 +1,59 @@
+=========
+
+## 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)
+
diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml
new file mode 100644
index 0000000000..ace39de274
--- /dev/null
+++ b/core-java-lang/pom.xml
@@ -0,0 +1,429 @@
+
+ 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}
+
+
+
+
+ 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
+
+
+
+
+
+
+
+ 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
+
+
+
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/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/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/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/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/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/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/README.md b/core-java/README.md
index 856cc58097..11d9fd2ee0 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -6,114 +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)
- [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)
- [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)
@@ -121,40 +63,25 @@
- [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)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 477a01375d..9fbc8f6810 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java
0.1.0-SNAPSHOT
jar
@@ -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
index fe30c66484..3180762227 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
@@ -2,29 +2,28 @@ package com.baeldung.abstractclasses.application;
import com.baeldung.abstractclasses.filereaders.BaseFileReader;
import com.baeldung.abstractclasses.filereaders.LowercaseFileReader;
-import com.baeldung.abstractclasses.filereaders.StandardFileReader;
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 {
-
+ public static void main(String[] args) throws IOException, URISyntaxException {
+
Application application = new Application();
- String filePath = application.getFilePathFromResourcesFolder("files/test.txt");
-
- BaseFileReader lowercaseFileReader = new LowercaseFileReader(filePath);
+ 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));
- BaseFileReader upperCaseFileReader = new UppercaseFileReader(filePath);
- upperCaseFileReader.readFile().forEach(line -> System.out.println(line));
-
- BaseFileReader standardFileReader = new StandardFileReader(filePath);
- standardFileReader.readFile().forEach(line -> System.out.println(line));
-
}
- private String getFilePathFromResourcesFolder(String fileName) {
- return getClass().getClassLoader().getResource(fileName).getPath().substring(1);
+ 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
index 659913f046..97452a9eca 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
@@ -1,19 +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 String filePath;
+ protected Path filePath;
- protected BaseFileReader(String filePath) {
+ protected BaseFileReader(Path filePath) {
this.filePath = filePath;
}
- public String getFilePath() {
+ public Path getFilePath() {
return filePath;
}
- public abstract List readFile() throws IOException;
+ 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
index 0bbef45eb8..53820d393c 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
@@ -1,21 +1,15 @@
package com.baeldung.abstractclasses.filereaders;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.nio.file.Path;
public class LowercaseFileReader extends BaseFileReader {
- public LowercaseFileReader(String filePath) {
+ public LowercaseFileReader(Path filePath) {
super(filePath);
}
-
+
@Override
- public List readFile() throws IOException {
- return Files.lines(Paths.get(filePath))
- .map(String::toLowerCase)
- .collect(Collectors.toList());
- }
+ public String mapFileLine(String line) {
+ return line.toLowerCase();
+ }
}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/StandardFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/StandardFileReader.java
deleted file mode 100644
index 0a90d53c38..0000000000
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/StandardFileReader.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.abstractclasses.filereaders;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class StandardFileReader extends BaseFileReader {
-
- public StandardFileReader(String filePath) {
- super(filePath);
- }
-
- @Override
- public List readFile() throws IOException {
- return Files.lines(Paths.get(filePath)).collect(Collectors.toList());
- }
-}
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
index 4e8f150964..3144a4f27f 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
@@ -1,21 +1,15 @@
package com.baeldung.abstractclasses.filereaders;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.nio.file.Path;
public class UppercaseFileReader extends BaseFileReader {
-
- public UppercaseFileReader(String filePath) {
+
+ public UppercaseFileReader(Path filePath) {
super(filePath);
}
-
+
@Override
- public List readFile() throws IOException {
- return Files.lines(Paths.get(filePath))
- .map(String::toUpperCase)
- .collect(Collectors.toList());
+ 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/constructors/BankAccount.java b/core-java/src/main/java/com/baeldung/constructors/BankAccount.java
new file mode 100644
index 0000000000..3d50e85245
--- /dev/null
+++ b/core-java/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/src/main/java/com/baeldung/constructors/Transaction.java b/core-java/src/main/java/com/baeldung/constructors/Transaction.java
new file mode 100644
index 0000000000..14704f507a
--- /dev/null
+++ b/core-java/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/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/networking/proxies/CommandLineProxyDemo.java b/core-java/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java
new file mode 100644
index 0000000000..bbc8a81c98
--- /dev/null
+++ b/core-java/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/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java b/core-java/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java
new file mode 100644
index 0000000000..07a7880886
--- /dev/null
+++ b/core-java/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/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java b/core-java/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java
new file mode 100644
index 0000000000..e7ac3c0264
--- /dev/null
+++ b/core-java/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/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java b/core-java/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java
new file mode 100644
index 0000000000..1f589eac58
--- /dev/null
+++ b/core-java/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/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java b/core-java/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java
new file mode 100644
index 0000000000..aa12824a90
--- /dev/null
+++ b/core-java/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/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java b/core-java/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java
new file mode 100644
index 0000000000..41caaf3439
--- /dev/null
+++ b/core-java/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/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/test/java/com/baeldung/abstractclasses/StandardFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/StandardFileReaderUnitTest.java
deleted file mode 100644
index e1c1435ef4..0000000000
--- a/core-java/src/test/java/com/baeldung/abstractclasses/StandardFileReaderUnitTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.abstractclasses;
-
-import com.baeldung.abstractclasses.filereaders.BaseFileReader;
-import com.baeldung.abstractclasses.filereaders.StandardFileReader;
-import java.util.List;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-
-public class StandardFileReaderUnitTest {
-
- @Test
- public void givenStandardFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
- String filePath = getClass().getClassLoader().getResource("files/test.txt").getPath().substring(1);
- BaseFileReader standardFileReader = new StandardFileReader(filePath);
-
- assertThat(standardFileReader.readFile()).isInstanceOf(List.class);
- }
-}
diff --git a/core-java/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
similarity index 70%
rename from core-java/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
rename to core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
index 4058f6f03b..4f0d3a7cd5 100644
--- a/core-java/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
@@ -1,7 +1,9 @@
-package com.baeldung.abstractclasses;
+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;
@@ -10,8 +12,8 @@ public class LowercaseFileReaderUnitTest {
@Test
public void givenLowercaseFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
- String filePath = getClass().getClassLoader().getResource("files/test.txt").getPath().substring(1);
- BaseFileReader lowercaseFileReader = new LowercaseFileReader(filePath);
+ 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/UppercaseFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
similarity index 69%
rename from core-java/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
rename to core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
index f9c5fbf94d..e11db57000 100644
--- a/core-java/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
@@ -1,7 +1,9 @@
-package com.baeldung.abstractclasses;
+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;
@@ -10,9 +12,9 @@ public class UppercaseFileReaderUnitTest {
@Test
public void givenUppercaseFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
- String filePath = getClass().getClassLoader().getResource("files/test.txt").getPath().substring(1);
- BaseFileReader uppercaseFileReader = new UppercaseFileReader(filePath);
+ 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/constructors/ConstructorUnitTest.java b/core-java/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
new file mode 100644
index 0000000000..2cd8832fbf
--- /dev/null
+++ b/core-java/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/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/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/reflection/operations/MoreOperationsUnitTest.java b/core-java/src/test/java/com/baeldung/java/reflection/operations/MoreOperationsUnitTest.java
deleted file mode 100644
index 2fe0a54664..0000000000
--- a/core-java/src/test/java/com/baeldung/java/reflection/operations/MoreOperationsUnitTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.baeldung.java.reflection.operations;
-
-import com.baeldung.java.reflection.*;
-import static org.hamcrest.CoreMatchers.equalTo;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.junit.Test;
-import static org.junit.Assert.assertThat;
-
-public class MoreOperationsUnitTest {
-
- public MoreOperationsUnitTest() {
- }
-
- @Test(expected = IllegalAccessException.class)
- public void givenObject_whenInvokeProtectedMethod_thenFail() throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
- Method maxProtectedMethod = Operations.class.getDeclaredMethod("protectedMax", int.class, int.class);
-
- Operations operationsInstance = new Operations();
- Integer result = (Integer) maxProtectedMethod.invoke(operationsInstance, 2, 4);
-
- assertThat(result, equalTo(4));
- }
-
- @Test
- public void givenObject_whenInvokeProtectedMethod_thenCorrect() throws Exception {
- Method maxProtectedMethod = Operations.class.getDeclaredMethod("protectedMax", int.class, int.class);
- maxProtectedMethod.setAccessible(true);
-
- Operations operationsInstance = new Operations();
- Integer result = (Integer) maxProtectedMethod.invoke(operationsInstance, 2, 4);
-
- assertThat(result, equalTo(4));
- }
-
-}
diff --git a/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java
index f21a755b01..2be6b6ad4b 100644
--- a/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java
@@ -1,6 +1,5 @@
package com.baeldung.regexp.optmization;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -14,13 +13,15 @@ import static org.junit.Assert.assertTrue;
public class OptimizedMatcherUnitTest {
- private long time;
- private long mstimePreCompiled;
- private long mstimeNotPreCompiled;
-
private String action;
private List items;
+
+ private class TimeWrapper {
+ private long time;
+ private long mstimePreCompiled;
+ private long mstimeNotPreCompiled;
+ }
@Before
public void setup() {
@@ -48,27 +49,27 @@ public class OptimizedMatcherUnitTest {
@Test
public void givenANotPreCompiledAndAPreCompiledPatternA_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
-
- testPatterns("A*");
- assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
+ TimeWrapper timeObj = new TimeWrapper();
+ testPatterns("A*", timeObj);
+ assertTrue(timeObj.mstimePreCompiled < timeObj.mstimeNotPreCompiled);
}
@Test
public void givenANotPreCompiledAndAPreCompiledPatternABC_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
-
- testPatterns("A*B*C*");
- assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
+ TimeWrapper timeObj = new TimeWrapper();
+ testPatterns("A*B*C*", timeObj);
+ assertTrue(timeObj.mstimePreCompiled < timeObj.mstimeNotPreCompiled);
}
@Test
public void givenANotPreCompiledAndAPreCompiledPatternECWF_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
-
- testPatterns("E*C*W*F*");
- assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
+ TimeWrapper timeObj = new TimeWrapper();
+ testPatterns("E*C*W*F*", timeObj);
+ assertTrue(timeObj.mstimePreCompiled < timeObj.mstimeNotPreCompiled);
}
- private void testPatterns(String regex) {
- time = System.nanoTime();
+ private void testPatterns(String regex, TimeWrapper timeObj) {
+ timeObj.time = System.nanoTime();
int matched = 0;
int unmatched = 0;
@@ -83,10 +84,10 @@ public class OptimizedMatcherUnitTest {
this.action = "uncompiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
- this.mstimeNotPreCompiled = (System.nanoTime() - time) / 1000000;
- System.out.println(this.action + ": " + mstimeNotPreCompiled + "ms");
+ timeObj.mstimeNotPreCompiled = (System.nanoTime() - timeObj.time) / 1000000;
+ System.out.println(this.action + ": " + timeObj.mstimeNotPreCompiled + "ms");
- time = System.nanoTime();
+ timeObj.time = System.nanoTime();
Matcher matcher = Pattern.compile(regex).matcher("");
matched = 0;
@@ -103,7 +104,7 @@ public class OptimizedMatcherUnitTest {
this.action = "compiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
- this.mstimePreCompiled = (System.nanoTime() - time) / 1000000;
- System.out.println(this.action + ": " + mstimePreCompiled + "ms");
+ timeObj.mstimePreCompiled = (System.nanoTime() - timeObj.time) / 1000000;
+ System.out.println(this.action + ": " + timeObj.mstimePreCompiled + "ms");
}
}
diff --git a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
index 4ae7b77089..7e1fcd9b3d 100644
--- a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
@@ -25,7 +25,7 @@ public class SimpleDateFormatUnitTest {
@Test
public void givenSpecificDate_whenFormattedUsingDateFormat_thenCheckFormatCorrect() throws Exception {
- DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
+ DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
assertEquals("5/24/77", formatter.format(new Date(233345223232L)));
}
diff --git a/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java
new file mode 100644
index 0000000000..d952d2383b
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.string;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class StringReplaceAndRemoveUnitTest {
+
+
+ @Test
+ public void givenTestStrings_whenReplace_thenProcessedString() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+ String processed = master.replace(target, replacement);
+ assertTrue(processed.contains(replacement));
+ assertFalse(processed.contains(target));
+
+ }
+
+ @Test
+ public void givenTestStrings_whenReplaceAll_thenProcessedString() {
+
+ String master2 = "Welcome to Baeldung, Hello World Baeldung";
+ String regexTarget= "(Baeldung)$";
+ String replacement = "Java";
+ String processed2 = master2.replaceAll(regexTarget, replacement);
+ assertTrue(processed2.endsWith("Java"));
+
+ }
+
+ @Test
+ public void givenTestStrings_whenStringBuilderMethods_thenProcessedString() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+
+ int startIndex = master.indexOf(target);
+ int stopIndex = startIndex + target.length();
+
+ StringBuilder builder = new StringBuilder(master);
+
+
+ builder.delete(startIndex, stopIndex);
+ assertFalse(builder.toString().contains(target));
+
+
+ builder.replace(startIndex, stopIndex, replacement);
+ assertTrue(builder.toString().contains(replacement));
+
+
+ }
+
+
+ @Test
+ public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+
+ String processed = StringUtils.replace(master, target, replacement);
+ assertTrue(processed.contains(replacement));
+
+ String master2 = "Hello World Baeldung!";
+ String target2 = "baeldung";
+ String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
+ assertFalse(processed2.contains(target));
+
+ }
+
+
+
+
+
+
+
+}
diff --git a/core-java/src/test/resources/encoding.txt b/core-java/src/test/resources/encoding.txt
new file mode 100644
index 0000000000..e1cf027df0
--- /dev/null
+++ b/core-java/src/test/resources/encoding.txt
@@ -0,0 +1 @@
+The façade pattern is a software-design pattern commonly used with object-oriented programming.
\ No newline at end of file
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index ab9e96c2e1..1b04b71228 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -40,5 +40,10 @@
- [Converting Kotlin Data Class from JSON using GSON](https://www.baeldung.com/kotlin-json-convert-data-class)
- [Concatenate Strings in Kotlin](https://www.baeldung.com/kotlin-concatenate-strings)
- [Kotlin return, break, continue Keywords](https://www.baeldung.com/kotlin-return-break-continue)
-- [Mapping of Data Objects in Kotlin](https://www.baeldung.com/kotlin-data-objects-mapping)
+- [Mapping of Data Objects in Kotlin](https://www.baeldung.com/kotlin-data-objects)
- [Initializing Arrays in Kotlin](https://www.baeldung.com/kotlin-initialize-array)
+- [Threads vs Coroutines in Kotlin](https://www.baeldung.com/kotlin-threads-coroutines)
+- [Guide to Kotlin Interfaces](https://www.baeldung.com/kotlin-interfaces)
+- [Guide to Sorting in Kotlin](https://www.baeldung.com/kotlin-sort)
+- [Dependency Injection for Kotlin with Injekt](https://www.baeldung.com/kotlin-dependency-injection-with-injekt)
+- [Implementing a Binary Tree in Kotlin](https://www.baeldung.com/kotlin-binary-tree)
diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index 5cdb5f700e..2b559b19e0 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -18,6 +18,11 @@
commons-math3
${commons-math3.version}
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
org.junit.platform
junit-platform-runner
@@ -70,6 +75,7 @@
3.6.1
+ 3.8.1
1.1.1
5.2.0
3.10.0
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/generic/Reified.kt b/core-kotlin/src/main/kotlin/com/baeldung/generic/Reified.kt
new file mode 100644
index 0000000000..37a632fe41
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/generic/Reified.kt
@@ -0,0 +1,6 @@
+inline fun Iterable<*>.filterIsInstance() = filter { it is T }
+
+fun main(args: Array) {
+ val set = setOf("1984", 2, 3, "Brave new world", 11)
+ println(set.filterIsInstance())
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt
new file mode 100644
index 0000000000..62e8dfe720
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt
@@ -0,0 +1,62 @@
+import org.apache.commons.lang3.RandomStringUtils
+import org.junit.Before
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import java.security.SecureRandom
+import java.util.concurrent.ThreadLocalRandom
+import kotlin.experimental.and
+import kotlin.streams.asSequence
+import kotlin.test.assertEquals
+
+const val STRING_LENGTH = 10
+const val ALPHANUMERIC_REGEX = "[a-zA-Z0-9]+"
+
+class RandomStringUnitTest {
+ private val charPool : List = ('a'..'z') + ('A'..'Z') + ('0'..'9')
+
+ @Test
+ fun givenAStringLength_whenUsingJava_thenReturnAlphanumericString() {
+ var randomString = ThreadLocalRandom.current()
+ .ints(STRING_LENGTH.toLong(), 0, charPool.size)
+ .asSequence()
+ .map(charPool::get)
+ .joinToString("")
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+ @Test
+ fun givenAStringLength_whenUsingKotlin_thenReturnAlphanumericString() {
+ var randomString = (1..STRING_LENGTH).map { i -> kotlin.random.Random.nextInt(0, charPool.size) }
+ .map(charPool::get)
+ .joinToString("")
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+ @Test
+ fun givenAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString() {
+ var randomString = RandomStringUtils.randomAlphanumeric(STRING_LENGTH)
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+ @Test
+ fun givenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString() {
+ val random = SecureRandom()
+ val bytes = ByteArray(STRING_LENGTH)
+ random.nextBytes(bytes)
+
+ var randomString = (0..bytes.size - 1).map { i ->
+ charPool.get((bytes[i] and 0xFF.toByte() and (charPool.size-1).toByte()).toInt())
+ }.joinToString("")
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+}
\ No newline at end of file
diff --git a/core-scala/README.md b/core-scala/README.md
new file mode 100644
index 0000000000..eed344193f
--- /dev/null
+++ b/core-scala/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Scala](https://www.baeldung.com/scala-intro)
diff --git a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
index 397f166aa7..9291d958b3 100644
--- a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
+++ b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
@@ -22,6 +22,6 @@ class Employee(val name : String,
* A Trait which will make the toString return upper case value.
*/
trait UpperCasePrinter {
- override def toString = super.toString toUpperCase
+ override def toString: String = super.toString toUpperCase
}
diff --git a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
index df97013206..02c41a5f8c 100644
--- a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
+++ b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
@@ -11,7 +11,7 @@ object HigherOrderFunctions {
def mapReduce(r : (Int, Int) => Int,
i : Int,
m : Int => Int,
- a : Int, b : Int) = {
+ a : Int, b : Int): Int = {
def iter(a : Int, result : Int) : Int = {
if (a > b) result
else iter(a + 1, r(m(a), result))
diff --git a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
index 93cd3e697e..20bc413646 100644
--- a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
+++ b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
@@ -7,9 +7,9 @@ package com.baeldung.scala
*
*/
object Utils {
- def average(x : Double, y : Double) = (x + y) / 2
+ def average(x : Double, y : Double): Double = (x + y) / 2
- def randomLessThan(d : Double) = {
+ def randomLessThan(d : Double): Double = {
var random = 0d
do {
random = Math.random()
diff --git a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
index 71422a8b4f..584038ee2c 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
@@ -1,32 +1,32 @@
package com.baeldung.scala
import com.baeldung.scala.ControlStructuresDemo._
-import org.junit.Test
import org.junit.Assert.assertEquals
+import org.junit.Test
class ControlStructuresDemoUnitTest {
@Test
- def givenTwoIntegers_whenGcdCalled_thenCorrectValueReturned = {
+ def givenTwoIntegers_whenGcdCalled_thenCorrectValueReturned() = {
assertEquals(3, gcd(15, 27))
}
@Test
- def givenTwoIntegers_whenGcdIterCalled_thenCorrectValueReturned = {
+ def givenTwoIntegers_whenGcdIterCalled_thenCorrectValueReturned() = {
assertEquals(3, gcdIter(15, 27))
}
@Test
- def givenTwoIntegers_whenRangeSumcalled_thenCorrectValueReturned = {
+ def givenTwoIntegers_whenRangeSumcalled_thenCorrectValueReturned() = {
assertEquals(55, rangeSum(1, 10))
}
@Test
- def givenPositiveInteger_whenFactorialInvoked_thenCorrectValueReturned = {
+ def givenPositiveInteger_whenFactorialInvoked_thenCorrectValueReturned() = {
assertEquals(720, factorial(6))
}
@Test
- def whenFactorialOf0Invoked_then1Returned = {
+ def whenFactorialOf0Invoked_then1Returned() = {
assertEquals(1, factorial(0))
}
diff --git a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
index c51631dd2c..0828752a8a 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
@@ -6,20 +6,20 @@ import org.junit.Test
class EmployeeUnitTest {
@Test
- def whenEmployeeSalaryIncremented_thenCorrectSalary = {
+ def whenEmployeeSalaryIncremented_thenCorrectSalary() = {
val employee = new Employee("John Doe", 1000)
employee.incrementSalary()
assertEquals(1020, employee.salary)
}
@Test
- def givenEmployee_whenToStringCalled_thenCorrectStringReturned = {
+ def givenEmployee_whenToStringCalled_thenCorrectStringReturned() = {
val employee = new Employee("John Doe", 1000)
assertEquals("Employee(name=John Doe, salary=1000)", employee.toString)
}
@Test
- def givenEmployeeWithTrait_whenToStringCalled_thenCorrectStringReturned = {
+ def givenEmployeeWithTrait_whenToStringCalled_thenCorrectStringReturned() = {
val employee =
new Employee("John Doe", 1000) with UpperCasePrinter
assertEquals("EMPLOYEE(NAME=JOHN DOE, SALARY=1000)", employee.toString)
diff --git a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
index 63530ecaf4..240c879d7f 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
@@ -1,14 +1,13 @@
package com.baeldung.scala
+import com.baeldung.scala.HigherOrderFunctions.mapReduce
import org.junit.Assert.assertEquals
import org.junit.Test
-import HigherOrderFunctions.mapReduce
-
class HigherOrderFunctionsUnitTest {
@Test
- def whenCalledWithSumAndSquareFunctions_thenCorrectValueReturned = {
+ def whenCalledWithSumAndSquareFunctions_thenCorrectValueReturned() = {
def square(x : Int) = x * x
def sum(x : Int, y : Int) = x + y
@@ -20,7 +19,7 @@ class HigherOrderFunctionsUnitTest {
}
@Test
- def whenComputingSumOfSquaresWithAnonymousFunctions_thenCorrectValueReturned = {
+ def whenComputingSumOfSquaresWithAnonymousFunctions_thenCorrectValueReturned() = {
def sumSquares(a : Int, b : Int) =
mapReduce((x, y) => x + y, 0, x => x * x, a, b)
@@ -28,7 +27,7 @@ class HigherOrderFunctionsUnitTest {
}
@Test
- def givenCurriedFunctions_whenInvoked_thenCorrectValueReturned = {
+ def givenCurriedFunctions_whenInvoked_thenCorrectValueReturned() = {
// a curried function
def sum(f : Int => Int)(a : Int,
b : Int) : Int =
diff --git a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
index 5cc19e9215..ac27389d70 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
@@ -1,14 +1,12 @@
package com.baeldung.scala
-import scala.Range
-
import org.junit.Assert.assertFalse
import org.junit.Test
class IntSetUnitTest {
@Test
- def givenSetof1To10_whenContains11Called_thenFalse = {
+ def givenSetof1To10_whenContains11Called_thenFalse() = {
// Set up a set containing integers 1 to 10.
val set1To10 =
diff --git a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
index 47f9873aad..e4995201d8 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
@@ -1,34 +1,29 @@
package com.baeldung.scala
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
+import com.baeldung.scala.Utils.{average, fibonacci, power, randomLessThan}
+import org.junit.Assert.{assertEquals, assertTrue}
import org.junit.Test
-import Utils.average
-import Utils.fibonacci
-import Utils.power
-import Utils.randomLessThan
-
class UtilsUnitTest {
@Test
- def whenAverageCalled_thenCorrectValueReturned() = {
+ def whenAverageCalled_thenCorrectValueReturned(): Unit = {
assertEquals(15.0, average(10, 20), 1e-5)
}
@Test
- def whenRandomLessThanInvokedWithANumber_thenARandomLessThanItReturned = {
+ def whenRandomLessThanInvokedWithANumber_thenARandomLessThanItReturned: Unit = {
val d = 0.1
assertTrue(randomLessThan(d) < d)
}
@Test
- def whenPowerInvokedWith2And3_then8Returned = {
+ def whenPowerInvokedWith2And3_then8Returned: Unit = {
assertEquals(8, power(2, 3))
}
@Test
- def whenFibonacciCalled_thenCorrectValueReturned = {
+ def whenFibonacciCalled_thenCorrectValueReturned: Unit = {
assertEquals(1, fibonacci(0))
assertEquals(1, fibonacci(1))
assertEquals(fibonacci(6),
diff --git a/ddd/README.md b/ddd/README.md
new file mode 100644
index 0000000000..60f3a43086
--- /dev/null
+++ b/ddd/README.md
@@ -0,0 +1,3 @@
+### Relevant articles
+
+- [Persisting DDD Aggregates](https://www.baeldung.com/spring-persisting-ddd-aggregates)
diff --git a/ejb/README.md b/ejb/README.md
deleted file mode 100644
index f47277bf8f..0000000000
--- a/ejb/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## Relevant articles:
-
-- [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro)
-- [Java EE Session Beans](http://www.baeldung.com/ejb-session-beans)
-- [Introduction to EJB JNDI Lookup on WildFly Application Server](http://www.baeldung.com/wildfly-ejb-jndi)
-- [A Guide to Message Driven Beans in EJB](http://www.baeldung.com/ejb-message-driven-beans)
diff --git a/ejb/ejb-client/pom.xml b/ejb/ejb-client/pom.xml
deleted file mode 100755
index 6231030cec..0000000000
--- a/ejb/ejb-client/pom.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
- 4.0.0
- ejb-client
- EJB3 Client Maven
-
-
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
-
-
-
-
- org.wildfly
- wildfly-ejb-client-bom
- pom
-
-
- com.baeldung.ejb
- ejb-remote
- ejb
-
-
-
\ No newline at end of file
diff --git a/ejb/ejb-remote/src/main/resources/META-INF/ejb-jar.xml b/ejb/ejb-remote/src/main/resources/META-INF/ejb-jar.xml
deleted file mode 100755
index d6c2200198..0000000000
--- a/ejb/ejb-remote/src/main/resources/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- remote
-
-
diff --git a/ejb/ejb-session-beans/pom.xml b/ejb/ejb-session-beans/pom.xml
deleted file mode 100644
index da76169729..0000000000
--- a/ejb/ejb-session-beans/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-
- 4.0.0
- ejb-session-beans
-
-
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
-
-
-
-
-
- org.jboss.arquillian
- arquillian-bom
- ${arquillian-bom.version}
- import
- pom
-
-
-
-
-
-
- javax
- javaee-api
- provided
-
-
- org.jboss.arquillian.junit
- arquillian-junit-container
- test
-
-
-
-
-
- arquillian-glassfish-embedded
-
- true
-
-
-
- org.jboss.arquillian.container
- arquillian-glassfish-embedded-3.1
- ${arquillian-glassfish-embedded-3.1.version}
- test
-
-
- org.glassfish.main.extras
- glassfish-embedded-all
- ${glassfish-embedded-all.version}
- test
-
-
-
-
-
-
-
-
- maven-war-plugin
- ${maven-war-plugin.version}
-
- false
-
-
-
-
-
-
- UTF-8
- 1.1.13.Final
- 2.2.6
- 1.1.12.Final
- 1.0.0.Final
- 4.12
- 7.0
- 1.0.0.CR4
- 3.1.2
-
-
-
\ No newline at end of file
diff --git a/ejb/pom.xml b/ejb/pom.xml
deleted file mode 100755
index 4cb700d087..0000000000
--- a/ejb/pom.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
- 4.0.0
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
- pom
- ejb
- EJB Tutorial
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
-
- ejb-remote
- ejb-session-beans
-
-
-
-
-
- com.baeldung.ejb
- ejb-remote
- ${ejb-remote.version}
- ejb
-
-
- com.baeldung.ejb
- ejb-session-beans
- ${ejb-session-beans.version}
- ejb
-
-
- javax
- javaee-api
- ${javaee-api.version}
- provided
-
-
- org.wildfly
- wildfly-ejb-client-bom
- ${wildfly-ejb-client-bom.version}
- pom
- import
-
-
-
-
-
-
-
-
- maven-ejb-plugin
- ${maven-ejb-plugin.version}
-
- ${ejbVersion}
-
-
-
-
-
-
-
-
- jboss-public-repository-group
- JBoss Public Maven Repository Group
- http://repository.jboss.org/nexus/content/groups/public/
- default
-
- true
- never
-
-
- true
- never
-
-
-
-
-
- 2.5.7
- 3.4.11
- 0.10
- 2.19.1
- 1.0-SNAPSHOT
- 1.0-SNAPSHOT
- 7.0
- 2.4
- 3.2
- 10.1.0.Final
-
-
-
\ No newline at end of file
diff --git a/ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml b/ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml
deleted file mode 100644
index 7d900d8ea8..0000000000
--- a/ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml b/ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml
deleted file mode 100644
index 7d900d8ea8..0000000000
--- a/ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/gradle/README.md b/gradle/README.md
index 229466dfec..a1f5c74c57 100644
--- a/gradle/README.md
+++ b/gradle/README.md
@@ -4,3 +4,4 @@
- [Creating a Fat Jar in Gradle](http://www.baeldung.com/gradle-fat-jar)
- [A Custom Task in Gradle](http://www.baeldung.com/gradle-custom-task)
- [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection)
+- [Using JUnit 5 with Gradle](https://www.baeldung.com/junit-5-gradle)
diff --git a/grpc/pom.xml b/grpc/pom.xml
index 949f26d376..725bec3e70 100644
--- a/grpc/pom.xml
+++ b/grpc/pom.xml
@@ -71,9 +71,8 @@
- 1.5.0
- 1.5.0.Final
- 0.5.0
+ 1.16.1
+ 1.6.1
+ 0.6.1
-
diff --git a/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java b/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
index 1a1809387f..f653e17910 100644
--- a/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
+++ b/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
@@ -10,7 +10,7 @@ import io.grpc.ManagedChannelBuilder;
public class GrpcClient {
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
- .usePlaintext(true)
+ .usePlaintext()
.build();
HelloServiceGrpc.HelloServiceBlockingStub stub
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
index 81ba72373c..c0c5efea23 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
+++ b/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
@@ -2,6 +2,9 @@ package org.baeldung.guava;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
import java.util.Map;
import org.junit.Test;
import com.google.common.collect.ImmutableRangeMap;
@@ -98,8 +101,9 @@ public class GuavaRangeMapUnitTest {
final RangeMap experiencedSubRangeDesignationMap = experienceRangeDesignationMap.subRangeMap(Range.closed(4, 14));
assertNull(experiencedSubRangeDesignationMap.get(3));
- assertEquals("Executive Director", experiencedSubRangeDesignationMap.get(14));
- assertEquals("Vice President", experiencedSubRangeDesignationMap.get(7));
+ assertTrue(experiencedSubRangeDesignationMap.asMapOfRanges().values()
+ .containsAll(Arrays.asList("Executive Director", "Vice President", "Executive Director")));
+
}
@Test
diff --git a/jackson/README.md b/jackson/README.md
index a05c95de94..04e88d0ea1 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -36,3 +36,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Jackson – Change Name of Field](http://www.baeldung.com/jackson-name-of-property)
- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria)
- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values)
+- [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json)
diff --git a/java-dates/README.md b/java-dates/README.md
index f99bfeb861..66046b16a6 100644
--- a/java-dates/README.md
+++ b/java-dates/README.md
@@ -23,3 +23,4 @@
- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
+- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
new file mode 100644
index 0000000000..2be646eb51
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.timestamp;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class StringToTimestampConverterUnitTest {
+
+ @Test
+ public void givenDatePattern_whenParsing_thenTimestampIsCorrect() {
+ String pattern = "MMM dd, yyyy HH:mm:ss.SSSSSSSS";
+ String timestampAsString = "Nov 12, 2018 13:02:56.12345678";
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+ LocalDateTime localDateTime = LocalDateTime.from(formatter.parse(timestampAsString));
+
+ Timestamp timestamp = Timestamp.valueOf(localDateTime);
+ Assert.assertEquals("2018-11-12 13:02:56.12345678", timestamp.toString());
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java b/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
new file mode 100644
index 0000000000..b25ff2edb3
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.timestamp;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Timestamp;
+import java.time.format.DateTimeFormatter;
+
+public class TimestampToStringConverterTest {
+
+ @Test
+ public void givenDatePattern_whenFormatting_thenResultingStringIsCorrect() {
+ Timestamp timestamp = Timestamp.valueOf("2018-12-12 01:02:03.123456789");
+ DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
+
+ String timestampAsString = formatter.format(timestamp.toLocalDateTime());
+ Assert.assertEquals("2018-12-12T01:02:03.123456789", timestampAsString);
+ }
+}
\ No newline at end of file
diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml
index 3d235e10a8..7546839492 100644
--- a/java-ee-8-security-api/pom.xml
+++ b/java-ee-8-security-api/pom.xml
@@ -41,7 +41,7 @@
- https://public.dhe.ibm.com/ibmdl/export/pub/software/openliberty/runtime/nightly/2018-05-25_1422/openliberty-all-20180525-1300.zip
+ https://public.dhe.ibm.com/ibmdl/export/pub/software/openliberty/runtime/release/2018-09-05_2337/openliberty-18.0.0.3.zip
true
diff --git a/java-strings/README.md b/java-strings/README.md
index a653087401..2847a0d0a8 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -35,3 +35,5 @@
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [String Performance Hints](https://www.baeldung.com/java-string-performance)
- [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences)
+- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
+- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
diff --git a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java b/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
new file mode 100644
index 0000000000..b522f7337b
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
@@ -0,0 +1,69 @@
+package com.baeldung.string;
+
+public class AddingNewLineToString {
+
+ public static void main(String[] args) {
+ String line1 = "Humpty Dumpty sat on a wall.";
+ String line2 = "Humpty Dumpty had a great fall.";
+ String rhyme = "";
+
+ System.out.println("***New Line in a String in Java***");
+ //1. Using "\n"
+ System.out.println("1. Using \\n");
+ rhyme = line1 + "\n" + line2;
+ System.out.println(rhyme);
+
+ //2. Using "\r\n"
+ System.out.println("2. Using \\r\\n");
+ rhyme = line1 + "\r\n" + line2;
+ System.out.println(rhyme);
+
+ //3. Using "\r"
+ System.out.println("3. Using \\r");
+ rhyme = line1 + "\r" + line2;
+ System.out.println(rhyme);
+
+ //4. Using "\n\r" Note that this is not same as "\r\n"
+ // Using "\n\r" is equivalent to adding two lines
+ System.out.println("4. Using \\n\\r");
+ rhyme = line1 + "\n\r" + line2;
+ System.out.println(rhyme);
+
+ //5. Using System.lineSeparator()
+ System.out.println("5. Using System.lineSeparator()");
+ rhyme = line1 + System.lineSeparator() + line2;
+ System.out.println(rhyme);
+
+ //6. Using System.getProperty("line.separator")
+ System.out.println("6. Using System.getProperty(\"line.separator\")");
+ rhyme = line1 + System.getProperty("line.separator") + line2;
+ System.out.println(rhyme);
+
+ System.out.println("***HTML to rendered in a browser***");
+ //1. Line break for HTML using
+ System.out.println("1. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //2. Line break for HTML using “
”
+ System.out.println("2. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //3. Line break for HTML using “
”
+ System.out.println("3. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //4. Line break for HTML using “
;”
+ System.out.println("4. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //5. Line break for HTML using \n”
+ System.out.println("5. Line break for HTML using \\n");
+ rhyme = line1 + "\n" + line2;
+ System.out.println(rhyme);
+ }
+
+}
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java b/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
new file mode 100644
index 0000000000..80d05bb42a
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
@@ -0,0 +1,34 @@
+package com.baeldung.string.padding;
+
+public class StringPaddingUtil {
+
+ public static String padLeftSpaces(String inputString, int length) {
+ if (inputString.length() >= length) {
+ return inputString;
+ }
+ StringBuilder sb = new StringBuilder();
+ while (sb.length() < length - inputString.length()) {
+ sb.append(' ');
+ }
+ sb.append(inputString);
+
+ return sb.toString();
+ }
+
+ public static String padLeft(String inputString, int length) {
+ if (inputString.length() >= length) {
+ return inputString;
+ }
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ sb.append(' ');
+ }
+ return sb.substring(inputString.length()) + inputString;
+ }
+
+ public static String padLeftZeros(String inputString, int length) {
+ return String
+ .format("%1$" + length + "s", inputString)
+ .replace(' ', '0');
+ }
+}
diff --git a/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java b/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
new file mode 100644
index 0000000000..eeba81f334
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
@@ -0,0 +1,95 @@
+package com.baeldung.stringduplicates;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+public class RemoveDuplicateFromString {
+
+
+ String removeDuplicatesUsingCharArray(String str) {
+
+ char[] chars = str.toCharArray();
+ StringBuilder sb = new StringBuilder();
+ int repeatedCtr;
+ for (int i = 0; i < chars.length; i++) {
+ repeatedCtr = 0;
+ for (int j = i + 1; j < chars.length; j++) {
+ if (chars[i] == chars[j]) {
+ repeatedCtr++;
+ }
+ }
+ if (repeatedCtr == 0) {
+ sb.append(chars[i]);
+ }
+ }
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsinglinkedHashSet(String str) {
+
+ StringBuilder sb = new StringBuilder();
+ Set linkedHashSet = new LinkedHashSet<>();
+
+ for (int i = 0; i < str.length(); i++) {
+ linkedHashSet.add(str.charAt(i));
+ }
+
+ for (Character c : linkedHashSet) {
+ sb.append(c);
+ }
+
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsingSorting(String str) {
+
+ char[] chars = str.toCharArray();
+
+ Arrays.sort(chars);
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(chars[0]);
+ for (int i = 1; i < chars.length; i++) {
+ if (chars[i] != chars[i - 1]) {
+ sb.append(chars[i]);
+ }
+ }
+
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsingHashSet(String str) {
+
+ StringBuilder sb = new StringBuilder();
+ Set hashSet = new HashSet<>();
+
+ for (int i = 0; i < str.length(); i++) {
+ hashSet.add(str.charAt(i));
+ }
+
+ for (Character c : hashSet) {
+ sb.append(c);
+ }
+
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsingIndexOf(String str) {
+
+ StringBuilder sb = new StringBuilder();
+ int idx;
+ for (int i = 0; i < str.length(); i++) {
+ char c = str.charAt(i);
+ idx = str.indexOf(c, i + 1);
+ if (idx == -1) {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+}
+
+
diff --git a/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
index 3a4e231828..eb397f2a3f 100644
--- a/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
+++ b/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
@@ -59,4 +59,14 @@ public class SubstringUnitTest {
Assert.assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')')));
}
+ @Test
+ public void givenAString_whenUsedSubstringWithLastIndexOf_ShouldReturnProperSubstring() {
+ Assert.assertEquals("1984", text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));
+ }
+
+ @Test
+ public void givenAString_whenUsedSubstringWithIndexOfAString_ShouldReturnProperSubstring() {
+ Assert.assertEquals("USA (United States of America)", text.substring(text.indexOf("USA"), text.indexOf(')') + 1));
+ }
+
}
diff --git a/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java b/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
new file mode 100644
index 0000000000..f6a077a88e
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.string.padding;
+
+import com.google.common.base.Strings;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringPaddingUtilUnitTest {
+
+ String inputString = "123456";
+ String expectedPaddedStringSpaces = " 123456";
+ String expectedPaddedStringZeros = "0000123456";
+ int minPaddedStringLength = 10;
+
+ @Test
+ public void givenString_whenPaddingWithSpaces_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, StringPaddingUtil.padLeftSpaces(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithSpacesUsingSubstring_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, StringPaddingUtil.padLeft(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithZeros_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringZeros, StringPaddingUtil.padLeftZeros(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithSpacesUsingStringUtils_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, StringUtils.leftPad(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithZerosUsingStringUtils_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringZeros, StringUtils.leftPad(inputString, minPaddedStringLength, "0"));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithSpacesUsingGuavaStrings_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, Strings.padStart(inputString, minPaddedStringLength, ' '));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithZerosUsingGuavaStrings_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringZeros, Strings.padStart(inputString, minPaddedStringLength, '0'));
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java b/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
new file mode 100644
index 0000000000..cf7819ced3
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.stringduplicates;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RemoveDuplicateFromStringUnitTest {
+
+ private final static String STR1 = "racecar";
+ private final static String STR2 = "J2ee programming";
+ private RemoveDuplicateFromString removeDuplicateFromString;
+
+ @Before
+ public void executedBeforeEach() {
+ removeDuplicateFromString = new RemoveDuplicateFromString();
+ }
+
+
+ @Test
+ public void whenUsingCharArray_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR2);
+ Assert.assertEquals("ecar", str1);
+ Assert.assertEquals("J2e poraming", str2);
+ }
+
+ @Test
+ public void whenUsingLinkedHashSet_DuplicatesShouldBeRemovedAndItKeepStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR2);
+ Assert.assertEquals("race", str1);
+ Assert.assertEquals("J2e progamin", str2);
+ }
+
+ @Test
+ public void whenUsingSorting_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingSorting(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingSorting(STR2);
+ Assert.assertEquals("acer", str1);
+ Assert.assertEquals(" 2Jaegimnopr", str2);
+ }
+
+ @Test
+ public void whenUsingHashSet_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR2);
+ Assert.assertEquals("arce", str1);
+ Assert.assertEquals(" pa2regiJmno", str2);
+ }
+
+ @Test
+ public void whenUsingIndexOf_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR2);
+ Assert.assertEquals("ecar", str1);
+ Assert.assertEquals("J2e poraming", str2);
+ }
+}
diff --git a/jersey/README.md b/jersey/README.md
index c548a79c6d..1dd871b3e8 100644
--- a/jersey/README.md
+++ b/jersey/README.md
@@ -2,3 +2,4 @@
- [Jersey MVC Support](https://www.baeldung.com/jersey-mvc)
- [Bean Validation in Jersey](https://www.baeldung.com/jersey-bean-validation)
- [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response)
+- [Exploring the Jersey Test Framework](https://www.baeldung.com/jersey-test)
diff --git a/jib/README.md b/jib/README.md
new file mode 100644
index 0000000000..82bd2fed42
--- /dev/null
+++ b/jib/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Dockerizing Java Apps using Jib](https://www.baeldung.com/jib-dockerizing)
diff --git a/json/README.md b/json/README.md
index e0679bc60b..2e253a4ae9 100644
--- a/json/README.md
+++ b/json/README.md
@@ -9,4 +9,5 @@
- [Introduction to JsonPath](http://www.baeldung.com/guide-to-jayway-jsonpath)
- [Introduction to JSON-Java (org.json)](http://www.baeldung.com/java-org-json)
- [Overview of JSON Pointer](https://www.baeldung.com/json-pointer)
-- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api)
\ No newline at end of file
+- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api)
+- [Get a Value by Key in a JSONArray](https://www.baeldung.com/java-jsonarray-get-value-by-key)
diff --git a/jta/src/main/java/com/baeldung/jtademo/services/TellerService.java b/jta/src/main/java/com/baeldung/jtademo/services/TellerService.java
index d3bd80a2ee..f79238e66a 100644
--- a/jta/src/main/java/com/baeldung/jtademo/services/TellerService.java
+++ b/jta/src/main/java/com/baeldung/jtademo/services/TellerService.java
@@ -25,7 +25,7 @@ public class TellerService {
bankAccountService.transfer(fromAccontId, toAccountId, amount);
auditService.log(fromAccontId, toAccountId, amount);
BigDecimal balance = bankAccountService.balanceOf(fromAccontId);
- if (balance.compareTo(BigDecimal.ZERO) <= 0) {
+ if (balance.compareTo(BigDecimal.ZERO) < 0) {
throw new RuntimeException("Insufficient fund.");
}
}
@@ -35,7 +35,7 @@ public class TellerService {
bankAccountService.transfer(fromAccontId, toAccountId, amount);
auditService.log(fromAccontId, toAccountId, amount);
BigDecimal balance = bankAccountService.balanceOf(fromAccontId);
- if (balance.compareTo(BigDecimal.ZERO) <= 0) {
+ if (balance.compareTo(BigDecimal.ZERO) < 0) {
userTransaction.rollback();
throw new RuntimeException("Insufficient fund.");
} else {
diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md
index 30c4d03ded..b9611043c8 100644
--- a/kotlin-libraries/README.md
+++ b/kotlin-libraries/README.md
@@ -7,3 +7,4 @@
- [Processing JSON with Kotlin and Klaxson](http://www.baeldung.com/kotlin-json-klaxson)
- [Kotlin with Ktor](http://www.baeldung.com/kotlin-ktor)
- [Guide to the Kotlin Exposed Framework](https://www.baeldung.com/kotlin-exposed-persistence)
+- [Working with Dates in Kotlin](https://www.baeldung.com/kotlin-dates)
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/CreateDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/CreateDateUnitTest.kt
new file mode 100644
index 0000000000..d52a2f0f19
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/CreateDateUnitTest.kt
@@ -0,0 +1,34 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+
+class CreateDateUnitTest {
+
+ @Test
+ fun givenString_whenDefaultFormat_thenCreated() {
+
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date).isEqualTo("2018-12-31")
+ }
+
+ @Test
+ fun givenString_whenCustomFormat_thenCreated() {
+
+ var formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")
+ var date = LocalDate.parse("31-12-2018", formatter)
+
+ assertThat(date).isEqualTo("2018-12-31")
+ }
+
+ @Test
+ fun givenYMD_whenUsingOf_thenCreated() {
+ var date = LocalDate.of(2018, 12, 31)
+
+ assertThat(date).isEqualTo("2018-12-31")
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/ExtractDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/ExtractDateUnitTest.kt
new file mode 100644
index 0000000000..ef3841752b
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/ExtractDateUnitTest.kt
@@ -0,0 +1,29 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.DayOfWeek
+import java.time.LocalDate
+import java.time.Month
+
+class ExtractDateUnitTest {
+
+ @Test
+ fun givenDate_thenExtractedYMD() {
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date.year).isEqualTo(2018)
+ assertThat(date.month).isEqualTo(Month.DECEMBER)
+ assertThat(date.dayOfMonth).isEqualTo(31)
+ }
+
+ @Test
+ fun givenDate_thenExtractedEraDowDoy() {
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date.era.toString()).isEqualTo("CE")
+ assertThat(date.dayOfWeek).isEqualTo(DayOfWeek.MONDAY)
+ assertThat(date.dayOfYear).isEqualTo(365)
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/FormatDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/FormatDateUnitTest.kt
new file mode 100644
index 0000000000..11ff6ec9f0
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/FormatDateUnitTest.kt
@@ -0,0 +1,29 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+
+class FormatDateUnitTest {
+
+ @Test
+ fun givenDate_whenDefaultFormat_thenFormattedString() {
+
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date.toString()).isEqualTo("2018-12-31")
+ }
+
+ @Test
+ fun givenDate_whenCustomFormat_thenFormattedString() {
+
+ var date = LocalDate.parse("2018-12-31")
+
+ var formatter = DateTimeFormatter.ofPattern("dd-MMMM-yyyy")
+ var formattedDate = date.format(formatter)
+
+ assertThat(formattedDate).isEqualTo("31-December-2018")
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/PeriodDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/PeriodDateUnitTest.kt
new file mode 100644
index 0000000000..e6b66634d3
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/PeriodDateUnitTest.kt
@@ -0,0 +1,48 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+import java.time.Period
+
+class PeriodDateUnitTest {
+
+ @Test
+ fun givenYMD_thenCreatePeriod() {
+ var period = Period.of(1, 2, 3)
+
+ assertThat(period.toString()).isEqualTo("P1Y2M3D")
+ }
+
+ @Test
+ fun givenPeriod_whenAdd_thenModifiedDate() {
+ var period = Period.of(1, 2, 3)
+
+ var date = LocalDate.of(2018, 6, 25)
+ var modifiedDate = date.plus(period)
+
+ assertThat(modifiedDate).isEqualTo("2019-08-28")
+ }
+
+ @Test
+ fun givenPeriod_whenSubtracted_thenModifiedDate() {
+ var period = Period.of(1, 2, 3)
+
+ var date = LocalDate.of(2018, 6, 25)
+ var modifiedDate = date.minus(period)
+
+ assertThat(modifiedDate).isEqualTo("2017-04-22")
+ }
+
+ @Test
+ fun givenTwoDate_whenUsingBetween_thenDiffOfDates() {
+
+ var date1 = LocalDate.parse("2018-06-25")
+ var date2 = LocalDate.parse("2018-12-25")
+
+ var period = Period.between(date1, date2)
+
+ assertThat(period.toString()).isEqualTo("P6M")
+ }
+
+}
\ No newline at end of file
diff --git a/libraries-data/README.md b/libraries-data/README.md
index 63ee5f9947..7e40a4a2e2 100644
--- a/libraries-data/README.md
+++ b/libraries-data/README.md
@@ -12,3 +12,5 @@
- [Guide to JMapper](https://www.baeldung.com/jmapper)
- [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch)
- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline)
+- [Intro to Apache Storm](https://www.baeldung.com/apache-storm)
+- [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm)
diff --git a/libraries/README.md b/libraries/README.md
index fcf687d806..851e3a3d17 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -83,6 +83,7 @@
- [Guide to JMapper](http://www.baeldung.com/jmapper)
- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3)
- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
+- [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/lombok/README.md b/lombok/README.md
index 34ec569e89..bd6282fd18 100644
--- a/lombok/README.md
+++ b/lombok/README.md
@@ -4,4 +4,4 @@
- [Using Lombok’s @Getter for Boolean Fields](https://www.baeldung.com/lombok-getter-boolean)
- [Lombok @Builder with Inheritance](https://www.baeldung.com/lombok-builder-inheritance)
- [Lombok Builder with Default Value](https://www.baeldung.com/lombok-builder-default-value)
-- [Lombok Builder with Custom Setter](https://www.baeldung.com/lombok-builder-with-custom-setter)
+- [Lombok Builder with Custom Setter](https://www.baeldung.com/lombok-builder-custom-setter)
diff --git a/maven/README.md b/maven/README.md
index 970250d142..1c0e50f95a 100644
--- a/maven/README.md
+++ b/maven/README.md
@@ -13,3 +13,4 @@
- [Apache Maven Standard Directory Layout](https://www.baeldung.com/maven-directory-structure)
- [Apache Maven Tutorial](https://www.baeldung.com/maven)
- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version)
+- [Multi-Module Project with Maven](https://www.baeldung.com/maven-multi-module)
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index 47d382f58d..bb89cb2729 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -77,6 +77,7 @@
3.1.0
1.0.11.RELEASE
- 2.0.5.RELEASE
+ 2.1.0.RELEASE
+ 2.1.0.RELEASE
diff --git a/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java b/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java
index e781f1fca1..1c9e4c5dc4 100644
--- a/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java
+++ b/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java
@@ -97,7 +97,7 @@ public class MappingFrameworksPerformance {
sourceCode = new SourceCode("This is source code!");
}
- public void main(String[] args) throws IOException, RunnerException {
+ public static void main(String[] args) throws IOException, RunnerException {
org.openjdk.jmh.Main.main(args);
}
diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md
index 7f52531076..a94379b5cb 100644
--- a/persistence-modules/hibernate5/README.md
+++ b/persistence-modules/hibernate5/README.md
@@ -18,3 +18,4 @@
- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column)
- [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy)
- [Proxy in Hibernate load() Method](https://www.baeldung.com/hibernate-proxy-load-method)
+- [Custom Types in Hibernate](https://www.baeldung.com/hibernate-custom-types)
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java
index 27fff147b6..8b5d9c41f3 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java
@@ -10,7 +10,7 @@ public class DeptEmployee {
private String employeeNumber;
- private String designation;
+ private String title;
private String name;
@@ -23,11 +23,11 @@ public class DeptEmployee {
this.department = department;
}
- public DeptEmployee(String name, String employeeNumber, String designation, Department department) {
+ public DeptEmployee(String name, String employeeNumber, String title, Department department) {
super();
this.name = name;
this.employeeNumber = employeeNumber;
- this.designation = designation;
+ this.title = title;
this.department = department;
}
@@ -63,11 +63,11 @@ public class DeptEmployee {
this.department = department;
}
- public String getDesignation() {
- return designation;
+ public String getTitle() {
+ return title;
}
- public void setDesignation(String designation) {
- this.designation = designation;
+ public void setTitle(String title) {
+ this.title = title;
}
}
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java
index 85cdffd54d..b7d1a537f0 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java
@@ -6,9 +6,9 @@ import com.baeldung.hibernate.entities.DeptEmployee;
public interface EmployeeSearchService {
- List filterbyDesignationUsingCriteriaBuilder(List designaitons);
+ List filterbyTitleUsingCriteriaBuilder(List titles);
- List filterbyDesignationUsingExpression(List aurhors);
+ List filterbyTitleUsingExpression(List titles);
List searchByDepartmentQuery(String query);
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java
index a9981b8066..e79168a451 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java
@@ -25,12 +25,12 @@ public class EmployeeSearchServiceImpl implements EmployeeSearchService {
}
@Override
- public List filterbyDesignationUsingCriteriaBuilder(List designations) {
+ public List filterbyTitleUsingCriteriaBuilder(List titles) {
CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class);
Root root = criteriaQuery.from(DeptEmployee.class);
- In inClause = criteriaBuilder.in(root.get("designation"));
- for (String designaiton : designations) {
- inClause.value(designaiton);
+ In inClause = criteriaBuilder.in(root.get("title"));
+ for (String title : titles) {
+ inClause.value(title);
}
criteriaQuery.select(root)
.where(inClause);
@@ -39,12 +39,12 @@ public class EmployeeSearchServiceImpl implements EmployeeSearchService {
}
@Override
- public List filterbyDesignationUsingExpression(List designations) {
+ public List filterbyTitleUsingExpression(List titles) {
CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class);
Root root = criteriaQuery.from(DeptEmployee.class);
criteriaQuery.select(root)
- .where(root.get("designation")
- .in(designations));
+ .where(root.get("title")
+ .in(titles));
TypedQuery query = entityManager.createQuery(criteriaQuery);
return query.getResultList();
}
diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java
index c7a1bc7b2a..2b12734a10 100644
--- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java
+++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java
@@ -81,42 +81,41 @@ public class EmployeeSearchServiceIntegrationTest {
@Test
public final void givenCriteriaQuery_whenSearchedUsingCriteriaBuilderWithListofAuthors_thenResultIsFilteredByAuthorNames() {
- List designations = new ArrayList() {
+ List titles = new ArrayList() {
{
add("Manager");
add("Senior Manager");
add("Director");
}
};
- List result = searchService.filterbyDesignationUsingCriteriaBuilder(designations);
+ List result = searchService.filterbyTitleUsingCriteriaBuilder(titles);
assertEquals("Number of Employees does not match with expected.", 6, result.size());
assertThat(result.stream()
- .map(DeptEmployee::getDesignation)
+ .map(DeptEmployee::getTitle)
.distinct()
- .collect(Collectors.toList()), containsInAnyOrder(designations.toArray()));
+ .collect(Collectors.toList()), containsInAnyOrder(titles.toArray()));
}
@Test
public final void givenCriteriaQuery_whenSearchedUsingExpressionWithListofAuthors_thenResultIsFilteredByAuthorNames() {
- List designations = new ArrayList() {
+ List titles = new ArrayList() {
{
add("Manager");
add("Senior Manager");
add("Director");
}
};
- List result = searchService.filterbyDesignationUsingExpression(designations);
+ List result = searchService.filterbyTitleUsingExpression(titles);
assertEquals("Number of Employees does not match with expected.", 6, result.size());
assertThat(result.stream()
- .map(DeptEmployee::getDesignation)
+ .map(DeptEmployee::getTitle)
.distinct()
- .collect(Collectors.toList()), containsInAnyOrder(designations.toArray()));
+ .collect(Collectors.toList()), containsInAnyOrder(titles.toArray()));
}
@Test
public final void givenCriteriaQuery_whenSearchedDepartmentLike_thenResultIsFilteredByDepartment() {
List result = searchService.searchByDepartmentQuery("Sales");
assertEquals("Number of Employees does not match with expected.", 7, result.size());
- // assertThat(result.stream().map(DeptEmployee::getDesignation).distinct().collect(Collectors.toList()), containsInAnyOrder(designations.toArray()));
}
}
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/Message.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/Message.java
new file mode 100644
index 0000000000..fb521cfea6
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/Message.java
@@ -0,0 +1,43 @@
+package com.baeldung.jpa.stringcast;
+
+import javax.persistence.*;
+
+@SqlResultSetMapping(name = "textQueryMapping", classes = {
+ @ConstructorResult(targetClass = Message.class, columns = {
+ @ColumnResult(name = "text")
+ })
+})
+@Entity
+public class Message {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String text;
+
+ public Message() {
+
+ }
+
+ public Message(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+}
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java
new file mode 100644
index 0000000000..6f1e2ee5ca
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java
@@ -0,0 +1,41 @@
+package com.baeldung.jpa.stringcast;
+
+import com.sun.istack.internal.Nullable;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class QueryExecutor {
+
+ public static List executeNativeQueryNoCastCheck(String statement, EntityManager em) {
+ Query query = em.createNativeQuery(statement);
+ return query.getResultList();
+ }
+
+ public static List executeNativeQueryWithCastCheck(String statement, EntityManager em) {
+ Query query = em.createNativeQuery(statement);
+ List results = query.getResultList();
+
+ if (results.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ if (results.get(0) instanceof String) {
+ return ((List) results)
+ .stream()
+ .map(s -> new String[] { s })
+ .collect(Collectors.toList());
+ } else {
+ return (List) results;
+ }
+ }
+
+ public static List executeNativeQueryGeneric(String statement, String mapping, EntityManager em) {
+ Query query = em.createNativeQuery(statement, mapping);
+ return query.getResultList();
+ }
+
+}
diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml
index 3d881673b2..3fdc8ce27c 100644
--- a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml
+++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml
@@ -20,6 +20,21 @@
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.stringcast.Message
+
+
+
+
+
+
+
+
+
+
+
org.hibernate.jpa.HibernatePersistenceProvider
diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java
new file mode 100644
index 0000000000..0a11725fc3
--- /dev/null
+++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.jpa.stringcast;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.persistence.*;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class SpringCastUnitTest {
+
+ private static EntityManager em;
+ private static EntityManagerFactory emFactory;
+
+ @BeforeClass
+ public static void setup() {
+ emFactory = Persistence.createEntityManagerFactory("jpa-h2");
+ em = emFactory.createEntityManager();
+
+ // insert an object into the db
+ Message message = new Message();
+ message.setText("text");
+
+ EntityTransaction tr = em.getTransaction();
+ tr.begin();
+ em.persist(message);
+ tr.commit();
+ }
+
+ @Test(expected = ClassCastException.class)
+ public void givenExecutorNoCastCheck_whenQueryReturnsOneColumn_thenClassCastThrown() {
+ List results = QueryExecutor.executeNativeQueryNoCastCheck("select text from message", em);
+
+ // fails
+ for (String[] row : results) {
+ // do nothing
+ }
+ }
+
+ @Test
+ public void givenExecutorWithCastCheck_whenQueryReturnsOneColumn_thenNoClassCastThrown() {
+ List results = QueryExecutor.executeNativeQueryWithCastCheck("select text from message", em);
+ assertEquals("text", results.get(0)[0]);
+ }
+
+ @Test
+ public void givenExecutorGeneric_whenQueryReturnsOneColumn_thenNoClassCastThrown() {
+ List results = QueryExecutor.executeNativeQueryGeneric("select text from message", "textQueryMapping", em);
+ assertEquals("text", results.get(0).getText());
+ }
+
+}
diff --git a/persistence-modules/java-jpa/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml
index d94221b54f..c902e0a320 100644
--- a/persistence-modules/java-jpa/src/test/resources/persistence.xml
+++ b/persistence-modules/java-jpa/src/test/resources/persistence.xml
@@ -17,5 +17,21 @@
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.stringcast.Message
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml
index 466acf5a43..76ec5a96a6 100644
--- a/persistence-modules/spring-data-mongodb/pom.xml
+++ b/persistence-modules/spring-data-mongodb/pom.xml
@@ -109,7 +109,7 @@
- 2.1.0.RELEASE
+ 2.1.2.RELEASE
4.1.4
1.1.3
5.1.0.RELEASE
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
index f1048fa145..9fa90acf86 100644
--- a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
+++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
@@ -3,6 +3,8 @@ package com.baeldung.config;
import java.util.ArrayList;
import java.util.List;
+import converter.ZonedDateTimeReadConverter;
+import converter.ZonedDateTimeWriteConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
@@ -52,6 +54,8 @@ public class MongoConfig extends AbstractMongoConfiguration {
@Override
public MongoCustomConversions customConversions() {
converters.add(new UserWriterConverter());
+ converters.add(new ZonedDateTimeReadConverter());
+ converters.add(new ZonedDateTimeWriteConverter());
return new MongoCustomConversions(converters);
}
@@ -64,5 +68,5 @@ public class MongoConfig extends AbstractMongoConfiguration {
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
-
+
}
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/Action.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/Action.java
new file mode 100644
index 0000000000..aa480dbdf7
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/Action.java
@@ -0,0 +1,51 @@
+package com.baeldung.model;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.time.ZonedDateTime;
+
+@Document
+public class Action {
+
+ @Id
+ private String id;
+
+ private String description;
+ private ZonedDateTime time;
+
+ public Action(String id, String description, ZonedDateTime time) {
+ this.id = id;
+ this.description = description;
+ this.time = time;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public ZonedDateTime getTime() {
+ return time;
+ }
+
+ public void setTime(ZonedDateTime time) {
+ this.time = time;
+ }
+
+ @Override
+ public String toString() {
+ return "Action{id='" + id + "', description='" + description + "', time=" + time + '}';
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/ActionRepository.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/ActionRepository.java
new file mode 100644
index 0000000000..bdca490fe6
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/ActionRepository.java
@@ -0,0 +1,6 @@
+package com.baeldung.repository;
+
+import com.baeldung.model.Action;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface ActionRepository extends MongoRepository { }
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeReadConverter.java b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeReadConverter.java
new file mode 100644
index 0000000000..a2d847957b
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeReadConverter.java
@@ -0,0 +1,14 @@
+package converter;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.util.Date;
+
+public class ZonedDateTimeReadConverter implements Converter {
+ @Override
+ public ZonedDateTime convert(Date date) {
+ return date.toInstant().atZone(ZoneOffset.UTC);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeWriteConverter.java b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeWriteConverter.java
new file mode 100644
index 0000000000..e13ac2d130
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeWriteConverter.java
@@ -0,0 +1,13 @@
+package converter;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.time.ZonedDateTime;
+import java.util.Date;
+
+public class ZonedDateTimeWriteConverter implements Converter {
+ @Override
+ public Date convert(ZonedDateTime zonedDateTime) {
+ return Date.from(zonedDateTime.toInstant());
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java
new file mode 100644
index 0000000000..096015ca0a
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.repository;
+
+import com.baeldung.config.MongoConfig;
+import com.baeldung.model.Action;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MongoConfig.class)
+public class ActionRepositoryLiveTest {
+
+ @Autowired
+ private MongoOperations mongoOps;
+
+ @Autowired
+ private ActionRepository actionRepository;
+
+ @Before
+ public void setup() {
+ if (!mongoOps.collectionExists(Action.class)) {
+ mongoOps.createCollection(Action.class);
+ }
+ }
+
+ @Test
+ public void givenSavedAction_TimeIsRetrievedCorrectly() {
+ String id = "testId";
+ ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
+
+ actionRepository.save(new Action(id, "click-action", now));
+ Action savedAction = actionRepository.findById(id).get();
+
+ Assert.assertEquals(now.withNano(0), savedAction.getTime().withNano(0));
+ }
+
+ @After
+ public void tearDown() {
+ mongoOps.dropCollection(Action.class);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-redis/README.md b/persistence-modules/spring-data-redis/README.md
index da44920e16..a20f5052f0 100644
--- a/persistence-modules/spring-data-redis/README.md
+++ b/persistence-modules/spring-data-redis/README.md
@@ -3,6 +3,7 @@
### Relevant Articles:
- [Introduction to Spring Data Redis](http://www.baeldung.com/spring-data-redis-tutorial)
- [PubSub Messaging with Spring Data Redis](http://www.baeldung.com/spring-data-redis-pub-sub)
+- [An Introduction to Spring Data Redis Reactive](https://www.baeldung.com/spring-data-redis-reactive)
### Build the Project with Tests Running
```
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java
new file mode 100644
index 0000000000..bdfb8e890f
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java
@@ -0,0 +1,71 @@
+package com.baeldung.manytomany.model;
+
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "course")
+public class Course {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @ManyToMany(mappedBy = "likedCourses")
+ private Set likes;
+
+ @OneToMany(mappedBy = "course")
+ private Set ratings;
+
+ @OneToMany(mappedBy = "course")
+ private Set registrations;
+
+ // additional properties
+
+ public Course() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public Set getRatings() {
+ return ratings;
+ }
+
+ public Set getRegistrations() {
+ return registrations;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Course other = (Course) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java
new file mode 100644
index 0000000000..4951f766bc
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java
@@ -0,0 +1,79 @@
+package com.baeldung.manytomany.model;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MapsId;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "course_rating")
+public class CourseRating {
+
+ @EmbeddedId
+ private CourseRatingKey id;
+
+ @ManyToOne
+ @MapsId("student_id")
+ @JoinColumn(name = "student_id")
+ private Student student;
+
+ @ManyToOne
+ @MapsId("course_id")
+ @JoinColumn(name = "course_id")
+ private Course course;
+
+ @Column(name = "rating")
+ private int rating;
+
+ public CourseRating() {
+ }
+
+ public int getRating() {
+ return rating;
+ }
+
+ public void setRating(int rating) {
+ this.rating = rating;
+ }
+
+ public CourseRatingKey getId() {
+ return id;
+ }
+
+ public Student getStudent() {
+ return student;
+ }
+
+ public Course getCourse() {
+ return course;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CourseRating other = (CourseRating) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
new file mode 100644
index 0000000000..4e7430ed92
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
@@ -0,0 +1,59 @@
+package com.baeldung.manytomany.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class CourseRatingKey implements Serializable {
+
+ @Column(name = "student_id")
+ private Long studentId;
+
+ @Column(name = "course_id")
+ private Long courseId;
+
+ public CourseRatingKey() {
+ }
+
+ public Long getStudentId() {
+ return studentId;
+ }
+
+ public Long getCourseId() {
+ return courseId;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((courseId == null) ? 0 : courseId.hashCode());
+ result = prime * result + ((studentId == null) ? 0 : studentId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CourseRatingKey other = (CourseRatingKey) obj;
+ if (courseId == null) {
+ if (other.courseId != null)
+ return false;
+ } else if (!courseId.equals(other.courseId))
+ return false;
+ if (studentId == null) {
+ if (other.studentId != null)
+ return false;
+ } else if (!studentId.equals(other.studentId))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
new file mode 100644
index 0000000000..e1f30af883
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
@@ -0,0 +1,100 @@
+package com.baeldung.manytomany.model;
+
+import java.time.LocalDateTime;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "course_registration")
+public class CourseRegistration {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "student_id")
+ private Student student;
+
+ @ManyToOne
+ @JoinColumn(name = "course_id")
+ private Course course;
+
+ @Column(name = "registered_at")
+ private LocalDateTime registeredAt;
+
+ @Column(name = "grade")
+ private int grade;
+
+ // additional properties
+
+ public CourseRegistration() {
+ }
+
+ public Student getStudent() {
+ return student;
+ }
+
+ public void setStudent(Student student) {
+ this.student = student;
+ }
+
+ public Course getCourse() {
+ return course;
+ }
+
+ public void setCourse(Course course) {
+ this.course = course;
+ }
+
+ public LocalDateTime getRegisteredAt() {
+ return registeredAt;
+ }
+
+ public void setRegisteredAt(LocalDateTime registeredAt) {
+ this.registeredAt = registeredAt;
+ }
+
+ public int getGrade() {
+ return grade;
+ }
+
+ public void setGrade(int grade) {
+ this.grade = grade;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CourseRegistration other = (CourseRegistration) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java
new file mode 100644
index 0000000000..00561593a6
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java
@@ -0,0 +1,78 @@
+package com.baeldung.manytomany.model;
+
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "student")
+public class Student {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @ManyToMany
+ @JoinTable(name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
+ private Set likedCourses;
+
+ @OneToMany(mappedBy = "student")
+ private Set ratings;
+
+ @OneToMany(mappedBy = "student")
+ private Set registrations;
+
+ // additional properties
+
+ public Student() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public Set getLikedCourses() {
+ return likedCourses;
+ }
+
+ public Set getRatings() {
+ return ratings;
+ }
+
+ public Set getRegistrations() {
+ return registrations;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Student other = (Student) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
new file mode 100644
index 0000000000..5e4334f5d4
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.manytomany;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = ManyToManyTestConfiguration.class)
+@DirtiesContext
+public class ManyToManyIntegrationTest {
+
+ @PersistenceContext
+ EntityManager entityManager;
+
+ @Test
+ public void contextStarted() {
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
new file mode 100644
index 0000000000..f4635b563a
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
@@ -0,0 +1,51 @@
+package com.baeldung.manytomany;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+
+@Configuration
+@PropertySource("classpath:/manytomany/test.properties")
+public class ManyToManyTestConfiguration {
+
+ @Bean
+ public DataSource dataSource() {
+ EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
+ return dbBuilder.setType(EmbeddedDatabaseType.H2)
+ .addScript("classpath:/manytomany/db.sql")
+ .build();
+ }
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Value("${hibernate.hbm2ddl.auto}") String hbm2ddlType, @Value("${hibernate.dialect}") String dialect, @Value("${hibernate.show_sql}") boolean showSql) {
+ LocalContainerEntityManagerFactoryBean result = new LocalContainerEntityManagerFactoryBean();
+
+ result.setDataSource(dataSource());
+ result.setPackagesToScan("com.baeldung.manytomany.model");
+ result.setJpaVendorAdapter(jpaVendorAdapter());
+
+ Map jpaProperties = new HashMap<>();
+ jpaProperties.put("hibernate.hbm2ddl.auto", hbm2ddlType);
+ jpaProperties.put("hibernate.dialect", dialect);
+ jpaProperties.put("hibernate.show_sql", showSql);
+ result.setJpaPropertyMap(jpaProperties);
+
+ return result;
+ }
+
+ public JpaVendorAdapter jpaVendorAdapter() {
+ return new HibernateJpaVendorAdapter();
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql b/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql
new file mode 100644
index 0000000000..02905e41ee
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql
@@ -0,0 +1,44 @@
+CREATE TABLE course (
+ id bigint(20) NOT NULL,
+ PRIMARY KEY (id)
+);
+
+
+CREATE TABLE student (
+ id bigint(20) NOT NULL,
+ PRIMARY KEY (id)
+);
+
+
+CREATE TABLE course_like (
+ student_id bigint(20) NOT NULL,
+ course_id bigint(20) NOT NULL,
+ PRIMARY KEY (student_id, course_id),
+ CONSTRAINT fk_course_like__student FOREIGN KEY (student_id) REFERENCES student (id),
+ CONSTRAINT fk_course_like__course FOREIGN KEY (course_id) REFERENCES course (id)
+);
+
+
+
+CREATE TABLE course_rating (
+ course_id bigint(20) NOT NULL,
+ student_id bigint(20) NOT NULL,
+ rating int(11) NOT NULL,
+ PRIMARY KEY (course_id, student_id),
+ CONSTRAINT fk_course_rating__student FOREIGN KEY (student_id) REFERENCES student (id),
+ CONSTRAINT fk_course_rating__course FOREIGN KEY (course_id) REFERENCES course (id)
+);
+
+
+
+CREATE TABLE course_registration (
+ id bigint(20) NOT NULL,
+ grade int(11),
+ registered_at datetime NOT NULL,
+ course_id bigint(20) NOT NULL,
+ student_id bigint(20) NOT NULL,
+ PRIMARY KEY (id),
+ CONSTRAINT fk_course_registration__student FOREIGN KEY (student_id) REFERENCES student (id),
+ CONSTRAINT fk_course_registration__course FOREIGN KEY (course_id) REFERENCES course (id)
+);
+
diff --git a/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties b/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties
new file mode 100644
index 0000000000..9e4236a6c2
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties
@@ -0,0 +1,6 @@
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=validate
diff --git a/pom.xml b/pom.xml
index aa79dae1d5..5ebf7ba4f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -356,6 +356,8 @@
java-strings
core-java
+ core-java-lang
+ core-java-arrays
core-java-collections
java-collections-conversions
java-collections-maps
@@ -372,12 +374,8 @@
persistence-modules/deltaspike
dozer
ethereum
- ejb
- ejb/ejb-client
feign
flips
- testing-modules/gatling
- geotools
testing-modules/groovy-spock
google-cloud
google-web-toolkit
@@ -545,7 +543,7 @@
**/*IntTest.java
**/*LongRunningUnitTest.java
**/*ManualTest.java
- **/JdbcTest.java
+ **/*JdbcTest.java
**/*LiveTest.java
@@ -898,37 +896,25 @@
integration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
@@ -1213,39 +1199,26 @@
- integration-lite
+ integration-lite-test
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
parent-boot-1
@@ -1254,270 +1227,305 @@
parent-spring-5
parent-java
parent-kotlin
- asm
- atomix
- persistence-modules/apache-cayenne
- aws
- aws-lambda
- akka-streams
- algorithms-genetic
- algorithms-miscellaneous-1
- algorithms-miscellaneous-2
- algorithms-sorting
- annotations
- apache-cxf
- apache-fop
- apache-poi
- apache-tika
- apache-thrift
- apache-curator
- apache-zookeeper
- apache-opennlp
- autovalue
- axon
- azure
- bootique
- cdi
- java-strings
-
- core-java-collections
- java-collections-conversions
- java-collections-maps
- core-java-io
- core-java-8
- java-streams
- core-groovy
-
- couchbase
- persistence-modules/deltaspike
- dozer
- ethereum
- feign
- flips
- testing-modules/groovy-spock
- google-cloud
- gson
- guava
- guava-collections
- guava-modules/guava-18
- guava-modules/guava-19
- guava-modules/guava-21
- guice
- disruptor
- spring-static-resources
- hazelcast
- persistence-modules/hbase
-
- hystrix
- image-processing
- immutables
- persistence-modules/influxdb
- jackson
- vavr
- java-lite
- java-numbers
- java-rmi
- java-vavr-stream
- javax-servlets
- javaxval
- jaxb
- javafx
- jgroups
- jee-7
- jee-7-security
- jjwt
- jsf
- json-path
- json
- jsoup
- jta
- testing-modules/junit-5
- testing-modules/junit5-migration
- jws
- libraries-data
- linkrest
- logging-modules/log-mdc
- logging-modules/log4j
-
- logging-modules/logback
- lombok
- mapstruct
-
- maven
- mesos-marathon
- msf4j
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- mustache
- mvn-wrapper
- noexception
- persistence-modules/orientdb
- osgi
- orika
- patterns
- pdf
- protobuffer
- persistence-modules/querydsl
- reactor-core
- persistence-modules/redis
- testing-modules/rest-assured
- testing-modules/rest-testing
- resteasy
- rxjava
- rxjava-2
- spring-swagger-codegen
- testing-modules/selenium-junit-testng
- persistence-modules/solr
- spark-java
+
spring-4
- spring-5-data-reactive
- spring-5-reactive
- spring-5-reactive-security
- spring-5-reactive-client
- spring-5-mvc
- spring-5-security
- spring-activiti
- spring-akka
- spring-amqp
- spring-all
- spring-amqp-simple
- spring-apache-camel
- spring-batch
- spring-bom
- spring-boot-keycloak
- spring-boot-bootstrap
- spring-boot-admin
- spring-boot-camel
- persistence-modules/spring-boot-persistence
- spring-boot-security
- spring-boot-mvc
- spring-boot-logging-log4j2
- spring-boot-disable-console-logging
- spring-cloud-data-flow
- spring-cloud
- spring-cloud-bus
- spring-core
- spring-cucumber
- spring-ejb
- spring-aop
+
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-keyvalue
- persistence-modules/spring-data-mongodb
- persistence-modules/spring-data-neo4j
+
- spring-data-rest
- persistence-modules/spring-data-solr
- spring-dispatcher-servlet
- spring-exceptions
- spring-freemarker
- persistence-modules/spring-hibernate-3
+
+ integration-lite
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-data-eclipselink
- spring-integration
- spring-jenkins-pipeline
- spring-jersey
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
- spring-jms
- spring-jooq
- persistence-modules/spring-jpa
- spring-kafka
- spring-katharsis
- spring-ldap
- spring-mockito
- spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
- spring-mvc-kotlin
- spring-protobuf
- spring-quartz
- spring-rest-angular
- spring-rest-full
- spring-rest-query-language
- spring-rest
- spring-resttemplate
- spring-rest-simple
- spring-security-acl
- spring-security-cache-control
- spring-security-client/spring-security-jsp-authentication
- spring-security-client/spring-security-jsp-authorize
- spring-security-client/spring-security-jsp-config
- spring-security-client/spring-security-mvc
- spring-security-client/spring-security-thymeleaf-authentication
- spring-security-client/spring-security-thymeleaf-authorize
- spring-security-client/spring-security-thymeleaf-config
- spring-security-core
- spring-security-mvc-boot
- spring-security-mvc-digest-auth
- spring-security-mvc-ldap
- spring-security-mvc-login
- spring-security-mvc-persisted-remember-me
- spring-security-mvc-session
- spring-security-mvc-socket
- spring-security-openid
-
- spring-security-rest-basic-auth
- spring-security-rest-custom
- spring-security-rest
- spring-security-sso
- spring-security-x509
- spring-session
- spring-sleuth
- spring-social-login
- spring-spel
- spring-state-machine
- spring-thymeleaf
- spring-userservice
- spring-zuul
- spring-remoting
- spring-reactor
- spring-vertx
- spring-vault
- spring-jinq
- spring-rest-embedded-tomcat
- testing-modules/testing
- testing-modules/testng
- video-tutorials
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+ asm
+ atomix
+ persistence-modules/apache-cayenne
+ aws
+ aws-lambda
+ akka-streams
+ algorithms-genetic
+ algorithms-miscellaneous-1
+ algorithms-miscellaneous-2
+ algorithms-sorting
+ annotations
+ apache-cxf
+ apache-fop
+ apache-poi
+ apache-tika
+ apache-thrift
+ apache-curator
+ apache-zookeeper
+ apache-opennlp
+ autovalue
+ axon
+ azure
+ bootique
+ cdi
+ java-strings
+
+ core-java-collections
+ java-collections-conversions
+ java-collections-maps
+ core-java-io
+ core-java-8
+ java-streams
+ core-groovy
- xmlunit-2
- struts-2
- apache-velocity
- apache-solrj
- rabbitmq
+ couchbase
+ persistence-modules/deltaspike
+ dozer
+ ethereum
+ feign
+ flips
+ testing-modules/groovy-spock
+ google-cloud
+ gson
+ guava
+ guava-collections
+ guava-modules/guava-18
+ guava-modules/guava-19
+ guava-modules/guava-21
+ guice
+ disruptor
+ spring-static-resources
+ hazelcast
+ persistence-modules/hbase
- persistence-modules/spring-data-gemfire
- mybatis
- spring-drools
- drools
- persistence-modules/liquibase
- spring-boot-property-exp
- testing-modules/mockserver
- testing-modules/test-containers
- undertow
- vaadin
- vertx-and-rxjava
- saas
- deeplearning4j
- lucene
- vraptor
- persistence-modules/java-cockroachdb
- spring-security-thymeleaf
- persistence-modules/java-jdbi
- jersey
- java-spi
- performance-tests
- twilio
- spring-boot-ctx-fluent
- java-ee-8-security-api
- spring-webflux-amqp
- antlr
- maven-archetype
- apache-meecrowave
+ hystrix
+ image-processing
+ immutables
+ persistence-modules/influxdb
+ jackson
+ vavr
+ java-lite
+ java-numbers
+ java-rmi
+ java-vavr-stream
+ javax-servlets
+ javaxval
+ jaxb
+ javafx
+ jgroups
+ jee-7
+ jee-7-security
+ jjwt
+ jsf
+ json-path
+ json
+ jsoup
+ jta
+ testing-modules/junit-5
+ testing-modules/junit5-migration
+ jws
+ libraries-data
+ linkrest
+ logging-modules/log-mdc
+ logging-modules/log4j
+
+ logging-modules/logback
+ lombok
+ mapstruct
+
+ maven
+ mesos-marathon
+ msf4j
+ testing-modules/mockito
+ testing-modules/mockito-2
+ testing-modules/mocks
+ mustache
+ mvn-wrapper
+ noexception
+ persistence-modules/orientdb
+ osgi
+ orika
+ patterns
+ pdf
+ protobuffer
+ persistence-modules/querydsl
+ reactor-core
+ persistence-modules/redis
+ testing-modules/rest-assured
+ testing-modules/rest-testing
+ resteasy
+ rxjava
+ rxjava-2
+ spring-swagger-codegen
+ testing-modules/selenium-junit-testng
+ persistence-modules/solr
+ spark-java
+ spring-4
+ spring-5-data-reactive
+ spring-5-reactive
+ spring-5-reactive-security
+ spring-5-reactive-client
+ spring-5-mvc
+ spring-5-security
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-all
+ spring-amqp-simple
+ spring-apache-camel
+ spring-batch
+ spring-bom
+ spring-boot-keycloak
+ spring-boot-bootstrap
+ spring-boot-admin
+ spring-boot-camel
+ persistence-modules/spring-boot-persistence
+ spring-boot-security
+ spring-boot-mvc
+ spring-boot-logging-log4j2
+ spring-boot-disable-console-logging
+ spring-cloud-data-flow
+ spring-cloud
+ spring-cloud-bus
+ spring-core
+ spring-cucumber
+ spring-ejb
+ spring-aop
+
+ persistence-modules/spring-data-dynamodb
+ persistence-modules/spring-data-keyvalue
+ persistence-modules/spring-data-mongodb
+ persistence-modules/spring-data-neo4j
+
+ spring-data-rest
+ persistence-modules/spring-data-solr
+ spring-dispatcher-servlet
+ spring-exceptions
+ spring-freemarker
+ persistence-modules/spring-hibernate-3
+
+ persistence-modules/spring-hibernate-5
+ persistence-modules/spring-data-eclipselink
+ spring-integration
+ spring-jenkins-pipeline
+ spring-jersey
+
+ spring-jms
+ spring-jooq
+ persistence-modules/spring-jpa
+ spring-kafka
+ spring-katharsis
+ spring-ldap
+ spring-mockito
+ spring-mvc-forms-jsp
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
+ spring-mvc-kotlin
+ spring-protobuf
+ spring-quartz
+ spring-rest-angular
+ spring-rest-full
+ spring-rest-query-language
+ spring-rest
+ spring-resttemplate
+ spring-rest-simple
+ spring-security-acl
+ spring-security-cache-control
+ spring-security-client/spring-security-jsp-authentication
+ spring-security-client/spring-security-jsp-authorize
+ spring-security-client/spring-security-jsp-config
+ spring-security-client/spring-security-mvc
+ spring-security-client/spring-security-thymeleaf-authentication
+ spring-security-client/spring-security-thymeleaf-authorize
+ spring-security-client/spring-security-thymeleaf-config
+ spring-security-core
+ spring-security-mvc-boot
+ spring-security-mvc-digest-auth
+ spring-security-mvc-ldap
+ spring-security-mvc-login
+ spring-security-mvc-persisted-remember-me
+ spring-security-mvc-session
+ spring-security-mvc-socket
+ spring-security-openid
+
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-rest
+ spring-security-sso
+ spring-security-x509
+ spring-session
+ spring-sleuth
+ spring-social-login
+ spring-spel
+ spring-state-machine
+ spring-thymeleaf
+ spring-userservice
+ spring-zuul
+ spring-remoting
+ spring-reactor
+ spring-vertx
+ spring-vault
+ spring-jinq
+ spring-rest-embedded-tomcat
+ testing-modules/testing
+ testing-modules/testng
+ video-tutorials
+
+ xmlunit-2
+ struts-2
+ apache-velocity
+ apache-solrj
+ rabbitmq
+
+ persistence-modules/spring-data-gemfire
+ mybatis
+ spring-drools
+ drools
+ persistence-modules/liquibase
+ spring-boot-property-exp
+ testing-modules/mockserver
+ testing-modules/test-containers
+ undertow
+ vaadin
+ vertx-and-rxjava
+ saas
+ deeplearning4j
+ lucene
+ vraptor
+ persistence-modules/java-cockroachdb
+ spring-security-thymeleaf
+ persistence-modules/java-jdbi
+ jersey
+ java-spi
+ performance-tests
+ twilio
+ spring-boot-ctx-fluent
+ java-ee-8-security-api
+ spring-webflux-amqp
+ antlr
+ maven-archetype
+ apache-meecrowave
persistence-modules/spring-hibernate4
xml
@@ -1535,28 +1543,28 @@
persistence-modules/spring-data-redis
jmeter
- -->
+ -->
-
-
+
+ -->
-
+
-
+
integration-heavy
@@ -1566,28 +1574,15 @@
org.apache.maven.plugins
maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
- json
-
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
@@ -1641,12 +1636,15 @@
false
false
+
4.12
1.3
2.21.0
+
1.7.21
1.1.7
+
2.21.0
3.7.0
diff --git a/rxjava-2/README.md b/rxjava-2/README.md
index 78eb6e6428..f9528bb1d5 100644
--- a/rxjava-2/README.md
+++ b/rxjava-2/README.md
@@ -5,3 +5,4 @@
- [RxJava 2 - Completable](http://www.baeldung.com/rxjava-completable)
- [RxJava Maybe](http://www.baeldung.com/rxjava-maybe)
- [Introduction to RxRelay for RxJava](http://www.baeldung.com/rx-relay)
+- [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable)
diff --git a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java
index f2963c4fa5..ba913bc2d7 100644
--- a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java
+++ b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java
@@ -8,8 +8,8 @@ import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
-import reactor.ipc.netty.NettyContext;
-import reactor.ipc.netty.http.server.HttpServer;
+import reactor.netty.DisposableServer;
+import reactor.netty.http.server.HttpServer;
@ComponentScan(basePackages = {"com.baeldung.reactive.security"})
@EnableWebFlux
@@ -18,17 +18,16 @@ public class SpringSecurity5Application {
public static void main(String[] args) {
try (AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(SpringSecurity5Application.class)) {
- context.getBean(NettyContext.class).onClose().block();
+ context.getBean(DisposableServer.class).onDispose().block();
}
}
@Bean
- public NettyContext nettyContext(ApplicationContext context) {
+ public DisposableServer nettyContext(ApplicationContext context) {
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context)
.build();
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
- HttpServer httpServer = HttpServer.create("localhost", 8080);
- return httpServer.newHandler(adapter).block();
+ return HttpServer.create().host("localhost").port(8080).handle(adapter).bind().block();
}
}
diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md
index 1431554882..267925b798 100644
--- a/spring-5-reactive/README.md
+++ b/spring-5-reactive/README.md
@@ -14,4 +14,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors)
- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors)
- [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events)
-- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/a-guide-to-spring-session-reactive-support-websession/)
\ No newline at end of file
+- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive)
+- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation)
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java
index 8707c27fb3..384600994e 100644
--- a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java
@@ -1,5 +1,6 @@
package com.baeldung.reactive;
+import com.baeldung.web.reactive.Task;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.springframework.http.server.reactive.HttpHandler;
@@ -7,13 +8,10 @@ import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
-
-import com.baeldung.web.reactive.Task;
-
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
-import reactor.ipc.netty.NettyContext;
-import reactor.ipc.netty.http.server.HttpServer;
+import reactor.netty.DisposableServer;
+import reactor.netty.http.server.HttpServer;
import java.time.Duration;
@@ -21,12 +19,11 @@ import static org.springframework.web.reactive.function.server.RequestPredicates
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
public class Spring5ReactiveServerClientIntegrationTest {
-
- private static NettyContext nettyContext;
+ private static DisposableServer nettyServer;
@BeforeAll
public static void setUp() throws Exception {
- HttpServer server = HttpServer.create("localhost", 8080);
+ HttpServer server = HttpServer.create().host("localhost").port(8080);
RouterFunction> route = RouterFunctions.route(POST("/task/process"), request -> ServerResponse.ok()
.body(request.bodyToFlux(Task.class)
.map(ll -> new Task("TaskName", 1)), Task.class))
@@ -34,13 +31,12 @@ public class Spring5ReactiveServerClientIntegrationTest {
.body(Mono.just("server is alive"), String.class)));
HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);
- nettyContext = server.newHandler(adapter)
- .block();
+ nettyServer = server.handle(adapter).bind().block();
}
@AfterAll
public static void shutDown() {
- nettyContext.dispose();
+ nettyServer.dispose();
}
// @Test
diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml
index 1435019c24..da62f39fa9 100644
--- a/spring-5-security/pom.xml
+++ b/spring-5-security/pom.xml
@@ -31,10 +31,15 @@
org.thymeleaf.extras
- thymeleaf-extras-springsecurity4
+ thymeleaf-extras-springsecurity5
+
+ org.springframework.security.oauth.boot
+ spring-security-oauth2-autoconfigure
+ ${oauth-auto.version}
+
org.springframework.security
spring-security-oauth2-client
@@ -58,12 +63,6 @@
spring-security-test
test
-
-
- org.springframework.security.oauth.boot
- spring-security-oauth2-autoconfigure
- 2.0.1.RELEASE
-
@@ -79,4 +78,4 @@
-
\ No newline at end of file
+
diff --git a/spring-all/README.md b/spring-all/README.md
index ded5e26285..34e5c3435e 100644
--- a/spring-all/README.md
+++ b/spring-all/README.md
@@ -4,10 +4,12 @@
This project is used to replicate Spring Exceptions only.
-###The Course
+### The Course
+
The "REST With Spring" Classes: http://bit.ly/restwithspring
-
-### Relevant articles:
+
+### Relevant articles:
+
- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire)
- [Properties with Spring](http://www.baeldung.com/properties-with-spring) - checkout the `org.baeldung.properties` package for all scenarios of properties injection and usage
- [Spring Profiles](http://www.baeldung.com/spring-profiles)
@@ -30,3 +32,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts)
- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator)
- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary)
+- [Spring Events](https://www.baeldung.com/spring-events)
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java
new file mode 100644
index 0000000000..f750c40a6e
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java
@@ -0,0 +1,46 @@
+package org.baeldung.springevents.synchronous;
+
+import org.springframework.context.event.ContextStartedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.event.TransactionPhase;
+import org.springframework.transaction.event.TransactionalEventListener;
+
+@Component
+public class AnnotationDrivenEventListener {
+
+ // for tests
+ private boolean hitContextStartedHandler = false;
+ private boolean hitSuccessfulEventHandler = false;
+ private boolean hitCustomEventHandler = false;
+
+ @EventListener
+ public void handleContextStart(final ContextStartedEvent cse) {
+ System.out.println("Handling context started event.");
+ hitContextStartedHandler = true;
+ }
+
+ @EventListener(condition = "#event.success")
+ public void handleSuccessful(final GenericSpringEvent event) {
+ System.out.println("Handling generic event (conditional): " + event.getWhat());
+ hitSuccessfulEventHandler = true;
+ }
+
+ @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
+ public void handleCustom(final CustomSpringEvent event) {
+ System.out.println("Handling event inside a transaction BEFORE COMMIT.");
+ hitCustomEventHandler = true;
+ }
+
+ boolean isHitContextStartedHandler() {
+ return hitContextStartedHandler;
+ }
+
+ boolean isHitSuccessfulEventHandler() {
+ return hitSuccessfulEventHandler;
+ }
+
+ boolean isHitCustomEventHandler() {
+ return hitCustomEventHandler;
+ }
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java
index 052437e555..9f8b2e6e83 100644
--- a/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java
@@ -7,9 +7,16 @@ import org.springframework.stereotype.Component;
@Component
public class ContextRefreshedListener implements ApplicationListener {
+ // for tests
+ private boolean hitContextRefreshedHandler = false;
+
@Override
public void onApplicationEvent(final ContextRefreshedEvent cse) {
System.out.println("Handling context re-freshed event. ");
+ hitContextRefreshedHandler = true;
}
+ boolean isHitContextRefreshedHandler() {
+ return hitContextRefreshedHandler;
+ }
}
\ No newline at end of file
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java
index 4569de1d5e..3182090d5d 100644
--- a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java
@@ -16,4 +16,16 @@ public class CustomSpringEventPublisher {
applicationEventPublisher.publishEvent(customSpringEvent);
}
+ public void publishGenericEvent(final String message, boolean success) {
+ System.out.println("Publishing generic event.");
+ final GenericSpringEvent genericSpringEvent = new GenericStringSpringEvent(message, success);
+ applicationEventPublisher.publishEvent(genericSpringEvent);
+ }
+
+ public void publishGenericAppEvent(final String message) {
+ System.out.println("Publishing generic event.");
+ final GenericSpringAppEvent genericSpringEvent = new GenericStringSpringAppEvent(this, message);
+ applicationEventPublisher.publishEvent(genericSpringEvent);
+ }
+
}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java
new file mode 100644
index 0000000000..6804312189
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java
@@ -0,0 +1,18 @@
+package org.baeldung.springevents.synchronous;
+
+import org.springframework.context.ApplicationEvent;
+
+public class GenericSpringAppEvent extends ApplicationEvent {
+
+ private final T what;
+
+ public GenericSpringAppEvent(final Object source, final T what) {
+ super(source);
+ this.what = what;
+ }
+
+ public T getWhat() {
+ return what;
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java
new file mode 100644
index 0000000000..ce2c223fec
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java
@@ -0,0 +1,21 @@
+package org.baeldung.springevents.synchronous;
+
+public class GenericSpringEvent {
+
+ private final T what;
+ protected final boolean success;
+
+ public GenericSpringEvent(final T what, final boolean success) {
+ this.what = what;
+ this.success = success;
+ }
+
+ public T getWhat() {
+ return what;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java
new file mode 100644
index 0000000000..1f5e3e7068
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java
@@ -0,0 +1,22 @@
+package org.baeldung.springevents.synchronous;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.lang.NonNull;
+import org.springframework.stereotype.Component;
+
+@Component
+public class GenericSpringEventListener implements ApplicationListener> {
+
+ // for testing
+ private boolean hitEventHandler = false;
+
+ @Override
+ public void onApplicationEvent(@NonNull final GenericSpringAppEvent event) {
+ System.out.println("Received spring generic event - " + event.getWhat());
+ hitEventHandler = true;
+ }
+
+ boolean isHitEventHandler() {
+ return hitEventHandler;
+ }
+}
\ No newline at end of file
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java
new file mode 100644
index 0000000000..fd214696e7
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java
@@ -0,0 +1,9 @@
+package org.baeldung.springevents.synchronous;
+
+class GenericStringSpringAppEvent extends GenericSpringAppEvent {
+
+ GenericStringSpringAppEvent(final Object source, final String what) {
+ super(source, what);
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java
new file mode 100644
index 0000000000..dd4e4e3ed4
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java
@@ -0,0 +1,9 @@
+package org.baeldung.springevents.synchronous;
+
+public class GenericStringSpringEvent extends GenericSpringEvent {
+
+ GenericStringSpringEvent(final String what, final boolean success) {
+ super(what, success);
+ }
+
+}
diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java b/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java
index ac8758bbf6..e8e6f91b06 100644
--- a/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java
+++ b/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java
@@ -3,16 +3,23 @@ package org.baeldung.springevents.synchronous;
import org.baeldung.springevents.synchronous.SynchronousSpringEventsConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import static org.springframework.util.Assert.isTrue;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SynchronousSpringEventsConfig.class }, loader = AnnotationConfigContextLoader.class)
public class ContextRefreshedListenerIntegrationTest {
+ @Autowired
+ private ContextRefreshedListener listener;
+
@Test
- public void testContextRefreshedListener() throws InterruptedException {
+ public void testContextRefreshedListener() {
System.out.println("Test context re-freshed listener.");
+ isTrue(listener.isHitContextRefreshedHandler(), "Refresh should be called once");
}
}
\ No newline at end of file
diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java b/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java
new file mode 100644
index 0000000000..f183314b6d
--- /dev/null
+++ b/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java
@@ -0,0 +1,28 @@
+package org.baeldung.springevents.synchronous;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import static org.springframework.util.Assert.isTrue;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { SynchronousSpringEventsConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class GenericAppEventListenerIntegrationTest {
+
+ @Autowired
+ private CustomSpringEventPublisher publisher;
+ @Autowired
+ private GenericSpringEventListener listener;
+
+ @Test
+ public void testGenericSpringEvent() {
+ isTrue(!listener.isHitEventHandler(), "The initial value should be false");
+ publisher.publishGenericAppEvent("Hello world!!!");
+ isTrue(listener.isHitEventHandler(), "Now the value should be changed to true");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java b/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java
index f9783f57dc..b169cfec36 100644
--- a/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java
+++ b/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java
@@ -1,5 +1,6 @@
package org.baeldung.springevents.synchronous;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -7,16 +8,42 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import static org.springframework.util.Assert.isTrue;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SynchronousSpringEventsConfig.class }, loader = AnnotationConfigContextLoader.class)
public class SynchronousCustomSpringEventsIntegrationTest {
@Autowired
private CustomSpringEventPublisher publisher;
+ @Autowired
+ private AnnotationDrivenEventListener listener;
@Test
- public void testCustomSpringEvents() throws InterruptedException {
+ public void testCustomSpringEvents() {
+ isTrue(!listener.isHitCustomEventHandler(), "The value should be false");
publisher.publishEvent("Hello world!!");
System.out.println("Done publishing synchronous custom event. ");
+ isTrue(listener.isHitCustomEventHandler(), "Now the value should be changed to true");
+ }
+
+ @Test
+ public void testGenericSpringEvent() {
+ isTrue(!listener.isHitSuccessfulEventHandler(), "The initial value should be false");
+ publisher.publishGenericEvent("Hello world!!!", true);
+ isTrue(listener.isHitSuccessfulEventHandler(), "Now the value should be changed to true");
+ }
+
+ @Test
+ public void testGenericSpringEventNotProcessed() {
+ isTrue(!listener.isHitSuccessfulEventHandler(), "The initial value should be false");
+ publisher.publishGenericEvent("Hello world!!!", false);
+ isTrue(!listener.isHitSuccessfulEventHandler(), "The value should still be false");
+ }
+
+ @Ignore("fix me")
+ @Test
+ public void testContextStartedEvent() {
+ isTrue(listener.isHitContextStartedHandler(), "Start should be called once");
}
}
diff --git a/spring-boot-mvc/README.md b/spring-boot-mvc/README.md
index e7b42f8f50..bf32e4fc7c 100644
--- a/spring-boot-mvc/README.md
+++ b/spring-boot-mvc/README.md
@@ -9,3 +9,4 @@
- [Display RSS Feed with Spring MVC](http://www.baeldung.com/spring-mvc-rss-feed)
- [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao)
- [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache)
+- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
\ No newline at end of file
diff --git a/spring-boot-mvc/pom.xml b/spring-boot-mvc/pom.xml
index 5f6cdff85b..b219e53431 100644
--- a/spring-boot-mvc/pom.xml
+++ b/spring-boot-mvc/pom.xml
@@ -15,6 +15,7 @@
+
org.springframework.boot
spring-boot-starter-web
@@ -23,6 +24,7 @@
org.apache.tomcat.embed
tomcat-embed-jasper
+
org.glassfish
@@ -30,17 +32,13 @@
2.3.7
+
org.springframework.boot
spring-boot-starter-test
test
-
- org.springframework.boot
- spring-boot-starter-validation
-
-
com.rometools
@@ -48,6 +46,7 @@
${rome.version}
+
org.hibernate.validator
hibernate-validator
@@ -56,6 +55,23 @@
javax.validation
validation-api
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ io.springfox
+ springfox-swagger2
+ ${spring.fox.version}
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${spring.fox.version}
+
+
@@ -72,6 +88,7 @@
+ 2.9.2
1.10.0
com.baeldung.springbootmvc.SpringBootMvcApplication
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java
new file mode 100644
index 0000000000..14e46b2306
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.swaggerboot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java
new file mode 100644
index 0000000000..3041dfdcc8
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java
@@ -0,0 +1,68 @@
+package com.baeldung.swaggerboot.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger.web.*;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.Collections;
+
+@Configuration
+@EnableSwagger2
+@ComponentScan("com.baeldung.swaggerboot.controller")
+public class SpringFoxConfig {
+
+ private ApiInfo apiInfo() {
+ return new ApiInfo(
+ "My REST API",
+ "Some custom description of API.",
+ "API TOS",
+ "Terms of service",
+ new Contact("John Doe", "www.example.com", "myeaddress@company.com"),
+ "License of API",
+ "API license URL",
+ Collections.emptyList());
+ }
+
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.any())
+ .build();
+ }
+
+ /**
+ * SwaggerUI information
+ */
+
+ @Bean
+ UiConfiguration uiConfig() {
+ return UiConfigurationBuilder.builder()
+ .deepLinking(true)
+ .displayOperationId(false)
+ .defaultModelsExpandDepth(1)
+ .defaultModelExpandDepth(1)
+ .defaultModelRendering(ModelRendering.EXAMPLE)
+ .displayRequestDuration(false)
+ .docExpansion(DocExpansion.NONE)
+ .filter(false)
+ .maxDisplayedTags(null)
+ .operationsSorter(OperationsSorter.ALPHA)
+ .showExtensions(false)
+ .tagsSorter(TagsSorter.ALPHA)
+ .supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS)
+ .validatorUrl(null)
+ .build();
+ }
+
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java
new file mode 100644
index 0000000000..676937f7d7
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java
@@ -0,0 +1,14 @@
+package com.baeldung.swaggerboot.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class RegularRestController {
+
+ @GetMapping("home")
+ public String getSession() {
+ return "Hello";
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-mvc/src/main/resources/application.properties b/spring-boot-mvc/src/main/resources/application.properties
index e69de29bb2..709574239b 100644
--- a/spring-boot-mvc/src/main/resources/application.properties
+++ b/spring-boot-mvc/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
diff --git a/spring-boot/.attach_pid12812 b/spring-boot/.attach_pid12812
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot/README.MD b/spring-boot/README.MD
index f09ab27fb5..016d2841d7 100644
--- a/spring-boot/README.MD
+++ b/spring-boot/README.MD
@@ -34,4 +34,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey)
- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning)
- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
-- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report)
\ No newline at end of file
+- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report)
+- [Injecting Git Information Into Spring](https://www.baeldung.com/spring-git-information)
diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml
index f16460b7c3..87c782b044 100644
--- a/spring-boot/pom.xml
+++ b/spring-boot/pom.xml
@@ -1,4 +1,5 @@
-
4.0.0
spring-boot
@@ -55,6 +56,14 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.ehcache
+ ehcache
+
+
+ org.hibernate
+ hibernate-ehcache
+
org.springframework.boot
spring-boot-starter-actuator
@@ -70,6 +79,11 @@
graphql-java-tools
${graphql-java-tools.version}
+
+ com.graphql-java
+ graphiql-spring-boot-starter
+ ${graphiql-spring-boot-starter.version}
+
org.springframework.boot
@@ -143,10 +157,10 @@
chaos-monkey-spring-boot
${chaos.monkey.version}
-
+
- javax.validation
- validation-api
+ javax.validation
+ validation-api
@@ -170,6 +184,26 @@
pl.project13.maven
git-commit-id-plugin
${git-commit-id-plugin.version}
+
+
+ get-the-git-infos
+
+ revision
+
+ initialize
+
+
+ validate-the-git-infos
+
+ validateRevision
+
+ package
+
+
+
+ true
+ ${project.build.outputDirectory}/git.properties
+
@@ -220,10 +254,11 @@
2.4.1.Final
1.9.0
2.0.0
- 3.6.0
- 3.2.0
+ 5.0.2
+ 5.0.2
+ 5.2.4
18.0
- 2.2.4
+ 2.2.4
diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
index e079b9a665..cc05fd4fbd 100644
--- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
+++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
@@ -30,7 +30,7 @@ public class ContactInfoValidator implements ConstraintValidator {
- Optional findOne(String id);
+ Optional findById(String id);
}
diff --git a/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java b/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java
index 3489732b6f..7bd5c36786 100644
--- a/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java
+++ b/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java
@@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class FailureAnalyzerApplication {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(FailureAnalyzerApplication.class, args);
}
}
diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java
index c92d1c32e6..c3af611f3b 100644
--- a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java
+++ b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java
@@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class InternationalizationApp {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(InternationalizationApp.class, args);
}
}
diff --git a/spring-boot/src/main/java/com/baeldung/rss/RssApp.java b/spring-boot/src/main/java/com/baeldung/rss/RssApp.java
index d3d3d0241f..e067d3cfd1 100644
--- a/spring-boot/src/main/java/com/baeldung/rss/RssApp.java
+++ b/spring-boot/src/main/java/com/baeldung/rss/RssApp.java
@@ -1,18 +1,17 @@
package com.baeldung.rss;
+import javax.annotation.security.RolesAllowed;
+
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
-import javax.annotation.security.RolesAllowed;
-
@SpringBootApplication
@ComponentScan(basePackages = "com.baeldung.rss")
public class RssApp {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(RssApp.class, args);
}
diff --git a/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java b/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java
index 27be6b7cca..fa84cf0d9b 100644
--- a/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java
+++ b/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java
@@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class ToggleApplication {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(ToggleApplication.class, args);
}
}
diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
index 9132e710d1..354c64c258 100644
--- a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
+++ b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
@@ -4,8 +4,6 @@ import org.baeldung.demo.model.Foo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.context.annotation.Bean;
-import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;
@EntityScan(basePackageClasses = Foo.class)
@SpringBootApplication
@@ -15,9 +13,4 @@ public class Application {
System.setProperty("spring.profiles.active", "exception");
SpringApplication.run(Application.class, args);
}
-
- @Bean
- public HibernateJpaSessionFactoryBean sessionFactory() {
- return new HibernateJpaSessionFactoryBean();
- }
}
diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
index 52407a2117..607bae83ba 100644
--- a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
+++ b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
@@ -1,5 +1,7 @@
package org.baeldung.session.exception.repository;
+import javax.persistence.EntityManagerFactory;
+
import org.baeldung.demo.model.Foo;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -10,16 +12,15 @@ import org.springframework.stereotype.Repository;
@Repository
public class FooRepositoryImpl implements FooRepository {
@Autowired
- private SessionFactory sessionFactory;
+ private EntityManagerFactory emf;
@Override
public void save(Foo foo) {
- sessionFactory.getCurrentSession().saveOrUpdate(foo);
+ emf.unwrap(SessionFactory.class).getCurrentSession().saveOrUpdate(foo);
}
@Override
public Foo get(Integer id) {
- return sessionFactory.getCurrentSession().get(Foo.class, id);
+ return emf.unwrap(SessionFactory.class).getCurrentSession().get(Foo.class, id);
}
-
}
\ No newline at end of file
diff --git a/spring-boot/src/main/resources/META-INF/spring.factories b/spring-boot/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..e3d3aa4c8e
--- /dev/null
+++ b/spring-boot/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
\ No newline at end of file
diff --git a/spring-boot/src/main/resources/application.properties b/spring-boot/src/main/resources/application.properties
index 629e880940..6a52dd1f70 100644
--- a/spring-boot/src/main/resources/application.properties
+++ b/spring-boot/src/main/resources/application.properties
@@ -7,7 +7,7 @@ spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto = update
management.endpoints.jmx.domain=Spring Sample Application
-management.endpoints.jmx.uniqueNames=true
+spring.jmx.unique-names=true
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true
@@ -17,7 +17,6 @@ management.endpoint.shutdown.enabled=true
##endpoints.jolokia.path=jolokia
spring.jmx.enabled=true
-management.endpoints.jmx.enabled=true
## for pretty printing of json when endpoints accessed over HTTP
http.mappers.jsonPrettyPrint=true
diff --git a/spring-boot/src/main/resources/demo.properties b/spring-boot/src/main/resources/demo.properties
index 649b64f59b..6b4cbeb7a0 100644
--- a/spring-boot/src/main/resources/demo.properties
+++ b/spring-boot/src/main/resources/demo.properties
@@ -1,6 +1,2 @@
spring.output.ansi.enabled=never
server.port=7070
-
-# Security
-security.user.name=admin
-security.user.password=password
\ No newline at end of file
diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java
index 2c3ac2e159..8c85934fac 100644
--- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java
@@ -20,7 +20,6 @@ import static org.junit.Assert.assertTrue;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootAnnotatedApp.class)
-@TestPropertySource(properties = { "security.basic.enabled=false" })
public class SpringBootWithServletComponentIntegrationTest {
@Autowired
diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java
index a30d3ed3f2..c29cd75e9d 100644
--- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java
@@ -19,7 +19,6 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootPlainApp.class)
-@TestPropertySource(properties = { "security.basic.enabled=false" })
public class SpringBootWithoutServletComponentIntegrationTest {
@Autowired
diff --git a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java
index aab4836b6f..e933920a96 100644
--- a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java
@@ -1,31 +1,34 @@
package com.baeldung.displayallbeans;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.BDDAssertions.then;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.actuate.beans.BeansEndpoint.ContextBeans;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.BDDAssertions.then;
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-@TestPropertySource(properties = { "management.port=0", "endpoints.beans.id=springbeans", "endpoints.beans.sensitive=false" })
+@TestPropertySource(properties = { "management.port=0", "management.endpoints.web.exposure.include=*" })
public class DisplayBeanIntegrationTest {
@LocalServerPort
@@ -40,6 +43,8 @@ public class DisplayBeanIntegrationTest {
@Autowired
private WebApplicationContext context;
+ private static final String ACTUATOR_PATH = "/actuator";
+
@Test
public void givenRestTemplate_whenAccessServerUrl_thenHttpStatusOK() throws Exception {
ResponseEntity entity = this.testRestTemplate.getForEntity("http://localhost:" + this.port + "/displayallbeans", String.class);
@@ -49,22 +54,27 @@ public class DisplayBeanIntegrationTest {
@Test
public void givenRestTemplate_whenAccessEndpointUrl_thenHttpStatusOK() throws Exception {
- @SuppressWarnings("rawtypes")
- ResponseEntity entity = this.testRestTemplate.getForEntity("http://localhost:" + this.mgt + "/springbeans", List.class);
+ ParameterizedTypeReference