diff --git a/akka-modules/pom.xml b/akka-modules/pom.xml
index 490da5b7a8..0e3563f31a 100644
--- a/akka-modules/pom.xml
+++ b/akka-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
akka-modules
akka-modules
diff --git a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
index 06c8f66bcd..c16ca34fdc 100644
--- a/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
+++ b/apache-spark/src/test/java/com/baeldung/dataframes/CustomerToDataFrameConverterAppUnitTest.java
@@ -8,6 +8,8 @@ import java.util.List;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SparkSession;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
class CustomerToDataFrameConverterAppUnitTest {
@@ -59,4 +61,9 @@ class CustomerToDataFrameConverterAppUnitTest {
assertEquals( "Male", row2.getAs("gender"));
assertEquals( 1200, (int)row2.getAs("transaction_amount"));
}
+
+ @AfterEach
+ public void cleanup() {
+ SparkSession.getActiveSession().get().close();
+ }
}
diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml
index eac47bc093..ad6922e327 100644
--- a/cas/cas-secured-app/pom.xml
+++ b/cas/cas-secured-app/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -59,4 +58,4 @@
-
+
\ No newline at end of file
diff --git a/cas/pom.xml b/cas/pom.xml
index 4d8695dad8..2f24e41453 100644
--- a/cas/pom.xml
+++ b/cas/pom.xml
@@ -19,4 +19,4 @@
cas-secured-app
-
+
\ No newline at end of file
diff --git a/core-groovy-modules/pom.xml b/core-groovy-modules/pom.xml
index 2fd4da17f9..ccbd5cdcb5 100644
--- a/core-groovy-modules/pom.xml
+++ b/core-groovy-modules/pom.xml
@@ -17,9 +17,7 @@
core-groovy
core-groovy-2
core-groovy-collections
- core-groovy-strings
+ core-groovy-strings
-
-
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-14/README.md b/core-java-modules/core-java-14/README.md
index 07cdf9859c..00fd2fa320 100644
--- a/core-java-modules/core-java-14/README.md
+++ b/core-java-modules/core-java-14/README.md
@@ -11,3 +11,4 @@ This module contains articles about Java 14.
- [Foreign Memory Access API in Java 14](https://www.baeldung.com/java-foreign-memory-access)
- [Java 14 Record Keyword](https://www.baeldung.com/java-record-keyword)
- [New Features in Java 14](https://www.baeldung.com/java-14-new-features)
+- [Java 14 Record vs. Lombok](https://www.baeldung.com/java-record-vs-lombok)
diff --git a/core-java-modules/core-java-14/pom.xml b/core-java-modules/core-java-14/pom.xml
index 35ea0bd2d0..f78edd622a 100644
--- a/core-java-modules/core-java-14/pom.xml
+++ b/core-java-modules/core-java-14/pom.xml
@@ -14,6 +14,15 @@
1.0.0-SNAPSHOT
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+ provided
+
+
+
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorData.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorData.java
new file mode 100644
index 0000000000..6d50c63ba5
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorData.java
@@ -0,0 +1,18 @@
+package com.baeldung.java14.recordvslombok;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ColorData {
+
+ private int red;
+ private int green;
+ private int blue;
+
+ public String getHexString() {
+ return String.format("#%02X%02X%02X", red, green, blue);
+ }
+
+}
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorRecord.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorRecord.java
new file mode 100644
index 0000000000..03d1f5c264
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorRecord.java
@@ -0,0 +1,8 @@
+package com.baeldung.java14.recordvslombok;
+
+public record ColorRecord(int red, int green, int blue) {
+
+ public String getHexString() {
+ return String.format("#%02X%02X%02X", red, green, blue);
+ }
+}
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorValueObject.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorValueObject.java
new file mode 100644
index 0000000000..eca33662c2
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/ColorValueObject.java
@@ -0,0 +1,17 @@
+package com.baeldung.java14.recordvslombok;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Value;
+
+@Value
+@Getter(AccessLevel.NONE)
+public class ColorValueObject {
+ int red;
+ int green;
+ int blue;
+
+ public String getHexString() {
+ return String.format("#%02X%02X%02X", red, green, blue);
+ }
+}
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/MonochromeColor.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/MonochromeColor.java
new file mode 100644
index 0000000000..6672cb49ea
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/MonochromeColor.java
@@ -0,0 +1,12 @@
+package com.baeldung.java14.recordvslombok;
+
+import lombok.Value;
+
+@Value
+public class MonochromeColor extends ColorData {
+
+ public MonochromeColor(int grayScale) {
+ super(grayScale, grayScale, grayScale);
+ }
+
+}
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/StudentBuilder.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/StudentBuilder.java
new file mode 100644
index 0000000000..318634788e
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/StudentBuilder.java
@@ -0,0 +1,17 @@
+package com.baeldung.java14.recordvslombok;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+public class StudentBuilder {
+ private String firstName;
+ private String lastName;
+ private Long studentId;
+ private String email;
+ private String phoneNumber;
+ private String address;
+ private String country;
+ private int age;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/StudentRecord.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/StudentRecord.java
new file mode 100644
index 0000000000..2d51fadd12
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvslombok/StudentRecord.java
@@ -0,0 +1,4 @@
+package com.baeldung.java14.recordvslombok;
+
+public record StudentRecord(String firstName, String lastName, Long studentId, String email, String phoneNumber, String address, String country, int age) {
+}
diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvslombok/RecordVsLombokUntTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvslombok/RecordVsLombokUntTest.java
new file mode 100644
index 0000000000..1cca13133f
--- /dev/null
+++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvslombok/RecordVsLombokUntTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.java14.recordvslombok;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class RecordVsLombokUntTest {
+
+ @Test
+ public void givenAColorRecord_hexStringIsCorrect() {
+ var red = new ColorRecord(255, 0, 0);
+
+ assertThat(red.getHexString()).isEqualTo("#FF0000");
+ }
+
+ @Test
+ public void givenAColorValueObject_hexStringIsCorrect() {
+ var red = new ColorValueObject(255, 0, 0);
+
+ assertThat(red.getHexString()).isEqualTo("#FF0000");
+ }
+
+ @Test
+ public void givenRecordWithManyAttributes_firstNameShouldBeJohn() {
+ StudentRecord john = new StudentRecord("John", "Doe", null, "john@doe.com", null, null, "England", 20);
+
+ assertThat(john.firstName()).isEqualTo("John");
+ }
+
+ @Test
+ public void givenBuilderWithManyAttributes_firstNameShouldBeJohn() {
+ StudentBuilder john = StudentBuilder.builder()
+ .firstName("John")
+ .lastName("Doe")
+ .email("john@doe.com")
+ .country("England")
+ .age(20)
+ .build();
+
+ assertThat(john.getFirstName()).isEqualTo("John");
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-15/README.md b/core-java-modules/core-java-15/README.md
index 4b163fcfb5..6c4fcff419 100644
--- a/core-java-modules/core-java-15/README.md
+++ b/core-java-modules/core-java-15/README.md
@@ -5,4 +5,3 @@ This module contains articles about Java 15.
### Relevant articles
- [Hidden Classes in Java 15](https://www.baeldung.com/java-hidden-classes)
-- [Sealed Classes and Interfaces in Java 15](https://www.baeldung.com/java-sealed-classes-interfaces)
diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPost.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPost.java
index 960a75a58e..314fbeeeb5 100644
--- a/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPost.java
+++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPost.java
@@ -4,15 +4,15 @@ import java.util.IntSummaryStatistics;
public class BlogPost {
-
+
private String title;
private String author;
private BlogPostType type;
private int likes;
record AuthPostTypesLikes(String author, BlogPostType type, int likes) {};
- record PostcountTitlesLikesStats(long postCount, String titles, IntSummaryStatistics likesStats){};
+ record PostCountTitlesLikesStats(long postCount, String titles, IntSummaryStatistics likesStats){};
record TitlesBoundedSumOfLikes(String titles, int boundedSumOfLikes) {};
-
+
public BlogPost(String title, String author, BlogPostType type, int likes) {
this.title = title;
this.author = author;
diff --git a/core-java-modules/core-java-16/src/test/java/com/baeldung/java_16_features/groupingby/JavaGroupingByCollectorUnitTest.java b/core-java-modules/core-java-16/src/test/java/com/baeldung/java_16_features/groupingby/JavaGroupingByCollectorUnitTest.java
index 0dea142658..603bebb7c5 100644
--- a/core-java-modules/core-java-16/src/test/java/com/baeldung/java_16_features/groupingby/JavaGroupingByCollectorUnitTest.java
+++ b/core-java-modules/core-java-16/src/test/java/com/baeldung/java_16_features/groupingby/JavaGroupingByCollectorUnitTest.java
@@ -257,7 +257,7 @@ public class JavaGroupingByCollectorUnitTest {
@Test
public void givenListOfPosts_whenGroupedByAuthor_thenGetAMapUsingCollectingAndThen() {
- Map postsPerAuthor = posts.stream()
+ Map postsPerAuthor = posts.stream()
.collect(groupingBy(BlogPost::getAuthor, collectingAndThen(toList(), list -> {
long count = list.stream()
.map(BlogPost::getTitle)
@@ -267,10 +267,10 @@ public class JavaGroupingByCollectorUnitTest {
.collect(joining(" : "));
IntSummaryStatistics summary = list.stream()
.collect(summarizingInt(BlogPost::getLikes));
- return new BlogPost.PostcountTitlesLikesStats(count, titles, summary);
+ return new BlogPost.PostCountTitlesLikesStats(count, titles, summary);
})));
- BlogPost.PostcountTitlesLikesStats result = postsPerAuthor.get("Author 1");
+ BlogPost.PostCountTitlesLikesStats result = postsPerAuthor.get("Author 1");
assertThat(result.postCount()).isEqualTo(3L);
assertThat(result.titles()).isEqualTo("News item 1 : Programming guide : Tech review 2");
assertThat(result.likesStats().getMax()).isEqualTo(20);
@@ -294,7 +294,7 @@ public class JavaGroupingByCollectorUnitTest {
.toUpperCase(),
u1.boundedSumOfLikes() + likes);
}));
-
+
BlogPost.TitlesBoundedSumOfLikes result = postsPerAuthor.get("Author 1");
assertThat(result.titles()).isEqualTo("NEWS ITEM 1 : PROGRAMMING GUIDE : TECH REVIEW 2");
assertThat(result.boundedSumOfLikes()).isEqualTo(47);
diff --git a/core-java-modules/core-java-17/README.md b/core-java-modules/core-java-17/README.md
index 1f061bd7c1..d77a487932 100644
--- a/core-java-modules/core-java-17/README.md
+++ b/core-java-modules/core-java-17/README.md
@@ -5,3 +5,4 @@
- [Introduction to HexFormat in Java 17](https://www.baeldung.com/java-hexformat)
- [New Features in Java 17](https://www.baeldung.com/java-17-new-features)
- [Random Number Generators in Java 17](https://www.baeldung.com/java-17-random-number-generators)
+- [Sealed Classes and Interfaces in Java 17](https://www.baeldung.com/java-sealed-classes-interfaces)
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/alternative/Vehicles.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/alternative/Vehicles.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/alternative/Vehicles.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/alternative/Vehicles.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Car.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Car.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Car.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Car.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Service.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Service.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Service.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Service.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Truck.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Truck.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Truck.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Truck.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Vehicle.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/classes/Vehicle.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/classes/Vehicle.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/records/Car.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/records/Car.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/records/Car.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/records/Car.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/records/Truck.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/records/Truck.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/records/Truck.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/records/Truck.java
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/records/Vehicle.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/records/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-15/src/main/java/com/baeldung/sealed/records/Vehicle.java
rename to core-java-modules/core-java-17/src/main/java/com/baeldung/sealed/records/Vehicle.java
diff --git a/core-java-modules/core-java-15/src/test/java/com/baeldung/sealed/classes/VehicleUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/sealed/classes/VehicleUnitTest.java
similarity index 93%
rename from core-java-modules/core-java-15/src/test/java/com/baeldung/sealed/classes/VehicleUnitTest.java
rename to core-java-modules/core-java-17/src/test/java/com/baeldung/sealed/classes/VehicleUnitTest.java
index b614981a43..73d8aad810 100644
--- a/core-java-modules/core-java-15/src/test/java/com/baeldung/sealed/classes/VehicleUnitTest.java
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/sealed/classes/VehicleUnitTest.java
@@ -21,7 +21,7 @@ public class VehicleUnitTest {
public void givenCar_whenUsingReflectionAPI_thenSuperClassIsSealed() {
Assertions.assertThat(car.getClass().isSealed()).isEqualTo(false);
Assertions.assertThat(car.getClass().getSuperclass().isSealed()).isEqualTo(true);
- Assertions.assertThat(car.getClass().getSuperclass().permittedSubclasses())
+ Assertions.assertThat(car.getClass().getSuperclass().getPermittedSubclasses())
.contains(ClassDesc.of(car.getClass().getCanonicalName()));
}
@@ -29,7 +29,7 @@ public class VehicleUnitTest {
public void givenTruck_whenUsingReflectionAPI_thenSuperClassIsSealed() {
Assertions.assertThat(truck.getClass().isSealed()).isEqualTo(false);
Assertions.assertThat(truck.getClass().getSuperclass().isSealed()).isEqualTo(true);
- Assertions.assertThat(truck.getClass().getSuperclass().permittedSubclasses())
+ Assertions.assertThat(truck.getClass().getSuperclass().getPermittedSubclasses())
.contains(ClassDesc.of(truck.getClass().getCanonicalName()));
}
diff --git a/core-java-modules/core-java-15/src/test/java/com/baeldung/sealed/records/VehicleUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/sealed/records/VehicleUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-15/src/test/java/com/baeldung/sealed/records/VehicleUnitTest.java
rename to core-java-modules/core-java-17/src/test/java/com/baeldung/sealed/records/VehicleUnitTest.java
diff --git a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/inputstream/outputstream/InputStreamToOutputStreamUnitTest.java b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/inputstream/outputstream/InputStreamToOutputStreamUnitTest.java
index 814824e580..69c2e7d69d 100644
--- a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/inputstream/outputstream/InputStreamToOutputStreamUnitTest.java
+++ b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/inputstream/outputstream/InputStreamToOutputStreamUnitTest.java
@@ -20,7 +20,7 @@ public class InputStreamToOutputStreamUnitTest {
void copy(InputStream source, OutputStream target) throws IOException {
byte[] buf = new byte[8192];
int length;
- while ((length = source.read(buf)) > 0) {
+ while ((length = source.read(buf)) != -1) {
target.write(buf, 0, length);
}
}
diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml
index 8060e4f606..aaf63a2b2a 100644
--- a/core-java-modules/core-java-collections-4/pom.xml
+++ b/core-java-modules/core-java-collections-4/pom.xml
@@ -25,4 +25,5 @@
2.2
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-4/pom.xml b/core-java-modules/core-java-collections-list-4/pom.xml
index b546c5af2a..ef815b790d 100644
--- a/core-java-modules/core-java-collections-list-4/pom.xml
+++ b/core-java-modules/core-java-collections-list-4/pom.xml
@@ -45,18 +45,19 @@
jmh-generator-annprocess
${jmh-generator.version}
-
- org.apache.commons
- commons-lang3
- ${apache-commons.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
+
+ org.apache.commons
+ commons-lang3
+ ${apache-commons.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
3.0.2
8.1.0
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountManualTest.java
similarity index 99%
rename from core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountManualTest.java
index 3e188d682e..013352cce9 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountManualTest.java
@@ -12,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
-public class AccountUnitTest {
+public class AccountManualTest {
private Account account;
diff --git a/core-java-modules/core-java-function/README.md b/core-java-modules/core-java-function/README.md
index 677f148bdb..7fe6044835 100644
--- a/core-java-modules/core-java-function/README.md
+++ b/core-java-modules/core-java-function/README.md
@@ -3,4 +3,5 @@
## Core Java 8 Cookbooks and Examples
### Relevant Articles:
-- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
\ No newline at end of file
+- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
+- [Use Cases for Static Methods in Java](https://www.baeldung.com/java-static-methods-use-cases)
diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml
index a3add5a686..c05f9585b2 100644
--- a/core-java-modules/core-java-function/pom.xml
+++ b/core-java-modules/core-java-function/pom.xml
@@ -14,6 +14,26 @@
0.0.1-SNAPSHOT
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.mockito
+ mockito-inline
+ ${mockito-inline.version}
+ test
+
+
+
core-java-function
@@ -24,4 +44,10 @@
+
+ 3.8.0
+ 3.22.0
+ 3.12.0
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-function/src/main/java/com/baeldung/staticmethods/CustomStringUtils.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/staticmethods/CustomStringUtils.java
new file mode 100644
index 0000000000..5561123e54
--- /dev/null
+++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/staticmethods/CustomStringUtils.java
@@ -0,0 +1,9 @@
+package com.baeldung.staticmethods;
+
+public final class CustomStringUtils {
+
+ private CustomStringUtils() {}
+
+ public static boolean isEmpty(CharSequence cs) { return cs == null || cs.length() == 0; }
+
+}
diff --git a/core-java-modules/core-java-function/src/main/java/com/baeldung/staticmethods/StaticCounter.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/staticmethods/StaticCounter.java
new file mode 100644
index 0000000000..9abf97e8df
--- /dev/null
+++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/staticmethods/StaticCounter.java
@@ -0,0 +1,15 @@
+package com.baeldung.staticmethods;
+
+public class StaticCounter {
+
+ private static int counter = 0;
+
+ public static int incrementCounter() {
+ return ++counter;
+ }
+
+ public static int getCounterValue() {
+ return counter;
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/CollectionUtilsUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/CollectionUtilsUnitTest.java
new file mode 100644
index 0000000000..74aac8deb7
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/CollectionUtilsUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.staticmethods;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class CollectionUtilsUnitTest {
+
+ @Test
+ void givenListOfNumbers_whenReverseStaticMethodIsCalled_thenNumbersInReversedOrderAreReturned() {
+ List list = Arrays.asList("1", "2", "3");
+ Collections.reverse(list);
+ assertThat(list).containsExactly("3", "2", "1");
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/CustomStringUtilsUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/CustomStringUtilsUnitTest.java
new file mode 100644
index 0000000000..d01b97d938
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/CustomStringUtilsUnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.staticmethods;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class CustomStringUtilsUnitTest {
+
+ @Test
+ void givenNonEmptyString_whenIsEmptyMethodIsCalled_thenFalseIsReturned() {
+ boolean empty = CustomStringUtils.isEmpty("baeldung");
+ assertThat(empty).isFalse();
+ }
+
+ @Test
+ void givenEmptyString_whenIsEmptyMethodIsCalled_thenTrueIsReturned() {
+ boolean empty = CustomStringUtils.isEmpty("");
+ assertThat(empty).isTrue();
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/StaticCounterUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/StaticCounterUnitTest.java
new file mode 100644
index 0000000000..f8605883ba
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/StaticCounterUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.staticmethods;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StaticCounterUnitTest {
+
+ @Test
+ void givenStaticCounter_whenIncrementCounterIsCalled_thenValueIsIncresedByOne() {
+ int oldValue = StaticCounter.getCounterValue();
+ int newValue = StaticCounter.incrementCounter();
+ assertThat(newValue).isEqualTo(oldValue + 1);
+ }
+
+}
diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/StringUtilsUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/StringUtilsUnitTest.java
new file mode 100644
index 0000000000..d7a379a246
--- /dev/null
+++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/staticmethods/StringUtilsUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.staticmethods;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StringUtilsUnitTest {
+
+ @Test
+ void givenSimpleString_whenCapitalizeStaticMethodIsCalled_thenCapitalizedStringIsReturned() {
+ String str = StringUtils.capitalize("baeldung");
+ assertThat(str).isEqualTo("Baeldung");
+ }
+
+}
diff --git a/core-java-modules/core-java-io-conversions-2/README.md b/core-java-modules/core-java-io-conversions-2/README.md
index 9abb539066..c83a3fb1d7 100644
--- a/core-java-modules/core-java-io-conversions-2/README.md
+++ b/core-java-modules/core-java-io-conversions-2/README.md
@@ -9,4 +9,5 @@ This module contains articles about core Java input/output(IO) conversions.
- [Converting a BufferedReader to a JSONObject](https://www.baeldung.com/java-bufferedreader-to-jsonobject)
- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
- [How to Write to a CSV File in Java](https://www.baeldung.com/java-csv)
+- [How to Convert InputStream to Base64 String](https://www.baeldung.com/java-inputstream-to-base64-string)
- More articles: [[<-- prev]](/core-java-modules/core-java-io-conversions)
diff --git a/core-java-modules/core-java-jar/README.md b/core-java-modules/core-java-jar/README.md
index b1e24e3ab9..c99ea63b22 100644
--- a/core-java-modules/core-java-jar/README.md
+++ b/core-java-modules/core-java-jar/README.md
@@ -10,3 +10,5 @@ This module contains articles about JAR files
- [Get Names of Classes Inside a JAR File](https://www.baeldung.com/jar-file-get-class-names)
- [Find All Jars Containing Given Class](https://baeldung.com/find-all-jars-containing-given-class/)
- [Creating JAR Files Programmatically](https://www.baeldung.com/jar-create-programatically)
+- [Guide to Creating Jar Executables and Windows Executables from Java](https://www.baeldung.com/jar-windows-executables)
+- [Get the Full Path of a JAR File From a Class](https://www.baeldung.com/java-full-path-of-jar-from-class)
diff --git a/core-java-modules/core-java-jar/pom.xml b/core-java-modules/core-java-jar/pom.xml
index 19da9b8a56..c56fcbd8b5 100644
--- a/core-java-modules/core-java-jar/pom.xml
+++ b/core-java-modules/core-java-jar/pom.xml
@@ -54,6 +54,12 @@
moneta
${javamoney.moneta.version}
+
+ org.mockito
+ mockito-junit-jupiter
+ ${mockito.version}
+ test
+
@@ -266,6 +272,7 @@
0.4
1.8.7
+ 4.6.1
1.1
3.0.0-M1
@@ -279,4 +286,4 @@
1.8
-
\ No newline at end of file
+
diff --git a/core-java-modules/core-java-jar/src/main/java/com/baeldung/jar/MySampleGUIAppn.java b/core-java-modules/core-java-jar/src/main/java/com/baeldung/jar/MySampleGUIAppn.java
new file mode 100644
index 0000000000..86d52eed56
--- /dev/null
+++ b/core-java-modules/core-java-jar/src/main/java/com/baeldung/jar/MySampleGUIAppn.java
@@ -0,0 +1,31 @@
+package com.baeldung.jar;
+
+import java.awt.event.*;
+import java.awt.*;
+
+import javax.swing.*;
+
+public class MySampleGUIAppn extends JFrame {
+ public MySampleGUIAppn() {
+ if (!GraphicsEnvironment.isHeadless()) {
+ setSize(300,300);
+ setTitle("MySampleGUIAppn");
+ Button b = new Button("Click Me!");
+ b.setBounds(30,100,80,30);
+ add(b);
+ setVisible(true);
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ dispose();
+ System.exit(0);
+ }
+ });
+ }
+ else {
+ System.exit(0);
+ }
+ }
+ public static void main(String[] args) {
+ MySampleGUIAppn app=new MySampleGUIAppn();
+ }
+}
diff --git a/core-java-modules/core-java-jar/src/main/java/com/baeldung/jarfile/JarFilePathResolver.java b/core-java-modules/core-java-jar/src/main/java/com/baeldung/jarfile/JarFilePathResolver.java
new file mode 100644
index 0000000000..3dab91f31a
--- /dev/null
+++ b/core-java-modules/core-java-jar/src/main/java/com/baeldung/jarfile/JarFilePathResolver.java
@@ -0,0 +1,42 @@
+package com.baeldung.jarfile;
+
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Paths;
+
+public class JarFilePathResolver {
+
+ public String getJarFilePath(Class clazz) {
+ try {
+ return byGetProtectionDomain(clazz);
+ } catch (Exception e) {
+ // cannot get jar file path using byGetProtectionDomain
+ // Exception handling omitted
+ }
+ return byGetResource(clazz);
+ }
+
+ String byGetProtectionDomain(Class clazz) throws URISyntaxException {
+ URL url = clazz.getProtectionDomain().getCodeSource().getLocation();
+ return Paths.get(url.toURI()).toString();
+ }
+
+ String byGetResource(Class clazz) {
+ final URL classResource = clazz.getResource(clazz.getSimpleName() + ".class");
+ if (classResource == null) {
+ throw new RuntimeException("class resource is null");
+ }
+
+ final String url = classResource.toString();
+ if (url.startsWith("jar:file:")) {
+ // extract 'file:......jarName.jar' part from the url string
+ String path = url.replaceAll("^jar:(file:.*[.]jar)!/.*", "$1");
+ try {
+ return Paths.get(new URL(path).toURI()).toString();
+ } catch (Exception e) {
+ throw new RuntimeException("Invalid Jar File URL String");
+ }
+ }
+ throw new RuntimeException("Invalid Jar File URL String");
+ }
+}
diff --git a/core-java-modules/core-java-jar/src/test/java/com/baeldung/jar/MySampleGUIAppnUnitTest.java b/core-java-modules/core-java-jar/src/test/java/com/baeldung/jar/MySampleGUIAppnUnitTest.java
new file mode 100644
index 0000000000..106531008c
--- /dev/null
+++ b/core-java-modules/core-java-jar/src/test/java/com/baeldung/jar/MySampleGUIAppnUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.jar;
+
+import java.io.IOException;
+
+import org.junit.jupiter.api.Test;
+
+class MySampleGUIAppnUnitTest {
+ @Test
+ void testMain() throws IOException {
+ System.setProperty("java.awt.headless", "true");
+ String [] args = null;
+ System.exit(0);
+ MySampleGUIAppn.main(args);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-jar/src/test/java/com/baeldung/jarfile/JarFilePathResolverUnitTest.java b/core-java-modules/core-java-jar/src/test/java/com/baeldung/jarfile/JarFilePathResolverUnitTest.java
new file mode 100644
index 0000000000..ad84bd9379
--- /dev/null
+++ b/core-java-modules/core-java-jar/src/test/java/com/baeldung/jarfile/JarFilePathResolverUnitTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.jarfile;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Ascii;
+import java.io.File;
+import java.net.URISyntaxException;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Spy;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+class JarFilePathResolverUnitTest {
+ @Spy
+ JarFilePathResolver jarFilePathResolver;
+
+ @Test
+ void givenClassObjectWhenCallingByGetProtectionDomainShouldGetExpectedPath() throws Exception {
+ String jarPath = jarFilePathResolver.byGetProtectionDomain(Ascii.class);
+ assertThat(jarPath).endsWith(".jar").contains("guava");
+ assertThat(new File(jarPath)).exists();
+ }
+
+ @Test
+ void givenClassObjectWhenCallingByGetResourceShouldGetExpectedPath() {
+ String jarPath = jarFilePathResolver.byGetResource(Ascii.class);
+ assertThat(jarPath).endsWith(".jar").contains("guava");
+ assertThat(new File(jarPath)).exists();
+ }
+
+ @Test
+ void givenClassObjectWhenNoSecurityExceptionRaisedShouldGetExpectedPath() throws URISyntaxException {
+ String jarPath = jarFilePathResolver.getJarFilePath(Ascii.class);
+ assertThat(jarPath).endsWith(".jar").contains("guava");
+ assertThat(new File(jarPath)).exists();
+ verify(jarFilePathResolver, times(1)).byGetProtectionDomain(Ascii.class);
+ verify(jarFilePathResolver, never()).byGetResource(Ascii.class);
+ }
+
+ @Test
+ void givenClassObjectWhenSecurityExceptionRaisedShouldGetExpectedPath() throws URISyntaxException {
+ when(jarFilePathResolver.byGetProtectionDomain(Ascii.class)).thenThrow(new SecurityException("not allowed"));
+ String jarPath = jarFilePathResolver.getJarFilePath(Ascii.class);
+ assertThat(jarPath).endsWith(".jar").contains("guava");
+ assertThat(new File(jarPath)).exists();
+ verify(jarFilePathResolver, times(1)).byGetProtectionDomain(Ascii.class);
+ verify(jarFilePathResolver, times(1)).byGetResource(Ascii.class);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md
index 8920e9c231..9505d02fc2 100644
--- a/core-java-modules/core-java-lang-5/README.md
+++ b/core-java-modules/core-java-lang-5/README.md
@@ -5,3 +5,4 @@ This module contains articles about core features in the Java language
### Relevant Articles:
- [Difference Between == and equals() in Java](https://www.baeldung.com/java-equals-method-operator-difference)
+- [Advantages and Disadvantages of Using Java Wildcard Imports](https://www.baeldung.com/java-wildcard-imports)
diff --git a/core-java-modules/core-java-lang-5/pom.xml b/core-java-modules/core-java-lang-5/pom.xml
index 6d3771bd31..5255866f03 100644
--- a/core-java-modules/core-java-lang-5/pom.xml
+++ b/core-java-modules/core-java-lang-5/pom.xml
@@ -13,7 +13,6 @@
core-java-modules
0.0.1-SNAPSHOT
-
core-java-lang-5
@@ -23,5 +22,4 @@
-
-
\ No newline at end of file
+
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/specific/Book.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/specific/Book.java
new file mode 100644
index 0000000000..5877147082
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/specific/Book.java
@@ -0,0 +1,17 @@
+package com.baeldung.imports.specific;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+public class Book {
+
+ private UUID id;
+
+ private String name;
+
+ private Date datePublished;
+
+ private List authors;
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/Book.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/Book.java
new file mode 100644
index 0000000000..18754cdd28
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/Book.java
@@ -0,0 +1,15 @@
+package com.baeldung.imports.wildcard;
+
+import java.util.*;
+
+public class Book {
+
+ private UUID id;
+
+ private String name;
+
+ private Date datePublished;
+
+ private List authors;
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/BookView.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/BookView.java
new file mode 100644
index 0000000000..e6e21ab03d
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/BookView.java
@@ -0,0 +1,17 @@
+package com.baeldung.imports.wildcard;
+
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+
+public class BookView extends Frame {
+
+ private UUID id;
+
+ private String name;
+
+ private Date datePublished;
+
+ private List authors;
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/Library.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/Library.java
new file mode 100644
index 0000000000..8e1d79aca4
--- /dev/null
+++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/imports/wildcard/Library.java
@@ -0,0 +1,19 @@
+package com.baeldung.imports.wildcard;
+
+import java.util.*;
+import java.sql.*;
+import java.sql.Date;
+
+public class Library {
+
+ private UUID id;
+
+ private String name;
+
+ private Time openingTime;
+
+ private Time closingTime;
+
+ private List datesClosed;
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types-2/README.md b/core-java-modules/core-java-lang-oop-types-2/README.md
index c5e2a75f25..474d0c8a22 100644
--- a/core-java-modules/core-java-lang-oop-types-2/README.md
+++ b/core-java-modules/core-java-lang-oop-types-2/README.md
@@ -6,3 +6,4 @@ This module contains articles about types in Java
- [Convert an Array of Primitives to an Array of Objects](https://www.baeldung.com/java-primitive-array-to-object-array)
- [Check if an Enum Value Exists in Java](https://www.baeldung.com/java-search-enum-values)
+- [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value)
diff --git a/core-java-modules/core-java-numbers-4/README.md b/core-java-modules/core-java-numbers-4/README.md
index 697d791b82..f8cc655f55 100644
--- a/core-java-modules/core-java-numbers-4/README.md
+++ b/core-java-modules/core-java-numbers-4/README.md
@@ -7,7 +7,6 @@
- [Automorphic Numbers in Java](https://www.baeldung.com/java-automorphic-numbers)
- [Convert Byte Size Into a Human-Readable Format in Java](https://www.baeldung.com/java-human-readable-byte-size)
- [Convert boolean to int in Java](https://www.baeldung.com/java-boolean-to-int)
-- [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value)
- [Reverse a Number in Java](https://www.baeldung.com/java-reverse-number)
- [Check if BigDecimal Value Is Zero](https://www.baeldung.com/java-bigdecimal-zero)
- More articles: [[<-- prev]](../core-java-numbers-3) [[next -->]](../core-java-numbers-5)
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
index b1a6a1fe57..cb1b5e926a 100644
--- a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
+++ b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
@@ -9,7 +9,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
import static org.junit.Assert.*;
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java
new file mode 100644
index 0000000000..a3d850dd66
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java
@@ -0,0 +1,60 @@
+package com.baeldung.streams.parallel;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.apache.commons.io.FileUtils;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+
+@State(Scope.Benchmark)
+public class FileSearchCost {
+
+ private final static String FILE_NAME = "src/main/resources/Test";
+
+ @Setup(Level.Trial)
+ public void setup() throws IOException {
+ for (int i = 0; i < 1500; i++) {
+ File targetFile = new File(FILE_NAME + i);
+ FileUtils.writeStringToFile(targetFile, "Test", "UTF8");
+ }
+ }
+
+ @TearDown(Level.Trial)
+ public void tearDown() {
+ for (int i = 0; i < 1500; i++) {
+ File fileToDelete = new File(FILE_NAME + i);
+ fileToDelete.delete();
+ }
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void textFileSearchSequential() throws IOException {
+ Files.walk(Paths.get("src/main/resources/")).map(Path::normalize).filter(Files::isRegularFile)
+ .filter(path -> path.getFileName().toString().endsWith(".txt")).collect(Collectors.toList());
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void textFileSearchParallel() throws IOException {
+ Files.walk(Paths.get("src/main/resources/")).parallel().map(Path::normalize).filter(Files::isRegularFile)
+ .filter(path -> path.getFileName().toString().endsWith(".txt")).collect(Collectors.toList());
+ }
+
+}
+
diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md
index 6eeee943aa..86b293566a 100644
--- a/core-java-modules/core-java-streams-4/README.md
+++ b/core-java-modules/core-java-streams-4/README.md
@@ -1,3 +1,4 @@
## Relevant Articles:
- [Count Occurrences Using Java groupingBy Collector](https://www.baeldung.com/java-groupingby-count)
+- [How to Split a Stream into Multiple Streams](https://www.baeldung.com/java-split-stream)
diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml
index 8c4d98979c..beed277f78 100644
--- a/core-java-modules/core-java-streams-4/pom.xml
+++ b/core-java-modules/core-java-streams-4/pom.xml
@@ -43,7 +43,6 @@
3.23.1
test
-
diff --git a/core-java-modules/core-java-string-apis/README.md b/core-java-modules/core-java-string-apis/README.md
index 0dd24d7e9a..68f2176ed6 100644
--- a/core-java-modules/core-java-string-apis/README.md
+++ b/core-java-modules/core-java-string-apis/README.md
@@ -11,3 +11,4 @@ This module contains articles about string APIs.
- [StringBuilder vs StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
- [Getting a Character by Index From a String in Java](https://www.baeldung.com/java-character-at-position)
+- [Clearing a StringBuilder or StringBuffer](https://www.baeldung.com/java-clear-stringbuilder-stringbuffer)
diff --git a/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/clearstringbuilderorstringbuffer/BenchmarkRunner.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/clearstringbuilderorstringbuffer/BenchmarkRunner.java
new file mode 100644
index 0000000000..e0cead9c77
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/clearstringbuilderorstringbuffer/BenchmarkRunner.java
@@ -0,0 +1,32 @@
+package com.baeldung.clearstringbuilderorstringbuffer;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.infra.Blackhole;
+
+public class BenchmarkRunner {
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+ @State(Scope.Benchmark)
+ public static class MyState {
+ final String HELLO = "Hello World";
+ final StringBuilder sb = new StringBuilder().append(HELLO);
+ }
+
+ @Benchmark
+ public void evaluateSetLength(Blackhole blackhole, MyState state) {
+ state.sb.setLength(0);
+ blackhole.consume(state.sb.toString());
+ }
+
+ @Benchmark
+ public void evaluateDelete(Blackhole blackhole, MyState state) {
+ state.sb.delete(0, state.sb.length());
+ blackhole.consume(state.sb.toString());
+ }
+
+}
diff --git a/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/clearstringbuilderorstringbuffer/ClearStringBuilderOrStringBufferUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/clearstringbuilderorstringbuffer/ClearStringBuilderOrStringBufferUnitTest.java
new file mode 100644
index 0000000000..ad46c23969
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/clearstringbuilderorstringbuffer/ClearStringBuilderOrStringBufferUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.clearstringbuilderorstringbuffer;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ClearStringBuilderOrStringBufferUnitTest {
+
+ @Test
+ void whenSetLengthToZero_ThenStringBuilderIsCleared() {
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("Hello World");
+ int initialCapacity = stringBuilder.capacity();
+ stringBuilder.setLength(0);
+ assertEquals("", stringBuilder.toString());
+ assertEquals(initialCapacity, stringBuilder.capacity());
+ }
+
+ @Test
+ void whenDeleteAll_ThenStringBuilderIsCleared() {
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("Hello World");
+ int initialCapacity = stringBuilder.capacity();
+ stringBuilder.delete(0, stringBuilder.length());
+ assertEquals("", stringBuilder.toString());
+ assertEquals(initialCapacity, stringBuilder.capacity());
+ }
+
+ @Test
+ void whenSetLengthToZero_ThenStringBufferIsCleared() {
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append("Hello World");
+ int initialCapacity = stringBuffer.capacity();
+ stringBuffer.setLength(0);
+ assertEquals("", stringBuffer.toString());
+ assertEquals(initialCapacity, stringBuffer.capacity());
+ }
+
+ @Test
+ void whenDeleteAll_ThenStringBufferIsCleared() {
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append("Hello World");
+ int initialCapacity = stringBuffer.capacity();
+ stringBuffer.delete(0, stringBuffer.length());
+ assertEquals("", stringBuffer.toString());
+ assertEquals(initialCapacity, stringBuffer.capacity());
+ }
+
+ // Note: It did not make the cut to the article, but here is another way to reset a StringBuilder
+ @Test
+ void whenAssignedToNewStringBuilder_ThenStringBuilderIsCleared() {
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("Hello World");
+ stringBuilder = new StringBuilder();
+ assertEquals("", stringBuilder.toString());
+ }
+
+ @Test
+ void whenAssignedToNewStringBuffer_ThenStringBufferIsCleared() {
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append("Hello World");
+ stringBuffer = new StringBuffer();
+ assertEquals("", stringBuffer.toString());
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/README.md b/core-java-modules/core-java-string-operations-4/README.md
index ff6d887154..ac52ee4ab5 100644
--- a/core-java-modules/core-java-string-operations-4/README.md
+++ b/core-java-modules/core-java-string-operations-4/README.md
@@ -7,4 +7,4 @@
- [String equals() Vs contentEquals() in Java](https://www.baeldung.com/java-string-equals-vs-contentequals)
- [Check if a String Ends with a Certain Pattern in Java](https://www.baeldung.com/java-string-ends-pattern)
- [Check if a Character is a Vowel in Java](https://www.baeldung.com/java-check-character-vowel)
-
+- [How to Truncate a String in Java](https://www.baeldung.com/java-truncating-strings)
diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/truncate/TruncateString.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/truncate/TruncateString.java
new file mode 100644
index 0000000000..788a180f19
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/truncate/TruncateString.java
@@ -0,0 +1,105 @@
+package com.baeldung.truncate;
+
+import java.util.Optional;
+import java.util.regex.MatchResult;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.base.Splitter;
+
+public class TruncateString {
+
+ private static final String EMPTY = "";
+
+ public static String usingSubstringMethod(String text, int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("length cannot be negative");
+ }
+
+ if (text == null) {
+ return EMPTY;
+ }
+
+ if (text.length() <= length) {
+ return text;
+ } else {
+ return text.substring(0, length);
+ }
+ }
+
+ public static String usingSplitMethod(String text, int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("length cannot be negative");
+ }
+
+ if (text == null) {
+ return EMPTY;
+ }
+
+ String[] results = text.split("(?<=\\G.{" + length + "})");
+
+ return results[0];
+ }
+
+ public static String usingPattern(String text, int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("length cannot be negative");
+ }
+
+ if (text == null) {
+ return EMPTY;
+ }
+
+ Optional result = Pattern.compile(".{1," + length + "}")
+ .matcher(text)
+ .results()
+ .map(MatchResult::group)
+ .findFirst();
+
+ return result.isPresent() ? result.get() : EMPTY;
+
+ }
+
+ public static String usingCodePointsMethod(String text, int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("length cannot be negative");
+ }
+
+ if (text == null) {
+ return EMPTY;
+ }
+
+ return text.codePoints()
+ .limit(length)
+ .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
+ .toString();
+ }
+
+ public static String usingLeftMethod(String text, int length) {
+
+ return StringUtils.left(text, length);
+ }
+
+ public static String usingTruncateMethod(String text, int length) {
+
+ return StringUtils.truncate(text, length);
+ }
+
+ public static String usingSplitter(String text, int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException("length cannot be negative");
+ }
+
+ if (text == null) {
+ return EMPTY;
+ }
+
+ Iterable parts = Splitter.fixedLength(length)
+ .split(text);
+
+ return parts.iterator()
+ .next();
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/truncate/TruncateStringUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/truncate/TruncateStringUnitTest.java
new file mode 100644
index 0000000000..fd44e37546
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/truncate/TruncateStringUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.truncate;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class TruncateStringUnitTest {
+
+ private static final String TEXT = "Welcome to baeldung.com";
+
+ @Test
+ public void givenStringAndLength_whenUsingSubstringMethod_thenTruncate() {
+
+ assertEquals(TruncateString.usingSubstringMethod(TEXT, 10), "Welcome to");
+ }
+
+ @Test
+ public void givenStringAndLength_whenUsingSplitMethod_thenTruncate() {
+
+ assertEquals(TruncateString.usingSplitMethod(TEXT, 13), "Welcome to ba");
+ }
+
+ @Test
+ public void givenStringAndLength_whenUsingPattern_thenTruncate() {
+
+ assertEquals(TruncateString.usingPattern(TEXT, 19), "Welcome to baeldung");
+ }
+
+ @Test
+ public void givenStringAndLength_whenUsingCodePointsMethod_thenTruncate() {
+
+ assertEquals(TruncateString.usingCodePointsMethod(TEXT, 6), "Welcom");
+ }
+
+ @Test
+ public void givenStringAndLength_whenUsingLeftMethod_thenTruncate() {
+
+ assertEquals(TruncateString.usingLeftMethod(TEXT, 15), "Welcome to bael");
+ }
+
+ @Test
+ public void givenStringAndLength_whenUsingTruncateMethod_thenTruncate() {
+
+ assertEquals(TruncateString.usingTruncateMethod(TEXT, 20), "Welcome to baeldung.");
+ }
+
+ @Test
+ public void givenStringAndLength_whenUsingSplitter_thenTruncate() {
+
+ assertEquals(TruncateString.usingSplitter(TEXT, 3), "Wel");
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java b/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java
index 191a3628e8..f7efd7c731 100644
--- a/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java
+++ b/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java
@@ -96,7 +96,23 @@ public class Java8EncodeDecodeUnitTest {
assertNotNull(decodedMime);
}
- //
+ @Test
+ public void whenEncodedStringHasValidCharacters_thenStringCanBeDecoded() {
+ final String encodedString = "dGVzdCMkaW5wdXQ+";
+ final byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
+ final String decodedString = new String(decodedBytes);
+
+ assertNotNull(decodedString);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void whenEncodedStringHasInvalidCharacters_thenIllegalArgumentException() {
+ final String encodedString = "dGVzdCMkaW5wdXQ#";
+ final byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
+ final String decodedString = new String(decodedBytes);
+
+ assertNotNull(decodedString);
+ }
private static StringBuilder getMimeBuffer() {
final StringBuilder buffer = new StringBuilder();
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 6911ace6eb..c650f064ab 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -33,7 +33,7 @@
core-java-collections-4
core-java-collections-array-list
core-java-collections-conversions
- core-java-collections-conversions-2
+ core-java-collections-conversions-2
core-java-collections-list
core-java-collections-list-2
core-java-collections-list-3
@@ -126,7 +126,7 @@
core-java-regex
core-java-regex-2
core-java-uuid
- pre-jpms
+ pre-jpms
@@ -146,4 +146,4 @@
-
+
\ No newline at end of file
diff --git a/docker-modules/docker-compose/Dockerfile b/docker-modules/docker-compose/Dockerfile
new file mode 100644
index 0000000000..8d1bded77e
--- /dev/null
+++ b/docker-modules/docker-compose/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:11
+MAINTAINER baeldung.com
+COPY target/docker-compose-0.0.1-SNAPSHOT.jar app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
diff --git a/docker-modules/docker-compose/depends-on_vs_links/docker-compose-depends-on.yml b/docker-modules/docker-compose/depends-on_vs_links/docker-compose-depends-on.yml
new file mode 100644
index 0000000000..1f9b42384e
--- /dev/null
+++ b/docker-modules/docker-compose/depends-on_vs_links/docker-compose-depends-on.yml
@@ -0,0 +1,14 @@
+services:
+ db:
+ image: postgres:latest
+ environment:
+ - POSTGRES_USER=postgres
+ - POSTGRES_PASSWORD=postgres
+ ports:
+ - 5432:5432
+ web-app:
+ image: web-app:latest
+ ports:
+ - 8080:8080
+ depends_on:
+ - db
\ No newline at end of file
diff --git a/docker-modules/docker-compose/depends-on_vs_links/docker-compose-links.yml b/docker-modules/docker-compose/depends-on_vs_links/docker-compose-links.yml
new file mode 100644
index 0000000000..cf84970b3c
--- /dev/null
+++ b/docker-modules/docker-compose/depends-on_vs_links/docker-compose-links.yml
@@ -0,0 +1,14 @@
+services:
+ db:
+ image: postgres:latest
+ environment:
+ - POSTGRES_USER=postgres
+ - POSTGRES_PASSWORD=postgres
+ ports:
+ - 5432:5432
+ web-app:
+ image: web-app:latest
+ ports:
+ - 8080:8080
+ links:
+ - db
\ No newline at end of file
diff --git a/docker-modules/docker-compose/depends-on_vs_links/docker-compose-network.yml b/docker-modules/docker-compose/depends-on_vs_links/docker-compose-network.yml
new file mode 100644
index 0000000000..6b6796b43d
--- /dev/null
+++ b/docker-modules/docker-compose/depends-on_vs_links/docker-compose-network.yml
@@ -0,0 +1,36 @@
+services:
+ db:
+ image: postgres:latest
+ restart: always
+ environment:
+ - POSTGRES_USER=postgres
+ - POSTGRES_PASSWORD=postgres
+ ports:
+ - 5432:5432
+ volumes:
+ - db:/var/lib/postgresql/data
+ networks:
+ - mynet
+
+ web-app:
+ image: web-app:latest
+ depends_on:
+ - db
+ networks:
+ - mynet
+ ports:
+ - 8080:8080
+ environment:
+ DB_HOST: db
+ DB_PORT: 5432
+ DB_USER: postgres
+ DB_PASSWORD: postgres
+ DB_NAME: postgres
+
+networks:
+ mynet:
+ driver: bridge
+
+volumes:
+ db:
+ driver: local
diff --git a/docker-modules/docker-compose/pom.xml b/docker-modules/docker-compose/pom.xml
index 29981f2ccc..39bad18d02 100644
--- a/docker-modules/docker-compose/pom.xml
+++ b/docker-modules/docker-compose/pom.xml
@@ -6,7 +6,7 @@
docker-compose
Demo project for Spring Boot and Docker
-
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
@@ -22,7 +22,6 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
@@ -35,6 +34,16 @@
org.springframework.boot
spring-boot-maven-plugin
+
+ com.baeldung.docker.app.DockAppApplication
+
+
+
+
+ repackage
+
+
+
diff --git a/docker-modules/docker-environment-variables/Dockerfile b/docker-modules/docker-environment-variables/Dockerfile
new file mode 100644
index 0000000000..dcf69ec2cd
--- /dev/null
+++ b/docker-modules/docker-environment-variables/Dockerfile
@@ -0,0 +1,10 @@
+FROM alpine:latest
+
+ARG name
+ENV env_name $name
+
+COPY greetings.sh .
+
+RUN chmod +x /greetings.sh
+
+CMD ["/greetings.sh"]
\ No newline at end of file
diff --git a/docker-modules/docker-environment-variables/README.md b/docker-modules/docker-environment-variables/README.md
new file mode 100644
index 0000000000..12da2931a3
--- /dev/null
+++ b/docker-modules/docker-environment-variables/README.md
@@ -0,0 +1,3 @@
+
+## Relevant Articles:
+- [How to Pass Environment Variable Value into Dockerfile](https://www.baeldung.com/ops/dockerfile-env-variable)
diff --git a/docker-modules/docker-environment-variables/greetings.sh b/docker-modules/docker-environment-variables/greetings.sh
new file mode 100644
index 0000000000..6b9cd61105
--- /dev/null
+++ b/docker-modules/docker-environment-variables/greetings.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+echo Hello $env_name
\ No newline at end of file
diff --git a/docker-modules/docker-images/pom.xml b/docker-modules/docker-images/pom.xml
index 5f6510cf8d..4d0b20eea0 100644
--- a/docker-modules/docker-images/pom.xml
+++ b/docker-modules/docker-images/pom.xml
@@ -22,7 +22,6 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
diff --git a/docker-modules/docker-java-jar/Dockerfile b/docker-modules/docker-java-jar/Dockerfile
new file mode 100644
index 0000000000..bc26e031c3
--- /dev/null
+++ b/docker-modules/docker-java-jar/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:11
+MAINTAINER baeldung.com
+COPY target/docker-java-jar-0.0.1-SNAPSHOT.jar app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
diff --git a/docker-modules/docker-java-jar/pom.xml b/docker-modules/docker-java-jar/pom.xml
new file mode 100644
index 0000000000..0ca0146ac0
--- /dev/null
+++ b/docker-modules/docker-java-jar/pom.xml
@@ -0,0 +1,37 @@
+
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+ 4.0.0
+
+ docker-java-jar
+
+
+ 11
+ 11
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ com.baeldung.HelloWorld
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docker-modules/docker-java-jar/src/main/java/com/baeldung/HelloWorld.java b/docker-modules/docker-java-jar/src/main/java/com/baeldung/HelloWorld.java
new file mode 100644
index 0000000000..50e0044c48
--- /dev/null
+++ b/docker-modules/docker-java-jar/src/main/java/com/baeldung/HelloWorld.java
@@ -0,0 +1,8 @@
+package com.baeldung;
+
+public class HelloWorld {
+
+ public static void main(String[] args){
+ System.out.println("Welcome to our application");
+ }
+}
diff --git a/docker-modules/docker-spring-boot/pom.xml b/docker-modules/docker-spring-boot/pom.xml
index 9732ed294d..e633583ebf 100644
--- a/docker-modules/docker-spring-boot/pom.xml
+++ b/docker-modules/docker-spring-boot/pom.xml
@@ -7,7 +7,7 @@
docker-spring-boot
Demo project showing Spring Boot and Docker
-
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
diff --git a/docker-modules/pom.xml b/docker-modules/pom.xml
index f2b8f059a1..d80e5341b0 100644
--- a/docker-modules/pom.xml
+++ b/docker-modules/pom.xml
@@ -23,6 +23,7 @@
docker-images
docker-spring-boot
docker-spring-boot-postgres
+ docker-java-jar
diff --git a/feign/pom.xml b/feign/pom.xml
index 8fa864fa46..369fa00137 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -14,12 +14,6 @@
../parent-boot-2
-
- 1.8
- 11.8
- 1.6.3
-
-
io.github.openfeign
@@ -121,4 +115,10 @@
+
+ 1.8
+ 11.8
+ 1.6.3
+
+
\ No newline at end of file
diff --git a/gradle-modules/README.md b/gradle-modules/README.md
new file mode 100644
index 0000000000..a4d8875b15
--- /dev/null
+++ b/gradle-modules/README.md
@@ -0,0 +1,3 @@
+## Gradle Modules
+
+This module contains submodules of Gradle.
\ No newline at end of file
diff --git a/gradle-5/.gitignore b/gradle-modules/gradle-5/.gitignore
similarity index 100%
rename from gradle-5/.gitignore
rename to gradle-modules/gradle-5/.gitignore
diff --git a/gradle-5/README.md b/gradle-modules/gradle-5/README.md
similarity index 100%
rename from gradle-5/README.md
rename to gradle-modules/gradle-5/README.md
diff --git a/gradle-5/build.gradle b/gradle-modules/gradle-5/build.gradle
similarity index 100%
rename from gradle-5/build.gradle
rename to gradle-modules/gradle-5/build.gradle
diff --git a/gradle-5/cmd-line-args/README.md b/gradle-modules/gradle-5/cmd-line-args/README.md
similarity index 100%
rename from gradle-5/cmd-line-args/README.md
rename to gradle-modules/gradle-5/cmd-line-args/README.md
diff --git a/gradle-5/cmd-line-args/build.gradle b/gradle-modules/gradle-5/cmd-line-args/build.gradle
similarity index 100%
rename from gradle-5/cmd-line-args/build.gradle
rename to gradle-modules/gradle-5/cmd-line-args/build.gradle
diff --git a/gradle-5/cmd-line-args/src/main/java/com/baeldung/cmd/MainClass.java b/gradle-modules/gradle-5/cmd-line-args/src/main/java/com/baeldung/cmd/MainClass.java
similarity index 100%
rename from gradle-5/cmd-line-args/src/main/java/com/baeldung/cmd/MainClass.java
rename to gradle-modules/gradle-5/cmd-line-args/src/main/java/com/baeldung/cmd/MainClass.java
diff --git a/gradle-5/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-5/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle-5/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle-5/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle-5/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-5/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle-5/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle-5/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle-5/gradlew b/gradle-modules/gradle-5/gradlew
similarity index 100%
rename from gradle-5/gradlew
rename to gradle-modules/gradle-5/gradlew
diff --git a/gradle-5/gradlew.bat b/gradle-modules/gradle-5/gradlew.bat
similarity index 100%
rename from gradle-5/gradlew.bat
rename to gradle-modules/gradle-5/gradlew.bat
diff --git a/gradle-5/java-exec/.gitignore b/gradle-modules/gradle-5/java-exec/.gitignore
similarity index 100%
rename from gradle-5/java-exec/.gitignore
rename to gradle-modules/gradle-5/java-exec/.gitignore
diff --git a/gradle-5/java-exec/build.gradle b/gradle-modules/gradle-5/java-exec/build.gradle
similarity index 100%
rename from gradle-5/java-exec/build.gradle
rename to gradle-modules/gradle-5/java-exec/build.gradle
diff --git a/gradle-5/java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java b/gradle-modules/gradle-5/java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java
similarity index 100%
rename from gradle-5/java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java
rename to gradle-modules/gradle-5/java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java
diff --git a/gradle-5/settings.gradle b/gradle-modules/gradle-5/settings.gradle
similarity index 71%
rename from gradle-5/settings.gradle
rename to gradle-modules/gradle-5/settings.gradle
index ede73daf0a..c73af319a3 100644
--- a/gradle-5/settings.gradle
+++ b/gradle-modules/gradle-5/settings.gradle
@@ -1,4 +1,4 @@
-rootProject.name='gradle-5-articles'
+rootProject.name='gradle-5'
include 'java-exec'
include 'unused-dependencies'
include 'source-sets'
diff --git a/gradle-5/source-sets/.gitignore b/gradle-modules/gradle-5/source-sets/.gitignore
similarity index 100%
rename from gradle-5/source-sets/.gitignore
rename to gradle-modules/gradle-5/source-sets/.gitignore
diff --git a/gradle-5/source-sets/README.md b/gradle-modules/gradle-5/source-sets/README.md
similarity index 100%
rename from gradle-5/source-sets/README.md
rename to gradle-modules/gradle-5/source-sets/README.md
diff --git a/gradle-5/source-sets/build.gradle b/gradle-modules/gradle-5/source-sets/build.gradle
similarity index 100%
rename from gradle-5/source-sets/build.gradle
rename to gradle-modules/gradle-5/source-sets/build.gradle
diff --git a/gradle-5/source-sets/src/itest/java/com/baeldung/itest/SourceSetsItest.java b/gradle-modules/gradle-5/source-sets/src/itest/java/com/baeldung/itest/SourceSetsItest.java
similarity index 100%
rename from gradle-5/source-sets/src/itest/java/com/baeldung/itest/SourceSetsItest.java
rename to gradle-modules/gradle-5/source-sets/src/itest/java/com/baeldung/itest/SourceSetsItest.java
diff --git a/gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsMain.java b/gradle-modules/gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsMain.java
similarity index 100%
rename from gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsMain.java
rename to gradle-modules/gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsMain.java
diff --git a/gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsObject.java b/gradle-modules/gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsObject.java
similarity index 100%
rename from gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsObject.java
rename to gradle-modules/gradle-5/source-sets/src/main/java/com/baeldung/main/SourceSetsObject.java
diff --git a/gradle-5/source-sets/src/test/java/com/baeldung/test/SourceSetsTest.java b/gradle-modules/gradle-5/source-sets/src/test/java/com/baeldung/test/SourceSetsTest.java
similarity index 100%
rename from gradle-5/source-sets/src/test/java/com/baeldung/test/SourceSetsTest.java
rename to gradle-modules/gradle-5/source-sets/src/test/java/com/baeldung/test/SourceSetsTest.java
diff --git a/gradle-5/unused-dependencies/.gitignore b/gradle-modules/gradle-5/unused-dependencies/.gitignore
similarity index 100%
rename from gradle-5/unused-dependencies/.gitignore
rename to gradle-modules/gradle-5/unused-dependencies/.gitignore
diff --git a/gradle-5/unused-dependencies/build.gradle b/gradle-modules/gradle-5/unused-dependencies/build.gradle
similarity index 100%
rename from gradle-5/unused-dependencies/build.gradle
rename to gradle-modules/gradle-5/unused-dependencies/build.gradle
diff --git a/gradle-5/unused-dependencies/src/main/java/com/baeldung/unused/UnusedDependencies.java b/gradle-modules/gradle-5/unused-dependencies/src/main/java/com/baeldung/unused/UnusedDependencies.java
similarity index 100%
rename from gradle-5/unused-dependencies/src/main/java/com/baeldung/unused/UnusedDependencies.java
rename to gradle-modules/gradle-5/unused-dependencies/src/main/java/com/baeldung/unused/UnusedDependencies.java
diff --git a/gradle-6/.gitignore b/gradle-modules/gradle-6/.gitignore
similarity index 100%
rename from gradle-6/.gitignore
rename to gradle-modules/gradle-6/.gitignore
diff --git a/gradle-6/README.md b/gradle-modules/gradle-6/README.md
similarity index 100%
rename from gradle-6/README.md
rename to gradle-modules/gradle-6/README.md
diff --git a/gradle-6/build.gradle.kts b/gradle-modules/gradle-6/build.gradle.kts
similarity index 100%
rename from gradle-6/build.gradle.kts
rename to gradle-modules/gradle-6/build.gradle.kts
diff --git a/gradle-6/configuration-avoidance/build.gradle.kts b/gradle-modules/gradle-6/configuration-avoidance/build.gradle.kts
similarity index 100%
rename from gradle-6/configuration-avoidance/build.gradle.kts
rename to gradle-modules/gradle-6/configuration-avoidance/build.gradle.kts
diff --git a/gradle-6/dependency-constraints/build.gradle.kts b/gradle-modules/gradle-6/dependency-constraints/build.gradle.kts
similarity index 100%
rename from gradle-6/dependency-constraints/build.gradle.kts
rename to gradle-modules/gradle-6/dependency-constraints/build.gradle.kts
diff --git a/gradle-6/dependency-constraints/src/main/java/com/baeldung/gradle/RxHelloWorld.java b/gradle-modules/gradle-6/dependency-constraints/src/main/java/com/baeldung/gradle/RxHelloWorld.java
similarity index 100%
rename from gradle-6/dependency-constraints/src/main/java/com/baeldung/gradle/RxHelloWorld.java
rename to gradle-modules/gradle-6/dependency-constraints/src/main/java/com/baeldung/gradle/RxHelloWorld.java
diff --git a/gradle-6/dependency-constraints/src/test/java/com/baeldung/gradle/RxHelloWorldUnitTest.java b/gradle-modules/gradle-6/dependency-constraints/src/test/java/com/baeldung/gradle/RxHelloWorldUnitTest.java
similarity index 100%
rename from gradle-6/dependency-constraints/src/test/java/com/baeldung/gradle/RxHelloWorldUnitTest.java
rename to gradle-modules/gradle-6/dependency-constraints/src/test/java/com/baeldung/gradle/RxHelloWorldUnitTest.java
diff --git a/gradle-6/fibonacci-recursive/build.gradle.kts b/gradle-modules/gradle-6/fibonacci-recursive/build.gradle.kts
similarity index 100%
rename from gradle-6/fibonacci-recursive/build.gradle.kts
rename to gradle-modules/gradle-6/fibonacci-recursive/build.gradle.kts
diff --git a/gradle-6/fibonacci-recursive/src/main/java/com/baeldung/fibonacci/impl/RecursiveFibonacci.java b/gradle-modules/gradle-6/fibonacci-recursive/src/main/java/com/baeldung/fibonacci/impl/RecursiveFibonacci.java
similarity index 100%
rename from gradle-6/fibonacci-recursive/src/main/java/com/baeldung/fibonacci/impl/RecursiveFibonacci.java
rename to gradle-modules/gradle-6/fibonacci-recursive/src/main/java/com/baeldung/fibonacci/impl/RecursiveFibonacci.java
diff --git a/gradle-6/fibonacci-recursive/src/test/java/com/baeldung/fibonacci/impl/RecursiveFibonacciUnitTest.java b/gradle-modules/gradle-6/fibonacci-recursive/src/test/java/com/baeldung/fibonacci/impl/RecursiveFibonacciUnitTest.java
similarity index 100%
rename from gradle-6/fibonacci-recursive/src/test/java/com/baeldung/fibonacci/impl/RecursiveFibonacciUnitTest.java
rename to gradle-modules/gradle-6/fibonacci-recursive/src/test/java/com/baeldung/fibonacci/impl/RecursiveFibonacciUnitTest.java
diff --git a/gradle-6/fibonacci-spi/build.gradle.kts b/gradle-modules/gradle-6/fibonacci-spi/build.gradle.kts
similarity index 100%
rename from gradle-6/fibonacci-spi/build.gradle.kts
rename to gradle-modules/gradle-6/fibonacci-spi/build.gradle.kts
diff --git a/gradle-6/fibonacci-spi/src/main/java/com/baeldung/fibonacci/FibonacciSequenceGenerator.java b/gradle-modules/gradle-6/fibonacci-spi/src/main/java/com/baeldung/fibonacci/FibonacciSequenceGenerator.java
similarity index 100%
rename from gradle-6/fibonacci-spi/src/main/java/com/baeldung/fibonacci/FibonacciSequenceGenerator.java
rename to gradle-modules/gradle-6/fibonacci-spi/src/main/java/com/baeldung/fibonacci/FibonacciSequenceGenerator.java
diff --git a/gradle-6/fibonacci-spi/src/testFixtures/java/com/baeldung/fibonacci/FibonacciSequenceGeneratorFixture.java b/gradle-modules/gradle-6/fibonacci-spi/src/testFixtures/java/com/baeldung/fibonacci/FibonacciSequenceGeneratorFixture.java
similarity index 100%
rename from gradle-6/fibonacci-spi/src/testFixtures/java/com/baeldung/fibonacci/FibonacciSequenceGeneratorFixture.java
rename to gradle-modules/gradle-6/fibonacci-spi/src/testFixtures/java/com/baeldung/fibonacci/FibonacciSequenceGeneratorFixture.java
diff --git a/gradle-6/gradle.properties b/gradle-modules/gradle-6/gradle.properties
similarity index 100%
rename from gradle-6/gradle.properties
rename to gradle-modules/gradle-6/gradle.properties
diff --git a/gradle-6/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle-6/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle-6/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle-6/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle-6/gradlew b/gradle-modules/gradle-6/gradlew
similarity index 100%
rename from gradle-6/gradlew
rename to gradle-modules/gradle-6/gradlew
diff --git a/gradle-6/gradlew.bat b/gradle-modules/gradle-6/gradlew.bat
similarity index 100%
rename from gradle-6/gradlew.bat
rename to gradle-modules/gradle-6/gradlew.bat
diff --git a/gradle-6/httpclient-platform/build.gradle.kts b/gradle-modules/gradle-6/httpclient-platform/build.gradle.kts
similarity index 100%
rename from gradle-6/httpclient-platform/build.gradle.kts
rename to gradle-modules/gradle-6/httpclient-platform/build.gradle.kts
diff --git a/gradle-6/module-metadata-publishing/build.gradle.kts b/gradle-modules/gradle-6/module-metadata-publishing/build.gradle.kts
similarity index 100%
rename from gradle-6/module-metadata-publishing/build.gradle.kts
rename to gradle-modules/gradle-6/module-metadata-publishing/build.gradle.kts
diff --git a/gradle-6/person-rest-client/build.gradle.kts b/gradle-modules/gradle-6/person-rest-client/build.gradle.kts
similarity index 100%
rename from gradle-6/person-rest-client/build.gradle.kts
rename to gradle-modules/gradle-6/person-rest-client/build.gradle.kts
diff --git a/gradle-6/settings.gradle.kts b/gradle-modules/gradle-6/settings.gradle.kts
similarity index 100%
rename from gradle-6/settings.gradle.kts
rename to gradle-modules/gradle-6/settings.gradle.kts
diff --git a/gradle-6/widget-rest-client/build.gradle.kts b/gradle-modules/gradle-6/widget-rest-client/build.gradle.kts
similarity index 100%
rename from gradle-6/widget-rest-client/build.gradle.kts
rename to gradle-modules/gradle-6/widget-rest-client/build.gradle.kts
diff --git a/gradle/.gitignore b/gradle-modules/gradle/.gitignore
similarity index 100%
rename from gradle/.gitignore
rename to gradle-modules/gradle/.gitignore
diff --git a/gradle/.travis.yml b/gradle-modules/gradle/.travis.yml
similarity index 100%
rename from gradle/.travis.yml
rename to gradle-modules/gradle/.travis.yml
diff --git a/gradle/README.md b/gradle-modules/gradle/README.md
similarity index 100%
rename from gradle/README.md
rename to gradle-modules/gradle/README.md
diff --git a/gradle/build.gradle b/gradle-modules/gradle/build.gradle
similarity index 100%
rename from gradle/build.gradle
rename to gradle-modules/gradle/build.gradle
diff --git a/gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy b/gradle-modules/gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy
similarity index 100%
rename from gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy
rename to gradle-modules/gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy
diff --git a/gradle/gradle-cucumber/README.md b/gradle-modules/gradle/gradle-cucumber/README.md
similarity index 100%
rename from gradle/gradle-cucumber/README.md
rename to gradle-modules/gradle/gradle-cucumber/README.md
diff --git a/gradle/gradle-cucumber/build.gradle b/gradle-modules/gradle/gradle-cucumber/build.gradle
similarity index 100%
rename from gradle/gradle-cucumber/build.gradle
rename to gradle-modules/gradle/gradle-cucumber/build.gradle
diff --git a/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle/gradle-cucumber/gradlew b/gradle-modules/gradle/gradle-cucumber/gradlew
similarity index 100%
rename from gradle/gradle-cucumber/gradlew
rename to gradle-modules/gradle/gradle-cucumber/gradlew
diff --git a/gradle/gradle-cucumber/gradlew.bat b/gradle-modules/gradle/gradle-cucumber/gradlew.bat
similarity index 100%
rename from gradle/gradle-cucumber/gradlew.bat
rename to gradle-modules/gradle/gradle-cucumber/gradlew.bat
diff --git a/gradle/gradle-cucumber/settings.gradle b/gradle-modules/gradle/gradle-cucumber/settings.gradle
similarity index 100%
rename from gradle/gradle-cucumber/settings.gradle
rename to gradle-modules/gradle/gradle-cucumber/settings.gradle
diff --git a/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java b/gradle-modules/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java
similarity index 100%
rename from gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java
rename to gradle-modules/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java
diff --git a/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java b/gradle-modules/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java
similarity index 100%
rename from gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java
rename to gradle-modules/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java
diff --git a/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java b/gradle-modules/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java
similarity index 100%
rename from gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java
rename to gradle-modules/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java
diff --git a/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature b/gradle-modules/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature
similarity index 100%
rename from gradle/gradle-cucumber/src/test/resources/features/account_credited.feature
rename to gradle-modules/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature
diff --git a/gradle/gradle-dependency-management/README.md b/gradle-modules/gradle/gradle-dependency-management/README.md
similarity index 100%
rename from gradle/gradle-dependency-management/README.md
rename to gradle-modules/gradle/gradle-dependency-management/README.md
diff --git a/gradle/gradle-dependency-management/build.gradle b/gradle-modules/gradle/gradle-dependency-management/build.gradle
similarity index 100%
rename from gradle/gradle-dependency-management/build.gradle
rename to gradle-modules/gradle/gradle-dependency-management/build.gradle
diff --git a/gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle/gradle-dependency-management/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle/gradle-dependency-management/gradlew b/gradle-modules/gradle/gradle-dependency-management/gradlew
similarity index 100%
rename from gradle/gradle-dependency-management/gradlew
rename to gradle-modules/gradle/gradle-dependency-management/gradlew
diff --git a/gradle/gradle-dependency-management/gradlew.bat b/gradle-modules/gradle/gradle-dependency-management/gradlew.bat
similarity index 100%
rename from gradle/gradle-dependency-management/gradlew.bat
rename to gradle-modules/gradle/gradle-dependency-management/gradlew.bat
diff --git a/gradle/gradle-dependency-management/libs/sampleOne.jar b/gradle-modules/gradle/gradle-dependency-management/libs/sampleOne.jar
similarity index 100%
rename from gradle/gradle-dependency-management/libs/sampleOne.jar
rename to gradle-modules/gradle/gradle-dependency-management/libs/sampleOne.jar
diff --git a/gradle/gradle-dependency-management/libs/sampleTwo.jar b/gradle-modules/gradle/gradle-dependency-management/libs/sampleTwo.jar
similarity index 100%
rename from gradle/gradle-dependency-management/libs/sampleTwo.jar
rename to gradle-modules/gradle/gradle-dependency-management/libs/sampleTwo.jar
diff --git a/gradle/gradle-dependency-management/settings.gradle b/gradle-modules/gradle/gradle-dependency-management/settings.gradle
similarity index 100%
rename from gradle/gradle-dependency-management/settings.gradle
rename to gradle-modules/gradle/gradle-dependency-management/settings.gradle
diff --git a/gradle/gradle-dependency-management/src/main/java/com/gradle/dependencymanagement/DependencyManagementApplication.java b/gradle-modules/gradle/gradle-dependency-management/src/main/java/com/gradle/dependencymanagement/DependencyManagementApplication.java
similarity index 100%
rename from gradle/gradle-dependency-management/src/main/java/com/gradle/dependencymanagement/DependencyManagementApplication.java
rename to gradle-modules/gradle/gradle-dependency-management/src/main/java/com/gradle/dependencymanagement/DependencyManagementApplication.java
diff --git a/gradle/gradle-dependency-management/src/main/resources/application.properties b/gradle-modules/gradle/gradle-dependency-management/src/main/resources/application.properties
similarity index 100%
rename from gradle/gradle-dependency-management/src/main/resources/application.properties
rename to gradle-modules/gradle/gradle-dependency-management/src/main/resources/application.properties
diff --git a/gradle/gradle-dependency-management/src/test/java/com/gradle/dependencymanagement/DependencyManagementApplicationUnitTests.java b/gradle-modules/gradle/gradle-dependency-management/src/test/java/com/gradle/dependencymanagement/DependencyManagementApplicationUnitTests.java
similarity index 100%
rename from gradle/gradle-dependency-management/src/test/java/com/gradle/dependencymanagement/DependencyManagementApplicationUnitTests.java
rename to gradle-modules/gradle/gradle-dependency-management/src/test/java/com/gradle/dependencymanagement/DependencyManagementApplicationUnitTests.java
diff --git a/gradle/gradle-employee-app/.gitignore b/gradle-modules/gradle/gradle-employee-app/.gitignore
similarity index 100%
rename from gradle/gradle-employee-app/.gitignore
rename to gradle-modules/gradle/gradle-employee-app/.gitignore
diff --git a/gradle/gradle-employee-app/README.md b/gradle-modules/gradle/gradle-employee-app/README.md
similarity index 100%
rename from gradle/gradle-employee-app/README.md
rename to gradle-modules/gradle/gradle-employee-app/README.md
diff --git a/gradle/gradle-employee-app/build.gradle b/gradle-modules/gradle/gradle-employee-app/build.gradle
similarity index 100%
rename from gradle/gradle-employee-app/build.gradle
rename to gradle-modules/gradle/gradle-employee-app/build.gradle
diff --git a/gradle/gradle-employee-app/settings.gradle b/gradle-modules/gradle/gradle-employee-app/settings.gradle
similarity index 100%
rename from gradle/gradle-employee-app/settings.gradle
rename to gradle-modules/gradle/gradle-employee-app/settings.gradle
diff --git a/gradle/gradle-employee-app/src/main/java/employee/Employee.java b/gradle-modules/gradle/gradle-employee-app/src/main/java/employee/Employee.java
similarity index 100%
rename from gradle/gradle-employee-app/src/main/java/employee/Employee.java
rename to gradle-modules/gradle/gradle-employee-app/src/main/java/employee/Employee.java
diff --git a/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java b/gradle-modules/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java
similarity index 100%
rename from gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java
rename to gradle-modules/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java
diff --git a/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java b/gradle-modules/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java
similarity index 100%
rename from gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java
rename to gradle-modules/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java
diff --git a/gradle/gradle-fat-jar/README.md b/gradle-modules/gradle/gradle-fat-jar/README.md
similarity index 100%
rename from gradle/gradle-fat-jar/README.md
rename to gradle-modules/gradle/gradle-fat-jar/README.md
diff --git a/gradle/gradle-fat-jar/build.gradle b/gradle-modules/gradle/gradle-fat-jar/build.gradle
similarity index 100%
rename from gradle/gradle-fat-jar/build.gradle
rename to gradle-modules/gradle/gradle-fat-jar/build.gradle
diff --git a/gradle/gradle-fat-jar/settings.gradle b/gradle-modules/gradle/gradle-fat-jar/settings.gradle
similarity index 100%
rename from gradle/gradle-fat-jar/settings.gradle
rename to gradle-modules/gradle/gradle-fat-jar/settings.gradle
diff --git a/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java b/gradle-modules/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java
similarity index 100%
rename from gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java
rename to gradle-modules/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java
diff --git a/gradle/gradle-jacoco/README.md b/gradle-modules/gradle/gradle-jacoco/README.md
similarity index 100%
rename from gradle/gradle-jacoco/README.md
rename to gradle-modules/gradle/gradle-jacoco/README.md
diff --git a/gradle/gradle-jacoco/build.gradle b/gradle-modules/gradle/gradle-jacoco/build.gradle
similarity index 100%
rename from gradle/gradle-jacoco/build.gradle
rename to gradle-modules/gradle/gradle-jacoco/build.gradle
diff --git a/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle/gradle-jacoco/gradlew b/gradle-modules/gradle/gradle-jacoco/gradlew
similarity index 100%
rename from gradle/gradle-jacoco/gradlew
rename to gradle-modules/gradle/gradle-jacoco/gradlew
diff --git a/gradle/gradle-jacoco/gradlew.bat b/gradle-modules/gradle/gradle-jacoco/gradlew.bat
similarity index 100%
rename from gradle/gradle-jacoco/gradlew.bat
rename to gradle-modules/gradle/gradle-jacoco/gradlew.bat
diff --git a/gradle/gradle-jacoco/lombok.config b/gradle-modules/gradle/gradle-jacoco/lombok.config
similarity index 100%
rename from gradle/gradle-jacoco/lombok.config
rename to gradle-modules/gradle/gradle-jacoco/lombok.config
diff --git a/gradle/gradle-jacoco/settings.gradle b/gradle-modules/gradle/gradle-jacoco/settings.gradle
similarity index 100%
rename from gradle/gradle-jacoco/settings.gradle
rename to gradle-modules/gradle/gradle-jacoco/settings.gradle
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java b/gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java
similarity index 100%
rename from gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java
rename to gradle-modules/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java
diff --git a/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java b/gradle-modules/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java
similarity index 100%
rename from gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java
rename to gradle-modules/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java
diff --git a/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java b/gradle-modules/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java
similarity index 100%
rename from gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java
rename to gradle-modules/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java
diff --git a/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature b/gradle-modules/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature
similarity index 100%
rename from gradle/gradle-jacoco/src/test/resources/features/account_credited.feature
rename to gradle-modules/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature
diff --git a/gradle/gradle-source-vs-target-compatibility/README.md b/gradle-modules/gradle/gradle-source-vs-target-compatibility/README.md
similarity index 100%
rename from gradle/gradle-source-vs-target-compatibility/README.md
rename to gradle-modules/gradle/gradle-source-vs-target-compatibility/README.md
diff --git a/gradle/gradle-source-vs-target-compatibility/build.gradle b/gradle-modules/gradle/gradle-source-vs-target-compatibility/build.gradle
similarity index 100%
rename from gradle/gradle-source-vs-target-compatibility/build.gradle
rename to gradle-modules/gradle/gradle-source-vs-target-compatibility/build.gradle
diff --git a/gradle/gradle-source-vs-target-compatibility/settings.gradle b/gradle-modules/gradle/gradle-source-vs-target-compatibility/settings.gradle
similarity index 100%
rename from gradle/gradle-source-vs-target-compatibility/settings.gradle
rename to gradle-modules/gradle/gradle-source-vs-target-compatibility/settings.gradle
diff --git a/gradle/gradle-source-vs-target-compatibility/src/main/java/com/baeldung/helloworld/HelloWorldApp.java b/gradle-modules/gradle/gradle-source-vs-target-compatibility/src/main/java/com/baeldung/helloworld/HelloWorldApp.java
similarity index 100%
rename from gradle/gradle-source-vs-target-compatibility/src/main/java/com/baeldung/helloworld/HelloWorldApp.java
rename to gradle-modules/gradle/gradle-source-vs-target-compatibility/src/main/java/com/baeldung/helloworld/HelloWorldApp.java
diff --git a/gradle/gradle-to-maven/README.md b/gradle-modules/gradle/gradle-to-maven/README.md
similarity index 100%
rename from gradle/gradle-to-maven/README.md
rename to gradle-modules/gradle/gradle-to-maven/README.md
diff --git a/gradle/gradle-to-maven/build.gradle b/gradle-modules/gradle/gradle-to-maven/build.gradle
similarity index 100%
rename from gradle/gradle-to-maven/build.gradle
rename to gradle-modules/gradle/gradle-to-maven/build.gradle
diff --git a/gradle/gradle-to-maven/settings.gradle b/gradle-modules/gradle/gradle-to-maven/settings.gradle
similarity index 100%
rename from gradle/gradle-to-maven/settings.gradle
rename to gradle-modules/gradle/gradle-to-maven/settings.gradle
diff --git a/gradle/gradle-wrapper/README.md b/gradle-modules/gradle/gradle-wrapper/README.md
similarity index 100%
rename from gradle/gradle-wrapper/README.md
rename to gradle-modules/gradle/gradle-wrapper/README.md
diff --git a/gradle/gradle-wrapper/gradle/wrapper/README.md b/gradle-modules/gradle/gradle-wrapper/gradle/wrapper/README.md
similarity index 100%
rename from gradle/gradle-wrapper/gradle/wrapper/README.md
rename to gradle-modules/gradle/gradle-wrapper/gradle/wrapper/README.md
diff --git a/gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle/gradle-wrapper/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle/gradle-wrapper/gradlew b/gradle-modules/gradle/gradle-wrapper/gradlew
similarity index 100%
rename from gradle/gradle-wrapper/gradlew
rename to gradle-modules/gradle/gradle-wrapper/gradlew
diff --git a/gradle/gradle-wrapper/gradlew.bat b/gradle-modules/gradle/gradle-wrapper/gradlew.bat
similarity index 100%
rename from gradle/gradle-wrapper/gradlew.bat
rename to gradle-modules/gradle/gradle-wrapper/gradlew.bat
diff --git a/gradle/gradle-wrapper/settings.gradle b/gradle-modules/gradle/gradle-wrapper/settings.gradle
similarity index 100%
rename from gradle/gradle-wrapper/settings.gradle
rename to gradle-modules/gradle/gradle-wrapper/settings.gradle
diff --git a/gradle/gradle/shipkit.gradle b/gradle-modules/gradle/gradle/shipkit.gradle
similarity index 100%
rename from gradle/gradle/shipkit.gradle
rename to gradle-modules/gradle/gradle/shipkit.gradle
diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle/gradletaskdemo/aplugin.gradle b/gradle-modules/gradle/gradletaskdemo/aplugin.gradle
similarity index 100%
rename from gradle/gradletaskdemo/aplugin.gradle
rename to gradle-modules/gradle/gradletaskdemo/aplugin.gradle
diff --git a/gradle/gradletaskdemo/build.gradle b/gradle-modules/gradle/gradletaskdemo/build.gradle
similarity index 100%
rename from gradle/gradletaskdemo/build.gradle
rename to gradle-modules/gradle/gradletaskdemo/build.gradle
diff --git a/gradle/gradlew b/gradle-modules/gradle/gradlew
similarity index 100%
rename from gradle/gradlew
rename to gradle-modules/gradle/gradlew
diff --git a/gradle/gradlew.bat b/gradle-modules/gradle/gradlew.bat
similarity index 100%
rename from gradle/gradlew.bat
rename to gradle-modules/gradle/gradlew.bat
diff --git a/gradle/greeter/.gitignore b/gradle-modules/gradle/greeter/.gitignore
similarity index 100%
rename from gradle/greeter/.gitignore
rename to gradle-modules/gradle/greeter/.gitignore
diff --git a/gradle/greeter/build.gradle b/gradle-modules/gradle/greeter/build.gradle
similarity index 100%
rename from gradle/greeter/build.gradle
rename to gradle-modules/gradle/greeter/build.gradle
diff --git a/gradle/greeter/src/main/java/greeter/Greeter.java b/gradle-modules/gradle/greeter/src/main/java/greeter/Greeter.java
similarity index 100%
rename from gradle/greeter/src/main/java/greeter/Greeter.java
rename to gradle-modules/gradle/greeter/src/main/java/greeter/Greeter.java
diff --git a/gradle/greeter/src/test/java/greetertest/TestGreeting.java b/gradle-modules/gradle/greeter/src/test/java/greetertest/TestGreeting.java
similarity index 100%
rename from gradle/greeter/src/test/java/greetertest/TestGreeting.java
rename to gradle-modules/gradle/greeter/src/test/java/greetertest/TestGreeting.java
diff --git a/gradle/greeting-library-java/.gitignore b/gradle-modules/gradle/greeting-library-java/.gitignore
similarity index 100%
rename from gradle/greeting-library-java/.gitignore
rename to gradle-modules/gradle/greeting-library-java/.gitignore
diff --git a/gradle/greeting-library-java/build.gradle b/gradle-modules/gradle/greeting-library-java/build.gradle
similarity index 100%
rename from gradle/greeting-library-java/build.gradle
rename to gradle-modules/gradle/greeting-library-java/build.gradle
diff --git a/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java b/gradle-modules/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java
similarity index 100%
rename from gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java
rename to gradle-modules/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java
diff --git a/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java b/gradle-modules/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java
similarity index 100%
rename from gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java
rename to gradle-modules/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java
diff --git a/gradle/greeting-library/.gitignore b/gradle-modules/gradle/greeting-library/.gitignore
similarity index 100%
rename from gradle/greeting-library/.gitignore
rename to gradle-modules/gradle/greeting-library/.gitignore
diff --git a/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy b/gradle-modules/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy
similarity index 100%
rename from gradle/greeting-library/bin/greeter/GreetingFormatter.groovy
rename to gradle-modules/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy
diff --git a/gradle/greeting-library/build.gradle b/gradle-modules/gradle/greeting-library/build.gradle
similarity index 100%
rename from gradle/greeting-library/build.gradle
rename to gradle-modules/gradle/greeting-library/build.gradle
diff --git a/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy b/gradle-modules/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy
similarity index 100%
rename from gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy
rename to gradle-modules/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy
diff --git a/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy b/gradle-modules/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy
similarity index 100%
rename from gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy
rename to gradle-modules/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy
diff --git a/gradle/junit5/README.md b/gradle-modules/gradle/junit5/README.md
similarity index 100%
rename from gradle/junit5/README.md
rename to gradle-modules/gradle/junit5/README.md
diff --git a/gradle/junit5/build.gradle b/gradle-modules/gradle/junit5/build.gradle
similarity index 100%
rename from gradle/junit5/build.gradle
rename to gradle-modules/gradle/junit5/build.gradle
diff --git a/gradle/junit5/settings.gradle b/gradle-modules/gradle/junit5/settings.gradle
similarity index 100%
rename from gradle/junit5/settings.gradle
rename to gradle-modules/gradle/junit5/settings.gradle
diff --git a/gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java b/gradle-modules/gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java
similarity index 100%
rename from gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java
rename to gradle-modules/gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java
diff --git a/gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java b/gradle-modules/gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java
similarity index 100%
rename from gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java
rename to gradle-modules/gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java
diff --git a/gradle/maven-to-gradle/README.md b/gradle-modules/gradle/maven-to-gradle/README.md
similarity index 100%
rename from gradle/maven-to-gradle/README.md
rename to gradle-modules/gradle/maven-to-gradle/README.md
diff --git a/gradle/maven-to-gradle/build.gradle b/gradle-modules/gradle/maven-to-gradle/build.gradle
similarity index 100%
rename from gradle/maven-to-gradle/build.gradle
rename to gradle-modules/gradle/maven-to-gradle/build.gradle
diff --git a/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar
rename to gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar
diff --git a/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties
rename to gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties
diff --git a/gradle/maven-to-gradle/gradlew b/gradle-modules/gradle/maven-to-gradle/gradlew
similarity index 100%
rename from gradle/maven-to-gradle/gradlew
rename to gradle-modules/gradle/maven-to-gradle/gradlew
diff --git a/gradle/maven-to-gradle/gradlew.bat b/gradle-modules/gradle/maven-to-gradle/gradlew.bat
similarity index 100%
rename from gradle/maven-to-gradle/gradlew.bat
rename to gradle-modules/gradle/maven-to-gradle/gradlew.bat
diff --git a/gradle/maven-to-gradle/pom.xml b/gradle-modules/gradle/maven-to-gradle/pom.xml
similarity index 100%
rename from gradle/maven-to-gradle/pom.xml
rename to gradle-modules/gradle/maven-to-gradle/pom.xml
diff --git a/gradle/maven-to-gradle/settings.gradle b/gradle-modules/gradle/maven-to-gradle/settings.gradle
similarity index 100%
rename from gradle/maven-to-gradle/settings.gradle
rename to gradle-modules/gradle/maven-to-gradle/settings.gradle
diff --git a/gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java b/gradle-modules/gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java
similarity index 100%
rename from gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java
rename to gradle-modules/gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java
diff --git a/gradle/plugin/build.gradle b/gradle-modules/gradle/plugin/build.gradle
similarity index 100%
rename from gradle/plugin/build.gradle
rename to gradle-modules/gradle/plugin/build.gradle
diff --git a/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java b/gradle-modules/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java
similarity index 100%
rename from gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java
rename to gradle-modules/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java
diff --git a/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java b/gradle-modules/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java
similarity index 100%
rename from gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java
rename to gradle-modules/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java
diff --git a/gradle/settings.gradle b/gradle-modules/gradle/settings.gradle
similarity index 82%
rename from gradle/settings.gradle
rename to gradle-modules/gradle/settings.gradle
index ba255f25c2..c049dbc7e9 100644
--- a/gradle/settings.gradle
+++ b/gradle-modules/gradle/settings.gradle
@@ -1,4 +1,4 @@
-rootProject.name = 'gradletutorial'
+rootProject.name = 'gradle'
include 'greeting-library'
include 'greeting-library-java'
diff --git a/gradle/version.properties b/gradle-modules/gradle/version.properties
similarity index 100%
rename from gradle/version.properties
rename to gradle-modules/gradle/version.properties
diff --git a/gradle-modules/settings.gradle b/gradle-modules/settings.gradle
new file mode 100644
index 0000000000..f6e0614a10
--- /dev/null
+++ b/gradle-modules/settings.gradle
@@ -0,0 +1,4 @@
+rootProject.name = 'gradle-modules'
+include 'gradle'
+include 'gradle-5'
+include 'gradle-6'
diff --git a/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy b/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy
deleted file mode 100644
index f1c1211552..0000000000
--- a/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package greeter
-
-import spock.lang.Specification
-
-class GreetingFormatterSpec extends Specification {
-
- def 'Creating a greeting'() {
-
- expect: 'The greeeting to be correctly capitalized'
- GreetingFormatter.greeting('gradlephant') == 'Hello, Gradlephant'
-
- }
-}
diff --git a/graphql-modules/graphql-java/pom.xml b/graphql-modules/graphql-java/pom.xml
index 1993130b12..01b7a4fbc3 100644
--- a/graphql-modules/graphql-java/pom.xml
+++ b/graphql-modules/graphql-java/pom.xml
@@ -1,4 +1,3 @@
-
graphql-spqr
-
+
\ No newline at end of file
diff --git a/javax-servlets-2/pom.xml b/javax-servlets-2/pom.xml
index 6469c66db6..5fa1e76e0b 100644
--- a/javax-servlets-2/pom.xml
+++ b/javax-servlets-2/pom.xml
@@ -65,19 +65,19 @@
-
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
-
-
-
-
-
+
+
+
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
+
+
+
+
+
4.5.13
diff --git a/javax-sound/pom.xml b/javax-sound/pom.xml
index 7b5fabb9a7..dcd08cbcb8 100644
--- a/javax-sound/pom.xml
+++ b/javax-sound/pom.xml
@@ -8,11 +8,13 @@
1.0-SNAPSHOT
javax-sound
jar
+
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+
javazoom
@@ -30,8 +32,10 @@
${org.openjfx.version}
+
11.0.2
1.0.1
+
\ No newline at end of file
diff --git a/javaxval/pom.xml b/javaxval/pom.xml
index e6ecee6cfb..a88bde35f8 100644
--- a/javaxval/pom.xml
+++ b/javaxval/pom.xml
@@ -34,8 +34,19 @@
spring-test
${org.springframework.version}
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ ${spring.boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring.boot.version}
+ test
+
-
+
- 6.0.13.Final
+ 6.2.3.Final
6.2.0.Final
3.6.1
1.8
1.8
3.0.0
- 5.0.2.RELEASE
+ 5.3.21
+ 2.7.1
\ No newline at end of file
diff --git a/javaxval/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java b/javaxval/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java
new file mode 100644
index 0000000000..47f0ee69fe
--- /dev/null
+++ b/javaxval/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java
@@ -0,0 +1,22 @@
+package com.baeldung.javaxval.notnull;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import javax.validation.constraints.NotNull;
+
+public class NotNullMethodParameter {
+
+ ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+ Validator validator = factory.getValidator();
+
+ public int doesNotValidateNotNull(@NotNull String myString) {
+ return myString.length();
+ }
+
+ public int validateNotNull(@NotNull String myString) {
+ validator.validate(myString);
+ return myString.length();
+ }
+
+}
\ No newline at end of file
diff --git a/javaxval/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java b/javaxval/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java
new file mode 100644
index 0000000000..919001bd55
--- /dev/null
+++ b/javaxval/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java
@@ -0,0 +1,21 @@
+package com.baeldung.javaxval.notnull;
+
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotNull;
+
+@Component
+@Validated
+public class ValidatingComponent {
+
+ public int validateNotNull(@NotNull String data)
+ {
+ return data.length();
+ }
+
+ public int callAnnotatedMethod(String data) {
+ return validateNotNull(data);
+ }
+
+}
diff --git a/javaxval/src/test/java/com/baeldung/javaxval/notnull/NotNullMethodParameterUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/notnull/NotNullMethodParameterUnitTest.java
new file mode 100644
index 0000000000..bfc34331e5
--- /dev/null
+++ b/javaxval/src/test/java/com/baeldung/javaxval/notnull/NotNullMethodParameterUnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.javaxval.notnull;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class NotNullMethodParameterUnitTest {
+
+ private NotNullMethodParameter demo = new NotNullMethodParameter();
+
+ @Test
+ public void givenNull_whenInvokedwithNoValidator_thenNullPointerException() {
+ assertThrows(NullPointerException.class, () -> demo.doesNotValidateNotNull(null));
+ }
+
+ @Test
+ public void givenNull_whenInvokedWithValidator_thenIllegalArgumentException() {
+ assertThrows(IllegalArgumentException.class, () -> demo.validateNotNull(null));
+ }
+
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java b/javaxval/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java
new file mode 100644
index 0000000000..dbeba3e812
--- /dev/null
+++ b/javaxval/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.javaxval.notnull;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.constraints.NotNull;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@SpringBootTest
+class ValidatingComponentIntegrationTest {
+
+ @Autowired ValidatingComponent component;
+
+ @Test
+ void givenValue_whenValidate_thenSuccess() {
+ assertThat(component.validateNotNull("Not null!"), is(9));
+ }
+
+ @Test
+ void givenNull_whenValidate_thenConstraintViolationException() {
+ ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> component.validateNotNull(null));
+ Set> constraintViolations = constraintViolationException.getConstraintViolations();
+ assertThat(constraintViolations.iterator().next().getConstraintDescriptor().getAnnotation().annotationType(), is(NotNull.class));
+ }
+
+ @Test
+ void givenNull_whenOnlyCalledMethodHasAnnotation_thenNoValidation() {
+ assertThrows(NullPointerException.class, () -> component.callAnnotatedMethod(null));
+ }
+
+ @SpringBootApplication
+ static class TestApplication {
+ }
+
+}
\ No newline at end of file
diff --git a/json-modules/gson/pom.xml b/json-modules/gson/pom.xml
index bd0b562785..45054b6664 100644
--- a/json-modules/gson/pom.xml
+++ b/json-modules/gson/pom.xml
@@ -52,7 +52,6 @@
gson
${gson.version}
-
diff --git a/json-modules/pom.xml b/json-modules/pom.xml
index 171086db2e..2deb53d533 100644
--- a/json-modules/pom.xml
+++ b/json-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
json-modules
json-modules
@@ -31,5 +31,4 @@
-
\ No newline at end of file
diff --git a/kubernetes/k8s-admission-controller/README.md b/kubernetes/k8s-admission-controller/README.md
index 9c824d76b3..fd41c3b4e6 100644
--- a/kubernetes/k8s-admission-controller/README.md
+++ b/kubernetes/k8s-admission-controller/README.md
@@ -1,4 +1,4 @@
## Relevant Articles:
-- [Creating a Kubertes Admission Controller in Java](https://www.baeldung.com/java-kubernetes-admission-controller)
+- [Creating a Kubernetes Admission Controller in Java](https://www.baeldung.com/java-kubernetes-admission-controller)
- [Access Control Models](https://www.baeldung.com/java-access-control-models)
diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index d68a9e0703..b0672633c1 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -86,7 +86,6 @@
error_prone_core
${errorprone.version}
-
com.structurizr
structurizr-core
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index eefc265457..fa1f232d1c 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -118,17 +118,18 @@
${jmh-core.version}
-
-
+
+
org.apache.maven.plugins
maven-surefire-plugin
-
- target/mypacts
-
-
+
+ target/mypacts
+
+
+
diff --git a/libraries-apache-commons-collections/pom.xml b/libraries-apache-commons-collections/pom.xml
index ac7a327ead..ccc2158d07 100644
--- a/libraries-apache-commons-collections/pom.xml
+++ b/libraries-apache-commons-collections/pom.xml
@@ -26,5 +26,4 @@
-
\ No newline at end of file
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java
index ee819b844b..cee73f674e 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java
@@ -1,5 +1,6 @@
package com.baeldung.libraries.opencsv;
+import com.baeldung.libraries.opencsv.beans.CsvBean;
import com.baeldung.libraries.opencsv.beans.NamedColumnBean;
import com.baeldung.libraries.opencsv.beans.SimplePositionBean;
import com.baeldung.libraries.opencsv.examples.sync.BeanExamples;
@@ -7,102 +8,60 @@ import com.baeldung.libraries.opencsv.examples.sync.CsvReaderExamples;
import com.baeldung.libraries.opencsv.examples.sync.CsvWriterExamples;
import com.baeldung.libraries.opencsv.helpers.Helpers;
-import java.io.Reader;
-import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.List;
public class Application {
- /*
- * Bean Examples.
- */
-
- public static String simpleSyncPositionBeanExample() {
- Path path = null;
- try {
- path = Helpers.twoColumnCsvPath();
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString();
+ // CSV Reader Examples
+ public static List readLineByLineSyncExample() throws Exception {
+ Path path = Helpers.twoColumnCsvPath();
+ return CsvReaderExamples.readLineByLine(path);
}
- public static String namedSyncColumnBeanExample() {
- Path path = null;
- try {
- path = Helpers.namedColumnCsvPath();
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString();
+ public static List readAllLinesSyncExample() throws Exception {
+ Path path = Helpers.twoColumnCsvPath();
+ return CsvReaderExamples.readAllLines(path);
}
- public static String writeSyncCsvFromBeanExample() {
- Path path = null;
- try {
- path = Helpers.fileOutBeanPath();
- } catch (Exception ex) {
- Helpers.err(ex);
- }
+ // CSV Writer Examples
+ public static String writeLineByLineSyncExample() throws Exception {
+ Path path = Helpers.fileOutOnePath();
+ return CsvWriterExamples.writeLineByLine(Helpers.fourColumnCsvString(), path);
+ }
+
+ public static String writeAllLinesSyncExample() throws Exception {
+ Path path = Helpers.fileOutAllPath();
+ return CsvWriterExamples.writeAllLines(Helpers.fourColumnCsvString(), path);
+ }
+
+ // Bean Examples
+ public static List simpleSyncPositionBeanExample() throws Exception {
+ Path path = Helpers.twoColumnCsvPath();
+ return BeanExamples.beanBuilderExample(path, SimplePositionBean.class);
+ }
+
+ public static List namedSyncColumnBeanExample() throws Exception {
+ Path path = Helpers.namedColumnCsvPath();
+ return BeanExamples.beanBuilderExample(path, NamedColumnBean.class);
+ }
+
+ public static String writeSyncCsvFromBeanExample() throws Exception {
+ Path path = Helpers.fileOutBeanPath();
return BeanExamples.writeCsvFromBean(path);
}
- /*
- * CSV Reader Examples.
- */
-
- public static String oneByOneSyncExample() {
- Reader reader = null;
- try {
- reader = Files.newBufferedReader(Helpers.twoColumnCsvPath());
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return CsvReaderExamples.oneByOne(reader).toString();
- }
-
- public static String readAllSyncExample() {
- Reader reader = null;
- try {
- reader = Files.newBufferedReader(Helpers.twoColumnCsvPath());
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return CsvReaderExamples.readAll(reader).toString();
- }
-
- /*
- * CSV Writer Examples.
- */
-
-
- public static String csvWriterSyncOneByOne() {
- Path path = null;
- try {
- path = Helpers.fileOutOnePath();
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path);
- }
-
- public static String csvWriterSyncAll() {
- Path path = null;
- try {
- path = Helpers.fileOutAllPath();
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path);
- }
-
public static void main(String[] args) {
- simpleSyncPositionBeanExample();
- namedSyncColumnBeanExample();
- writeSyncCsvFromBeanExample();
- oneByOneSyncExample();
- readAllSyncExample();
- csvWriterSyncOneByOne();
- csvWriterSyncAll();
+ try {
+ simpleSyncPositionBeanExample();
+ namedSyncColumnBeanExample();
+ writeSyncCsvFromBeanExample();
+ readLineByLineSyncExample();
+ readAllLinesSyncExample();
+ writeLineByLineSyncExample();
+ writeAllLinesSyncExample();
+ } catch (Exception e) {
+ throw new RuntimeException("Error during csv processing", e);
+ }
}
}
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/NamedColumnBean.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/NamedColumnBean.java
index 0021584e4f..f8c6537d3a 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/NamedColumnBean.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/NamedColumnBean.java
@@ -27,5 +27,10 @@ public class NamedColumnBean extends CsvBean {
this.age = age;
}
+ @Override
+ public String toString() {
+ return name + ',' + age;
+ }
+
}
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/SimplePositionBean.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/SimplePositionBean.java
index c1710d784a..2306ccc560 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/SimplePositionBean.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/SimplePositionBean.java
@@ -26,4 +26,8 @@ public class SimplePositionBean extends CsvBean {
this.exampleColTwo = exampleColTwo;
}
+ @Override
+ public String toString() {
+ return exampleColOne + ',' + exampleColTwo;
+ }
}
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/WriteExampleBean.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/WriteExampleBean.java
index f5e6466512..62b14dc321 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/WriteExampleBean.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/beans/WriteExampleBean.java
@@ -37,4 +37,9 @@ public class WriteExampleBean extends CsvBean {
public void setColC(String colC) {
this.colC = colC;
}
+
+ @Override
+ public String toString() {
+ return colA + ',' + colB + "," + colC;
+ }
}
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/BeanExamples.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/BeanExamples.java
index f401c7c77c..b2a00be0ee 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/BeanExamples.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/BeanExamples.java
@@ -4,60 +4,49 @@ import com.baeldung.libraries.opencsv.beans.CsvBean;
import com.baeldung.libraries.opencsv.beans.WriteExampleBean;
import com.baeldung.libraries.opencsv.helpers.Helpers;
import com.baeldung.libraries.opencsv.pojos.CsvTransfer;
-import com.opencsv.CSVWriter;
-import com.opencsv.bean.*;
+import com.opencsv.bean.CsvToBean;
+import com.opencsv.bean.CsvToBeanBuilder;
+import com.opencsv.bean.StatefulBeanToCsv;
+import com.opencsv.bean.StatefulBeanToCsvBuilder;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
public class BeanExamples {
- public static List beanBuilderExample(Path path, Class clazz) {
- ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy();
- return beanBuilderExample(path, clazz, ms);
- }
-
- public static List beanBuilderExample(Path path, Class clazz, MappingStrategy ms) {
+ public static List beanBuilderExample(Path path, Class extends CsvBean> clazz) throws Exception {
CsvTransfer csvTransfer = new CsvTransfer();
- try {
- ms.setType(clazz);
-
- Reader reader = Files.newBufferedReader(path);
- CsvToBean cb = new CsvToBeanBuilder(reader).withType(clazz)
- .withMappingStrategy(ms)
- .build();
+ try (Reader reader = Files.newBufferedReader(path)) {
+ CsvToBean cb = new CsvToBeanBuilder(reader)
+ .withType(clazz)
+ .build();
csvTransfer.setCsvList(cb.parse());
- reader.close();
-
- } catch (Exception ex) {
- Helpers.err(ex);
}
+
return csvTransfer.getCsvList();
}
- public static String writeCsvFromBean(Path path) {
- try {
- Writer writer = new FileWriter(path.toString());
+ public static String writeCsvFromBean(Path path) throws Exception {
- StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer).withSeparator(CSVWriter.DEFAULT_SEPARATOR)
- .build();
+ List sampleData = Arrays.asList(
+ new WriteExampleBean("Test1", "sample", "data"),
+ new WriteExampleBean("Test2", "ipso", "facto")
+ );
- List list = new ArrayList<>();
- list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd"));
- list.add(new WriteExampleBean("Test2", "ipso", "facto"));
+ try (Writer writer = new FileWriter(path.toString())) {
+ StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer)
+ .withQuotechar('\'')
+ .build();
- sbc.write(list);
- writer.close();
-
- } catch (Exception ex) {
- Helpers.err(ex);
+ sbc.write(sampleData);
}
+
return Helpers.readFile(path);
}
}
\ No newline at end of file
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvReaderExamples.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvReaderExamples.java
index 2f7d979b2f..2bafe0d764 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvReaderExamples.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvReaderExamples.java
@@ -1,61 +1,58 @@
package com.baeldung.libraries.opencsv.examples.sync;
-import com.baeldung.libraries.opencsv.helpers.Helpers;
import com.opencsv.CSVParser;
import com.opencsv.CSVParserBuilder;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import java.io.Reader;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class CsvReaderExamples {
- public static List readAll(Reader reader) {
+ public static List readAllLines(Path filePath) throws Exception {
CSVParser parser = new CSVParserBuilder()
- .withSeparator(',')
- .withIgnoreQuotations(true)
- .build();
+ .withSeparator(',')
+ .withIgnoreQuotations(true)
+ .build();
- CSVReader csvReader = new CSVReaderBuilder(reader)
- .withSkipLines(0)
- .withCSVParser(parser)
- .build();
+ try (Reader reader = Files.newBufferedReader(filePath)) {
+ CSVReaderBuilder csvReaderBuilder = new CSVReaderBuilder(reader)
+ .withSkipLines(0)
+ .withCSVParser(parser);
- List list = new ArrayList<>();
- try {
- list = csvReader.readAll();
- reader.close();
- csvReader.close();
- } catch (Exception ex) {
- Helpers.err(ex);
+ try (CSVReader csvReader = csvReaderBuilder.build()) {
+ return csvReader.readAll();
+ }
}
- return list;
+
}
- public static List oneByOne(Reader reader) {
+ public static List readLineByLine(Path filePath) throws Exception {
List list = new ArrayList<>();
- try {
- CSVParser parser = new CSVParserBuilder()
- .withSeparator(',')
- .withIgnoreQuotations(true)
- .build();
- CSVReader csvReader = new CSVReaderBuilder(reader)
- .withSkipLines(0)
- .withCSVParser(parser)
- .build();
+ CSVParser parser = new CSVParserBuilder()
+ .withSeparator(',')
+ .withIgnoreQuotations(true)
+ .build();
- String[] line;
- while ((line = csvReader.readNext()) != null) {
- list.add(line);
+ try (Reader reader = Files.newBufferedReader(filePath)) {
+
+ CSVReaderBuilder csvReaderBuilder = new CSVReaderBuilder(reader)
+ .withSkipLines(0)
+ .withCSVParser(parser);
+
+ try (CSVReader csvReader = csvReaderBuilder.build()) {
+ String[] line;
+ while ((line = csvReader.readNext()) != null) {
+ list.add(line);
+ }
}
- reader.close();
- csvReader.close();
- } catch (Exception ex) {
- Helpers.err(ex);
+
}
return list;
}
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvWriterExamples.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvWriterExamples.java
index b5c23bd99d..7f14b2547f 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvWriterExamples.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/examples/sync/CsvWriterExamples.java
@@ -9,26 +9,21 @@ import java.util.List;
public class CsvWriterExamples {
- public static String csvWriterOneByOne(List stringArray, Path path) {
- try {
- CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
- for (String[] array : stringArray) {
- writer.writeNext(array);
+ public static String writeLineByLine(List lines, Path path) throws Exception {
+
+ try (CSVWriter writer = new CSVWriter(new FileWriter(path.toString()))) {
+ for (String[] line : lines) {
+ writer.writeNext(line);
}
- writer.close();
- } catch (Exception ex) {
- Helpers.err(ex);
}
+
return Helpers.readFile(path);
}
- public static String csvWriterAll(List stringArray, Path path) {
- try {
- CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
- writer.writeAll(stringArray);
- writer.close();
- } catch (Exception ex) {
- Helpers.err(ex);
+ public static String writeAllLines(List lines, Path path) throws Exception {
+
+ try (CSVWriter writer = new CSVWriter(new FileWriter(path.toString()))) {
+ writer.writeAll(lines);
}
return Helpers.readFile(path);
}
diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/helpers/Helpers.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/helpers/Helpers.java
index b703d0e82d..fd9e0ba386 100644
--- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/helpers/Helpers.java
+++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/helpers/Helpers.java
@@ -1,9 +1,9 @@
package com.baeldung.libraries.opencsv.helpers;
import com.baeldung.libraries.opencsv.Constants;
+import org.apache.commons.io.IOUtils;
-import java.io.BufferedReader;
-import java.io.FileReader;
+import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Path;
@@ -13,9 +13,7 @@ import java.util.List;
public class Helpers {
- /**
- * Write Files
- */
+ // Write Files
public static Path fileOutAllPath() throws URISyntaxException {
URI uri = ClassLoader.getSystemResource(Constants.CSV_All).toURI();
@@ -32,9 +30,7 @@ public class Helpers {
return Paths.get(uri);
}
- /**
- * Read Files
- */
+ // Read Files
public static Path twoColumnCsvPath() throws URISyntaxException {
URI uri = ClassLoader.getSystemResource(Constants.TWO_COLUMN_CSV).toURI();
@@ -51,33 +47,12 @@ public class Helpers {
return Paths.get(uri);
}
- /**
- * Simple File Reader
- */
-
- public static String readFile(Path path) {
- String response = "";
- try {
- FileReader fr = new FileReader(path.toString());
- BufferedReader br = new BufferedReader(fr);
- String strLine;
- StringBuffer sb = new StringBuffer();
- while ((strLine = br.readLine()) != null) {
- sb.append(strLine);
- }
- response = sb.toString();
- System.out.println(response);
- fr.close();
- br.close();
- } catch (Exception ex) {
- Helpers.err(ex);
- }
- return response;
+ public static String readFile(Path path) throws IOException {
+ return IOUtils.toString(path.toUri());
}
- /**
- * Dummy Data for Writing.
- */
+
+ // Dummy Data for Writing
public static List twoColumnCsvString() {
List list = new ArrayList<>();
@@ -94,15 +69,4 @@ public class Helpers {
return list;
}
- /**
- * Message Helpers
- */
-
- public static void print(String msg) {
- System.out.println(msg);
- }
-
- public static void err(Exception ex) {
- System.out.println(Constants.GENERIC_EXCEPTION + " " + ex);
- }
}
diff --git a/libraries-data-io/src/main/resources/csv/twoColumn.csv b/libraries-data-io/src/main/resources/csv/twoColumn.csv
index 56d8fa1901..527e15af72 100644
--- a/libraries-data-io/src/main/resources/csv/twoColumn.csv
+++ b/libraries-data-io/src/main/resources/csv/twoColumn.csv
@@ -1,5 +1,5 @@
-colA, ColB
-A, B
-C, D
-G, G
-G, F
\ No newline at end of file
+colA,colB
+A,B
+C,D
+G,G
+G,F
\ No newline at end of file
diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java
index b0db4309d9..7cfe8984e7 100644
--- a/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java
+++ b/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java
@@ -1,66 +1,107 @@
package com.baeldung.libraries.opencsv;
-import com.baeldung.libraries.opencsv.helpers.Helpers;
-import org.junit.After;
-import org.junit.Before;
+import com.baeldung.libraries.opencsv.beans.CsvBean;
import org.junit.Test;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
public class OpenCsvIntegrationTest {
- private Object testReadCsv(Object result) {
- assert (result != null);
- assert (result instanceof String);
- assert (!((String) result).isEmpty());
- System.out.println(result);
- return result;
- }
+ private static final String NEW_LINE = System.lineSeparator();
- private Object testWriteCsv(Object result) {
- assert (result instanceof String);
- assert (!((String) result).isEmpty());
- return result;
- }
+ @Test
+ public void givenSampleData_whenReadUsingPosition_thenContentsRead() throws Exception {
+ List values = Application.simpleSyncPositionBeanExample();
- @Before
- public void setup() {
+ assertThat(values)
+ .extracting(Object::toString)
+ .containsExactly(
+ "colA,colB",
+ "A,B",
+ "C,D",
+ "G,G",
+ "G,F"
+ );
}
@Test
- public void positionExampleTest() {
- testReadCsv(Application.simpleSyncPositionBeanExample());
+ public void givenSampleData_whenReadUsingNamedColumn_thenContentsRead() throws Exception {
+ List values = Application.namedSyncColumnBeanExample();
+
+ assertThat(values)
+ .extracting(Object::toString)
+ .containsExactly(
+ "Joe,27",
+ "Jane,32",
+ "Bob,53"
+ );
}
@Test
- public void namedColumnExampleTest() {
- testReadCsv(Application.namedSyncColumnBeanExample());
+ public void givenSampleData_whenReadLineByLine_thenContentsRead() throws Exception {
+ List lineByLineContents = Application.readLineByLineSyncExample();
+
+ assertThat(lineByLineContents)
+ .containsExactly(
+ new String[] {"colA", "colB"},
+ new String[] {"A", "B"},
+ new String[] {"C", "D"},
+ new String[] {"G", "G"},
+ new String[] {"G", "F"}
+ );
}
@Test
- public void writeCsvUsingBeanBuilderTest() {
- testWriteCsv(Application.writeSyncCsvFromBeanExample());
+ public void givenSampleData_whenReadAllLines_thenContentsRead() throws Exception {
+
+ List contents = Application.readAllLinesSyncExample();
+
+ assertThat(contents)
+ .containsExactly(
+ new String[] {"colA", "colB"},
+ new String[] {"A", "B"},
+ new String[] {"C", "D"},
+ new String[] {"G", "G"},
+ new String[] {"G", "F"}
+ );
}
@Test
- public void oneByOneExampleTest() {
- testReadCsv(Application.oneByOneSyncExample());
+ public void givenSampleData_whenWriteCsvUsingBean_thenContentsWritten() throws Exception {
+ String contents = Application.writeSyncCsvFromBeanExample();
+
+ assertThat(contents.split(NEW_LINE))
+ .containsExactly(
+ "'colA','colB','colC'",
+ "'Test1','sample','data'",
+ "'Test2','ipso','facto'"
+ );
}
@Test
- public void readAllExampleTest() {
- testReadCsv(Application.readAllSyncExample());
+ public void givenSampleData_whenWriteCsvLineByLine_thenContentsWritten() throws Exception {
+ String contents = Application.writeLineByLineSyncExample();
+
+ assertThat(contents.split(NEW_LINE))
+ .containsExactly(
+ "\"ColA\",\"ColB\",\"ColC\",\"ColD\"",
+ "\"A\",\"B\",\"A\",\"B\"",
+ "\"BB\",\"AB\",\"AA\",\"B\""
+ );
}
@Test
- public void csvWriterOneByOneTest() {
- testWriteCsv(Application.csvWriterSyncOneByOne());
+ public void givenSampleData_whenWriteCsvAllLines_thenContentsWritten() throws Exception {
+ String contents = Application.writeAllLinesSyncExample();
+
+ assertThat(contents.split(NEW_LINE))
+ .containsExactly(
+ "\"ColA\",\"ColB\",\"ColC\",\"ColD\"",
+ "\"A\",\"B\",\"A\",\"B\"",
+ "\"BB\",\"AB\",\"AA\",\"B\""
+ );
}
- @Test
- public void csvWriterAllTest() {
- testWriteCsv(Application.csvWriterSyncAll());
- }
-
- @After
- public void close() {
- }
}
\ No newline at end of file
diff --git a/libraries-http/src/main/java/com/baeldung/javalin/User/User.java b/libraries-http/src/main/java/com/baeldung/javalin/User/User.java
index 288c027c8b..ac96ece03e 100644
--- a/libraries-http/src/main/java/com/baeldung/javalin/User/User.java
+++ b/libraries-http/src/main/java/com/baeldung/javalin/User/User.java
@@ -1,5 +1,5 @@
package com.baeldung.javalin.User;
-import com.fasterxml.jackson.annotation.JsonProperty;
+
public class User {
public int id;
diff --git a/libraries-http/src/main/java/com/baeldung/javalin/User/UserController.java b/libraries-http/src/main/java/com/baeldung/javalin/User/UserController.java
index 685890c6d7..1b3cc950e8 100644
--- a/libraries-http/src/main/java/com/baeldung/javalin/User/UserController.java
+++ b/libraries-http/src/main/java/com/baeldung/javalin/User/UserController.java
@@ -3,6 +3,7 @@ package com.baeldung.javalin.User;
import io.javalin.Handler;
import java.util.Objects;
+import java.util.Optional;
public class UserController {
public static Handler fetchAllUsernames = ctx -> {
@@ -14,11 +15,11 @@ public class UserController {
public static Handler fetchById = ctx -> {
int id = Integer.parseInt(Objects.requireNonNull(ctx.param("id")));
UserDao dao = UserDao.instance();
- User user = dao.getUserById(id).get();
- if (user == null) {
- ctx.html("Not Found");
- } else {
+ Optional user = dao.getUserById(id);
+ if(user.isPresent()){
ctx.json(user);
+ } else {
+ ctx.html("User Not Found");
}
};
}
diff --git a/lightrun/api-service/pom.xml b/lightrun/api-service/pom.xml
index 3423c490f1..ed9fc2152b 100644
--- a/lightrun/api-service/pom.xml
+++ b/lightrun/api-service/pom.xml
@@ -1,21 +1,21 @@
-
+
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.6.7
-
-
com.baeldung
api-service
0.0.1-SNAPSHOT
api-service
Aggregator Service for LightRun Article
-
- 17
-
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.7
+
+
+
org.springframework.boot
@@ -25,7 +25,6 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
@@ -42,4 +41,8 @@
-
+
+ 17
+
+
+
\ No newline at end of file
diff --git a/lightrun/pom.xml b/lightrun/pom.xml
index 3ce71069a9..4902688748 100644
--- a/lightrun/pom.xml
+++ b/lightrun/pom.xml
@@ -1,17 +1,19 @@
-
+
4.0.0
com.baelduung
lightrun
0.0.1-SNAPSHOT
- pom
lightrun
Services for LightRun Article
+ pom
tasks-service
users-service
api-service
-
+
+
\ No newline at end of file
diff --git a/lightrun/tasks-service/pom.xml b/lightrun/tasks-service/pom.xml
index 441b4d3713..5d4bf8b6d5 100644
--- a/lightrun/tasks-service/pom.xml
+++ b/lightrun/tasks-service/pom.xml
@@ -1,21 +1,21 @@
-
+
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.6.7
-
-
com.baeldung
tasks-service
0.0.1-SNAPSHOT
tasks-service
Tasks Service for LightRun Article
-
- 17
-
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.7
+
+
+
org.springframework.boot
@@ -37,7 +37,6 @@
org.flywaydb
flyway-core
-
com.h2database
h2
@@ -47,7 +46,6 @@
org.apache.activemq
artemis-jms-server
-
org.springframework.boot
spring-boot-starter-test
@@ -64,4 +62,8 @@
-
+
+ 17
+
+
+
\ No newline at end of file
diff --git a/lightrun/users-service/pom.xml b/lightrun/users-service/pom.xml
index 63596ed67b..0be696bbf0 100644
--- a/lightrun/users-service/pom.xml
+++ b/lightrun/users-service/pom.xml
@@ -1,21 +1,21 @@
-
+
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.6.7
-
-
com.baeldung
users-service
0.0.1-SNAPSHOT
users-service
Users Service for LightRun Article
-
- 17
-
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.7
+
+
+
org.springframework.boot
@@ -37,13 +37,11 @@
org.flywaydb
flyway-core
-
com.h2database
h2
runtime
-
org.springframework.boot
spring-boot-starter-test
@@ -60,4 +58,8 @@
-
+
+ 17
+
+
+
\ No newline at end of file
diff --git a/lombok-modules/pom.xml b/lombok-modules/pom.xml
index 905199a13c..d5a0a7fb1f 100644
--- a/lombok-modules/pom.xml
+++ b/lombok-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
lombok-modules
1.0.0-SNAPSHOT
diff --git a/maven-modules/host-maven-repo-example/pom.xml b/maven-modules/host-maven-repo-example/pom.xml
index 20528853cd..d7198d51bb 100644
--- a/maven-modules/host-maven-repo-example/pom.xml
+++ b/maven-modules/host-maven-repo-example/pom.xml
@@ -98,7 +98,7 @@
-
+
Put-repo-owner
Put-repository-name
Put-branch-name
diff --git a/maven-modules/maven-properties/pom.xml b/maven-modules/maven-properties/pom.xml
index 0e9986e3ac..c3061163da 100644
--- a/maven-modules/maven-properties/pom.xml
+++ b/maven-modules/maven-properties/pom.xml
@@ -32,35 +32,35 @@
-
+
org.apache.maven.plugins
maven-resources-plugin
3.2.0
-
-
+
+
-
+
org.apache.maven.plugins
maven-compiler-plugin
-
+
-
+
${project.name}
property-from-pom
-
-
-
+
+
+
UTF-8
UTF-8
diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml
index 99d7b3ed14..253f5d9fa0 100644
--- a/maven-modules/pom.xml
+++ b/maven-modules/pom.xml
@@ -40,7 +40,7 @@
maven-surefire-plugin
maven-parent-pom-resolution
maven-simple
- maven-classifier
+ maven-classifier
diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml
index c7547e1c46..d6109d2ae9 100644
--- a/persistence-modules/core-java-persistence-2/pom.xml
+++ b/persistence-modules/core-java-persistence-2/pom.xml
@@ -1,5 +1,7 @@
-
+
4.0.0
com.baeldung.core-java-persistence-2
core-java-persistence-2
@@ -39,20 +41,16 @@
mssql-jdbc
${mssql.driver.version}
-
-
org.jooq
jooq
3.11.11
-
org.json
json
20220320
-
diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml
index ff18865e5f..2f5da68ede 100644
--- a/persistence-modules/fauna/pom.xml
+++ b/persistence-modules/fauna/pom.xml
@@ -31,7 +31,6 @@
4.2.0
compile
-
org.springframework.boot
spring-boot-starter-test
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/operations/MovieService.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/operations/MovieService.java
new file mode 100644
index 0000000000..eca5807dec
--- /dev/null
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/operations/MovieService.java
@@ -0,0 +1,31 @@
+package com.baeldung.hibernate.operations;
+
+import com.baeldung.hibernate.pojo.Movie;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public class MovieService {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public void saveMovie() {
+ entityManager.getTransaction()
+ .begin();
+
+ Movie movie = new Movie();
+ movie.setId(1L);
+ movie.setMovieName("The Godfather");
+ movie.setReleaseYear(1972);
+ movie.setLanguage("English");
+
+ entityManager.persist(movie);
+ entityManager.getTransaction()
+ .commit();
+ }
+
+ public Movie getMovie(Long movieId) {
+ return entityManager.find(Movie.class, movieId);
+ }
+}
diff --git a/persistence-modules/java-mongodb-3/pom.xml b/persistence-modules/java-mongodb-3/pom.xml
index 6b02172491..d9b299b516 100644
--- a/persistence-modules/java-mongodb-3/pom.xml
+++ b/persistence-modules/java-mongodb-3/pom.xml
@@ -25,4 +25,4 @@
3.12.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/find/FindWithObjectId.java b/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/find/FindWithObjectId.java
new file mode 100644
index 0000000000..4e7dce2d72
--- /dev/null
+++ b/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/find/FindWithObjectId.java
@@ -0,0 +1,80 @@
+package com.baeldung.mongo.find;
+
+import com.mongodb.MongoClient;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
+import com.mongodb.client.MongoDatabase;
+import org.bson.Document;
+import org.bson.types.ObjectId;
+
+import static com.mongodb.client.model.Filters.eq;
+
+public class FindWithObjectId {
+
+ private static final String OBJECT_ID_FIELD = "_id";
+
+ private static MongoClient mongoClient;
+ private static MongoDatabase database;
+ private static MongoCollection collection;
+ private static String collectionName;
+ private static String databaseName;
+
+ public static void setUp() {
+ if (mongoClient == null) {
+ mongoClient = new MongoClient("localhost", 27017);
+
+ databaseName = "baeldung";
+ collectionName = "vehicle";
+
+ database = mongoClient.getDatabase(databaseName);
+ collection = database.getCollection(collectionName);
+ }
+ }
+
+ public static void retrieveAllDocumentsUsingFindWithObjectId() {
+ Document document = collection.find()
+ .first();
+ System.out.println(document);
+
+ FindIterable documents = collection.find(eq(OBJECT_ID_FIELD, document.get(OBJECT_ID_FIELD)));
+
+ MongoCursor cursor = documents.iterator();
+ while (cursor.hasNext()) {
+ System.out.println(cursor.next());
+ }
+ }
+
+ public static void retrieveFirstDocumentWithObjectId() {
+ Document document = collection.find()
+ .first();
+ System.out.println(document);
+
+ FindIterable documents = collection.find(eq(OBJECT_ID_FIELD, document.get(OBJECT_ID_FIELD)));
+ Document queriedDocument = documents.first();
+
+ System.out.println(queriedDocument);
+ }
+
+ public static void retrieveDocumentWithRandomObjectId() {
+ FindIterable documents = collection.find(eq(OBJECT_ID_FIELD, new ObjectId()));
+ Document queriedDocument = documents.first();
+
+ if (queriedDocument != null) {
+ System.out.println(queriedDocument);
+ } else {
+ System.out.println("No documents found");
+ }
+ }
+
+ public static void main(String args[]) {
+
+ setUp();
+
+ retrieveAllDocumentsUsingFindWithObjectId();
+
+ retrieveFirstDocumentWithObjectId();
+
+ retrieveDocumentWithRandomObjectId();
+ }
+}
diff --git a/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/find/FindWithObjectIdLiveTest.java b/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/find/FindWithObjectIdLiveTest.java
new file mode 100644
index 0000000000..b8a34c809b
--- /dev/null
+++ b/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/find/FindWithObjectIdLiveTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.mongo.find;
+
+import com.mongodb.MongoClient;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
+import com.mongodb.client.MongoDatabase;
+import org.bson.Document;
+import org.bson.types.ObjectId;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import static com.mongodb.client.model.Filters.eq;
+import static org.junit.Assert.*;
+
+public class FindWithObjectIdLiveTest {
+
+ private static final String OBJECT_ID_FIELD = "_id";
+
+ private static MongoClient mongoClient;
+ private static MongoDatabase database;
+ private static MongoCollection collection;
+ private static final String DATASET_JSON = "/vehicle.json";
+
+ @BeforeClass
+ public static void setUp() throws IOException {
+ if (mongoClient == null) {
+ mongoClient = new MongoClient("localhost", 27017);
+
+ database = mongoClient.getDatabase("baeldung");
+ collection = database.getCollection("vehicle");
+
+ collection.drop();
+
+ InputStream is = FindOperationLiveTest.class.getResourceAsStream(DATASET_JSON);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ reader.lines()
+ .forEach(line -> collection.insertOne(Document.parse(line)));
+ reader.close();
+ }
+ }
+
+ @Test
+ public void givenVehicleCollection_whenFetchingDocumentsUsingObjectId_thenCheckingForDocuments() {
+ Document vehicle = collection.find()
+ .first();
+ ObjectId objectId = (ObjectId) vehicle.get(OBJECT_ID_FIELD);
+
+ FindIterable documents = collection.find(eq(OBJECT_ID_FIELD, objectId));
+ MongoCursor cursor = documents.iterator();
+
+ assertNotNull(cursor);
+ assertTrue(cursor.hasNext());
+ }
+
+ @Test
+ public void givenVehicleCollection_whenFetchingFirstDocumentUsingObjectId_thenCheckingForDocument() {
+ Document vehicle = collection.find()
+ .first();
+ ObjectId objectId = (ObjectId) vehicle.get(OBJECT_ID_FIELD);
+
+ Document queriedVehicle = collection.find(eq(OBJECT_ID_FIELD, objectId))
+ .first();
+
+ assertNotNull(queriedVehicle);
+ assertEquals(vehicle.get(OBJECT_ID_FIELD), queriedVehicle.get(OBJECT_ID_FIELD));
+ }
+
+ @Test
+ public void givenVehicleCollection_whenFetchingUsingRandomObjectId_thenCheckingForDocument() {
+ Document vehicle = collection.find(eq(OBJECT_ID_FIELD, new ObjectId()))
+ .first();
+
+ assertNull(vehicle);
+ }
+
+ @AfterClass
+ public static void cleanUp() {
+ mongoClient.close();
+ }
+}
diff --git a/persistence-modules/java-mongodb-3/src/test/resources/vehicle.json b/persistence-modules/java-mongodb-3/src/test/resources/vehicle.json
new file mode 100644
index 0000000000..567aba647f
--- /dev/null
+++ b/persistence-modules/java-mongodb-3/src/test/resources/vehicle.json
@@ -0,0 +1,3 @@
+{"companyName":"Skoda","modelName":"Octavia","launchYear":2016,"type":"Sports","registeredNo":"SKO 1134"}
+{"companyName":"BMW","modelName":"X5","launchYear":2020,"type":"SUV","registeredNo":"BMW 3325"}
+{"companyName":"Mercedes","modelName":"Maybach","launchYear":2021,"type":"Luxury","registeredNo":"MER 9754"}
\ No newline at end of file
diff --git a/persistence-modules/java-mongodb-queries/README.md b/persistence-modules/java-mongodb-queries/README.md
new file mode 100644
index 0000000000..30649b0db1
--- /dev/null
+++ b/persistence-modules/java-mongodb-queries/README.md
@@ -0,0 +1,3 @@
+
+### Relevant Articles:
+- [Using Dates in CRUD Operations in MongoDB](https://www.baeldung.com/mongodb-java-date-operations)
diff --git a/persistence-modules/java-mongodb-queries/pom.xml b/persistence-modules/java-mongodb-queries/pom.xml
new file mode 100644
index 0000000000..aa3003bef6
--- /dev/null
+++ b/persistence-modules/java-mongodb-queries/pom.xml
@@ -0,0 +1,34 @@
+
+
+ 4.0.0
+ java-mongodb-queries
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../pom.xml
+
+
+
+
+ org.mongodb
+ mongodb-driver-sync
+ 4.6.0
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.8.1
+ compile
+
+
+
+
+ 8
+ 8
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/java-mongodb-queries/src/main/java/com/baeldung/mongo/crud/CrudClient.java b/persistence-modules/java-mongodb-queries/src/main/java/com/baeldung/mongo/crud/CrudClient.java
new file mode 100644
index 0000000000..b71b88406d
--- /dev/null
+++ b/persistence-modules/java-mongodb-queries/src/main/java/com/baeldung/mongo/crud/CrudClient.java
@@ -0,0 +1,183 @@
+package com.baeldung.mongo.crud;
+
+import com.baeldung.mongo.crud.model.Event;
+import com.mongodb.BasicDBObject;
+import com.mongodb.BasicDBObjectBuilder;
+import com.mongodb.MongoException;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.model.UpdateOptions;
+import com.mongodb.client.model.Updates;
+import com.mongodb.client.result.InsertOneResult;
+import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.UpdateResult;
+import org.bson.BsonValue;
+import org.bson.Document;
+import org.bson.codecs.configuration.CodecProvider;
+import org.bson.codecs.configuration.CodecRegistry;
+import org.bson.codecs.pojo.PojoCodecProvider;
+import org.bson.conversions.Bson;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.MongoClientSettings.getDefaultCodecRegistry;
+import static com.mongodb.client.model.Filters.gte;
+import static com.mongodb.client.model.Filters.lt;
+import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
+import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
+
+public class CrudClient {
+
+ private static String uri = "mongodb://localhost:27017";
+ private static MongoClient mongoClient = MongoClients.create(uri);
+ private static MongoDatabase db;
+ private static MongoCollection collection;
+
+ public static OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.of(2022, 6, 4, 11, 0, 0),
+ ZoneOffset.ofHours(2));
+
+ public static Event pianoLessons = new Event(
+ "Piano lessons",
+ "Foo Bvld",
+ LocalDateTime.of(2022, 6, 4, 11, 0, 0));
+
+ public static Event soccerGame = new Event(
+ "Soccer game",
+ "Bar Avenue",
+ LocalDateTime.of(2022, 6, 10, 17, 0, 0));
+
+ public static Event pianoLessonsTZ = new Event(
+ "Piano lessons",
+ "Baz Bvld",
+ LocalDateTime.of(2022, 12, 31, 12, 0, 0),
+ ZoneOffset.ofHours(2).toString());
+
+ public static LocalDateTime dateQuery = LocalDateTime.of(2022, 6, 10, 17, 0, 0);
+ public static LocalDateTime dateQueryEventWithTZ = LocalDateTime.of(2022, 12, 31, 12, 0, 0);
+
+ public static LocalDateTime from = LocalDateTime.of(2022, 06, 04, 12, 0, 0);
+ public static LocalDateTime to = LocalDateTime.of(2022, 06, 10, 17, 0, 0);
+
+ public static LocalDate updateManyFrom = LocalDate.of(2022, 1, 1);
+ public static LocalDate updateManyTo = LocalDate.of(2023, 1, 1);
+
+ public static LocalDate deleteFrom = LocalDate.of(2022, 1, 1);
+ public static LocalDate deleteTo = LocalDate.of(2023, 01, 01);
+
+ public static void setup() {
+ CodecProvider codecProvider = PojoCodecProvider.builder().automatic(true).build();
+ CodecRegistry codecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(codecProvider));
+
+ db = mongoClient.getDatabase("calendar").withCodecRegistry(codecRegistry);
+ collection = db.getCollection("my_events", Event.class);
+ }
+
+ public static void close() {
+ mongoClient.close();
+ }
+
+ public static BsonValue insertEventsWithDate(Event e) {
+ try {
+ InsertOneResult insertResult = collection.insertOne(e);
+ return insertResult.getInsertedId();
+ } catch (MongoException me) {
+ System.err.println("Failed to insert with error: " + me);
+ throw me;
+ }
+ }
+
+ public static Event readEventsByDate(LocalDateTime localDateTime) {
+ try {
+ Event event = collection
+ .find(eq("dateTime", localDateTime))
+ .first();
+ return event;
+ } catch (MongoException me) {
+ System.err.println("Failed to read with error: " + me);
+ throw me;
+ }
+ }
+
+ public static List readEventsByDateRange(LocalDateTime from, LocalDateTime to) {
+ BasicDBObject object = new BasicDBObject();
+ object.put("dateTime", BasicDBObjectBuilder
+ .start("$gte", from)
+ .add("$lte", to)
+ .get());
+ try {
+ List list = new ArrayList(collection.find(object).into(new ArrayList()));
+ return list;
+ } catch (MongoException me) {
+ System.err.println("Failed to read with error: " + me);
+ throw me;
+ }
+ }
+
+ public static LocalDateTime readEventsByDateWithTZ(LocalDateTime localDateTime) {
+ try {
+ Event event = collection
+ .find(eq("dateTime", localDateTime))
+ .first();
+ OffsetDateTime offsetDateTime = OffsetDateTime.of(event.dateTime, ZoneOffset.of(pianoLessonsTZ.timeZoneOffset));
+ ZonedDateTime zoned = offsetDateTime.atZoneSameInstant(ZoneId.of("America/Toronto"));
+ return zoned.toLocalDateTime();
+ } catch (MongoException me) {
+ System.err.println("Failed to read with error: " + me);
+ throw me;
+ }
+ }
+
+ public static long updateDateField() {
+ Document document = new Document().append("title", "Piano lessons");
+ Bson update = Updates.currentDate("updatedAt");
+ UpdateOptions options = new UpdateOptions().upsert(false);
+ try {
+ UpdateResult result = collection.updateOne(document, update, options);
+ return result.getModifiedCount();
+ } catch (MongoException me) {
+ System.err.println("Failed to update with error: " + me);
+ throw me;
+ }
+ }
+
+ public static long updateManyEventsWithDateCriteria(LocalDate updateManyFrom, LocalDate updateManyTo) {
+ Bson query = and(gte("dateTime", updateManyFrom), lt("dateTime", updateManyTo));
+ Bson updates = Updates.currentDate("dateTime");
+ try {
+ UpdateResult result = collection.updateMany(query, updates);
+ return result.getModifiedCount();
+ } catch(MongoException me) {
+ System.err.println("Failed to replace/update with error: " + me);
+ throw me;
+ }
+ }
+
+ public static long deleteEventsByDate(LocalDate from, LocalDate to) {
+ Bson query = and(gte("dateTime", from), lt("dateTime", to));
+ try {
+ DeleteResult result = collection.deleteMany(query);
+ return result.getDeletedCount();
+ } catch (MongoException me) {
+ System.err.println("Failed to delete with error: " + me);
+ throw me;
+ }
+ }
+
+ public static void dropDb() {
+ db.drop();
+ }
+
+ public static void main(String[] args) {
+ }
+}
diff --git a/persistence-modules/java-mongodb-queries/src/main/java/com/baeldung/mongo/crud/model/Event.java b/persistence-modules/java-mongodb-queries/src/main/java/com/baeldung/mongo/crud/model/Event.java
new file mode 100644
index 0000000000..751dc5d6eb
--- /dev/null
+++ b/persistence-modules/java-mongodb-queries/src/main/java/com/baeldung/mongo/crud/model/Event.java
@@ -0,0 +1,28 @@
+package com.baeldung.mongo.crud.model;
+
+import java.time.LocalDateTime;
+
+public class Event {
+ public String title;
+ public String location;
+ public LocalDateTime dateTime;
+ public String timeZoneOffset;
+
+ public Event() {}
+ public Event(String title, String location, LocalDateTime dateTime) {
+ this.title = title;
+ this.location = location;
+ this.dateTime = dateTime;
+ }
+
+ public Event(String title, String location, LocalDateTime dateTime, String timeZoneOffset) {
+ this.title = title;
+ this.location = location;
+ this.dateTime = dateTime;
+ this.timeZoneOffset = timeZoneOffset;
+ }
+
+ @Override
+ public String toString() { return "\nEvent: " + title + "\nWhere: " + location + "\nWhen: " + dateTime; }
+}
+
diff --git a/persistence-modules/java-mongodb-queries/src/test/java/com/baeldung/mongo/crud/CrudClientLiveTest.java b/persistence-modules/java-mongodb-queries/src/test/java/com/baeldung/mongo/crud/CrudClientLiveTest.java
new file mode 100644
index 0000000000..5b5004fd9f
--- /dev/null
+++ b/persistence-modules/java-mongodb-queries/src/test/java/com/baeldung/mongo/crud/CrudClientLiveTest.java
@@ -0,0 +1,95 @@
+package com.baeldung.mongo.crud;
+
+import com.baeldung.mongo.crud.model.Event;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+
+import java.io.IOException;
+import java.util.List;
+
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class CrudClientLiveTest {
+
+ @BeforeAll
+ public static void setup() {
+ CrudClient.setup();
+ }
+
+ @Test
+ @Order(1)
+ public void whenInsertingEventsWithDate_thenCheckForDocument() {
+ Assertions.assertNotNull(CrudClient.insertEventsWithDate(CrudClient.pianoLessons));
+ Assertions.assertNotNull(CrudClient.insertEventsWithDate(CrudClient.soccerGame));
+ }
+
+ @Test
+ @Order(2)
+ public void whenReadingEventsByDate_thenCheckForReturnedDocument() {
+ Assertions.assertNotNull(CrudClient.readEventsByDate(CrudClient.dateQuery));
+ Event event = CrudClient.readEventsByDate(CrudClient.dateQuery);
+ Assertions.assertNotNull(event);
+ Assertions.assertEquals("Soccer game", event.title);
+ Assertions.assertEquals("Bar Avenue", event.location);
+ Assertions.assertEquals(CrudClient.soccerGame.dateTime, event.dateTime);
+ }
+
+ @Test
+ @Order(3)
+ public void whenReadingEventsByDateRange_thenCheckForReturnedDocument() {
+ List events = CrudClient.readEventsByDateRange(CrudClient.from, CrudClient.to);
+ Assertions.assertNotNull(events);
+ Assertions.assertEquals(1, events.size());
+ Assertions.assertEquals("Soccer game", events.get(0).title);
+ Assertions.assertEquals("Bar Avenue", events.get(0).location);
+ Assertions.assertEquals(CrudClient.soccerGame.dateTime, events.get(0).dateTime);
+ }
+
+ @Test
+ @Order(5)
+ public void whenUpdatingEventsDateField_thenCheckUpdatedCount() {
+ Assertions.assertEquals(1, CrudClient.updateDateField());
+ }
+
+ @Test
+ @Order(6)
+ public void whenUpdatingManyEvents_thenCheckUpdatedCount() {
+ long updates = CrudClient.updateManyEventsWithDateCriteria(CrudClient.updateManyFrom, CrudClient.updateManyTo);
+ Assertions.assertTrue(1 < updates);
+ }
+
+ @Test
+ @Order(7)
+ public void whenDeletingEventsWithDate_thenCheckDeletedCount() {
+ Assertions.assertEquals(2, CrudClient.deleteEventsByDate(CrudClient.deleteFrom, CrudClient.deleteTo));
+ }
+
+ @Test
+ @Order(8)
+ public void whenInsertingEventWithDateAndTimeZone_thenCheckForDocument() {
+ Assertions.assertNotNull(CrudClient.insertEventsWithDate(CrudClient.pianoLessonsTZ));
+ }
+
+ @Test
+ @Order(9)
+ public void whenReadingEventsWithDateAndTimeZone_thenCheckInsertedCount() {
+ Assertions.assertNotEquals(CrudClient.pianoLessonsTZ.dateTime, CrudClient.readEventsByDateWithTZ(CrudClient.dateQueryEventWithTZ));
+ }
+
+ @Test
+ @Order(10)
+ public void whenDeletingEventsWithDateAndTimeZone_thenCheckDeletedCount() {
+ Assertions.assertEquals(1, CrudClient.deleteEventsByDate(CrudClient.deleteFrom, CrudClient.deleteTo));
+ }
+
+ @AfterAll
+ public static void close() throws IOException {
+ CrudClient.dropDb();
+ CrudClient.close();
+ }
+
+}
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 4bab0631bd..ee4807933a 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -45,6 +45,7 @@
java-mongodb
java-mongodb-2
java-mongodb-3
+ java-mongodb-queries
jnosql
jooq
jpa-hibernate-cascade-type
diff --git a/persistence-modules/read-only-transactions/pom.xml b/persistence-modules/read-only-transactions/pom.xml
index d3822f8e58..39621bfe26 100644
--- a/persistence-modules/read-only-transactions/pom.xml
+++ b/persistence-modules/read-only-transactions/pom.xml
@@ -1,8 +1,7 @@
-
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
read-only-transactions
0.0.1-SNAPSHOT
@@ -15,7 +14,6 @@
-
org.springframework.boot
spring-boot-starter-data-jpa
@@ -27,56 +25,47 @@
-
org.springframework.boot
spring-boot-starter-test
${spring-boot.version}
test
-
org.springframework
spring-test
${spring-test.version}
test
-
mysql
mysql-connector-java
${mysql.version}
-
org.hibernate
hibernate-core
${hibernate.version}
-
com.zaxxer
HikariCP
${hikari.version}
-
org.junit.jupiter
junit-jupiter-engine
${junit-jupiter.version}
test
-
com.h2database
h2
${h2.version}
runtime
-
-
8.0.21
4.0.3
@@ -86,4 +75,5 @@
5.8.2
1.4.200
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml
index a172c28a80..a745d4efc4 100644
--- a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml
@@ -16,7 +16,7 @@
-
+
org.springframework.boot
spring-boot-starter-web
@@ -36,4 +36,4 @@
3.2.6
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb-2/pom.xml b/persistence-modules/spring-data-mongodb-2/pom.xml
index 35353edfe3..6722e9fb41 100644
--- a/persistence-modules/spring-data-mongodb-2/pom.xml
+++ b/persistence-modules/spring-data-mongodb-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-data-mongodb-2
spring-data-mongodb-2
diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/event/UuidIdentifiedEntityEventListener.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/event/UuidIdentifiedEntityEventListener.java
new file mode 100644
index 0000000000..ce45d1e7bb
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/event/UuidIdentifiedEntityEventListener.java
@@ -0,0 +1,23 @@
+package com.baeldung.uuid.event;
+
+import java.util.UUID;
+
+import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
+import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
+
+import com.baeldung.uuid.model.UuidIdentifiedEntity;
+
+
+public class UuidIdentifiedEntityEventListener extends AbstractMongoEventListener {
+
+ @Override
+ public void onBeforeConvert(BeforeConvertEvent event) {
+
+ super.onBeforeConvert(event);
+ UuidIdentifiedEntity entity = event.getSource();
+
+ if(entity.getId() == null) {
+ entity.setId(UUID.randomUUID());
+ }
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/model/Book.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/model/Book.java
new file mode 100644
index 0000000000..f6aa1c615e
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/model/Book.java
@@ -0,0 +1,26 @@
+package com.baeldung.uuid.model;
+
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document
+public class Book extends UuidIdentifiedEntity {
+
+ private String title;
+ private String author;
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/model/UuidIdentifiedEntity.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/model/UuidIdentifiedEntity.java
new file mode 100644
index 0000000000..aee0368b46
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/model/UuidIdentifiedEntity.java
@@ -0,0 +1,25 @@
+package com.baeldung.uuid.model;
+
+import java.util.UUID;
+
+import org.springframework.data.annotation.Id;
+
+public abstract class UuidIdentifiedEntity {
+
+ @Id
+ protected UUID id;
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+
+ if(this.id != null) {
+
+ throw new UnsupportedOperationException("ID is already defined");
+ }
+
+ this.id = id;
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/BookRepository.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/BookRepository.java
new file mode 100644
index 0000000000..0d6eb790aa
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/BookRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.uuid.repository;
+
+import java.util.UUID;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+import com.baeldung.uuid.model.Book;
+
+public interface BookRepository extends MongoRepository {
+
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/CustomMongoRepository.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/CustomMongoRepository.java
new file mode 100644
index 0000000000..599bc9ef61
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/CustomMongoRepository.java
@@ -0,0 +1,14 @@
+package com.baeldung.uuid.repository;
+
+import java.util.UUID;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import com.baeldung.uuid.model.UuidIdentifiedEntity;
+
+
+@NoRepositoryBean
+public interface CustomMongoRepository extends MongoRepository {
+
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/impl/CustomMongoRepositoryImpl.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/impl/CustomMongoRepositoryImpl.java
new file mode 100644
index 0000000000..9764d0b06e
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/uuid/repository/impl/CustomMongoRepositoryImpl.java
@@ -0,0 +1,52 @@
+package com.baeldung.uuid.repository.impl;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
+import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
+
+import com.baeldung.uuid.model.UuidIdentifiedEntity;
+import com.baeldung.uuid.repository.CustomMongoRepository;
+
+
+public class CustomMongoRepositoryImpl extends SimpleMongoRepository implements CustomMongoRepository {
+
+ public CustomMongoRepositoryImpl(MongoEntityInformation metadata, MongoOperations mongoOperations) {
+
+ super(metadata, mongoOperations);
+ }
+
+ @Override
+ public S save(S entity) {
+ generateId(entity);
+ return super.save(entity);
+ }
+
+ @Override
+ public List saveAll(Iterable entities) {
+ entities.forEach(entity -> generateId(entity));
+ return super.saveAll(entities);
+ }
+
+ @Override
+ public S insert(S entity) {
+ generateId(entity);
+ return super.insert(entity);
+ }
+
+ @Override
+ public List insert(Iterable entities) {
+ entities.forEach(entity -> generateId(entity));
+ return super.insert(entities);
+ }
+
+ protected void generateId(S entity) {
+
+ if(entity != null && entity.getId() == null) {
+ entity.setId(UUID.randomUUID());
+ }
+ }
+
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/CustomRepositoryLiveTest.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/CustomRepositoryLiveTest.java
new file mode 100644
index 0000000000..0fc3fddfd7
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/CustomRepositoryLiveTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.uuid;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.After;
+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.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.uuid.config.CustomRepositoryMongoConfig;
+import com.baeldung.uuid.model.Book;
+import com.baeldung.uuid.repository.BookRepository;
+
+/**
+ *
+ * This test requires:
+ * * mongodb instance running on the environment
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = CustomRepositoryMongoConfig.class)
+public class CustomRepositoryLiveTest {
+
+ @Autowired
+ private BookRepository bookRepository;
+
+ @Autowired
+ private MongoOperations mongoOps;
+
+ @Before
+ public void testSetup() {
+ if (!mongoOps.collectionExists(Book.class)) {
+ mongoOps.createCollection(Book.class);
+ }
+ }
+
+ @After
+ public void tearDown() {
+ mongoOps.dropCollection(Book.class);
+ }
+
+ @Test
+ public void whenInsertingBook_thenBookIsInserted() {
+ final Book book = new Book();
+ book.setTitle("The Lord of the Rings");
+ book.setAuthor("JRR Tolkien");
+ Book savedBook = bookRepository.save(book);
+
+ Book result = mongoOps.findOne(Query.query(Criteria.where("_id").is(savedBook.getId())), Book.class);
+
+ assertEquals(result.getTitle(), "The Lord of the Rings");
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/EntityCallbackLiveTest.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/EntityCallbackLiveTest.java
new file mode 100644
index 0000000000..737c2d8adb
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/EntityCallbackLiveTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.uuid;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.After;
+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.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.uuid.config.EntityCallbackMongoConfig;
+import com.baeldung.uuid.model.Book;
+import com.baeldung.uuid.repository.BookRepository;
+
+/**
+ *
+ * This test requires:
+ * * mongodb instance running on the environment
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = EntityCallbackMongoConfig.class)
+public class EntityCallbackLiveTest {
+
+ @Autowired
+ private BookRepository bookRepository;
+
+ @Autowired
+ private MongoOperations mongoOps;
+
+ @Before
+ public void testSetup() {
+ if (!mongoOps.collectionExists(Book.class)) {
+ mongoOps.createCollection(Book.class);
+ }
+ }
+
+ @After
+ public void tearDown() {
+ mongoOps.dropCollection(Book.class);
+ }
+
+ @Test
+ public void whenSavingArticle_thenArticleIsInserted() {
+ final Book book = new Book();
+ book.setTitle("The Lord of the Rings");
+ book.setAuthor("JRR Tolkien");
+
+ Book savedArticle = bookRepository.save(book);
+
+ Book result = mongoOps.findOne(Query.query(Criteria.where("_id").is(savedArticle.getId())), Book.class);
+
+ assertNotNull(result);
+ assertEquals(result.getTitle(), "The Lord of the Rings");
+ }
+
+
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/EventLiveTest.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/EventLiveTest.java
new file mode 100644
index 0000000000..2c6bc72da6
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/EventLiveTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.uuid;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.After;
+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.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.uuid.config.EventMongoConfig;
+import com.baeldung.uuid.model.Book;
+import com.baeldung.uuid.repository.BookRepository;
+
+/**
+ *
+ * This test requires:
+ * * mongodb instance running on the environment
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = EventMongoConfig.class)
+public class EventLiveTest {
+
+ @Autowired
+ private BookRepository bookRepository;
+
+ @Autowired
+ private MongoOperations mongoOps;
+
+ @Before
+ public void testSetup() {
+ if (!mongoOps.collectionExists(Book.class)) {
+ mongoOps.createCollection(Book.class);
+ }
+ }
+
+ @After
+ public void tearDown() {
+ mongoOps.dropCollection(Book.class);
+ }
+
+ @Test
+ public void whenSavingArticle_thenArticleIsInserted() {
+ final Book book = new Book();
+ book.setTitle("The Lord of the Rings");
+ book.setAuthor("JRR Tolkien");
+
+ Book savedArticle = bookRepository.save(book);
+
+ Book result = mongoOps.findOne(Query.query(Criteria.where("_id").is(savedArticle.getId())), Book.class);
+
+ assertNotNull(result);
+ assertEquals(result.getTitle(), "The Lord of the Rings");
+ }
+
+
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/CustomRepositoryMongoConfig.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/CustomRepositoryMongoConfig.java
new file mode 100644
index 0000000000..833a407ae2
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/CustomRepositoryMongoConfig.java
@@ -0,0 +1,32 @@
+package com.baeldung.uuid.config;
+
+import org.bson.UuidRepresentation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+import com.baeldung.uuid.repository.impl.CustomMongoRepositoryImpl;
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+
+@Configuration
+@EnableMongoRepositories(basePackages = "com.baeldung.uuid.repository", repositoryBaseClass = CustomMongoRepositoryImpl.class)
+public class CustomRepositoryMongoConfig {
+
+ @Bean
+ public MongoClient mongo() throws Exception {
+ final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
+ final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
+ .uuidRepresentation(UuidRepresentation.STANDARD)
+ .applyConnectionString(connectionString).build();
+ return MongoClients.create(mongoClientSettings);
+ }
+
+ @Bean
+ public MongoTemplate mongoTemplate() throws Exception {
+ return new MongoTemplate(mongo(), "test");
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/EntityCallbackMongoConfig.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/EntityCallbackMongoConfig.java
new file mode 100644
index 0000000000..baf69dd5e8
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/EntityCallbackMongoConfig.java
@@ -0,0 +1,48 @@
+package com.baeldung.uuid.config;
+
+import java.util.UUID;
+
+import org.bson.UuidRepresentation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+import com.baeldung.uuid.model.UuidIdentifiedEntity;
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+
+@Configuration
+@EnableMongoRepositories(basePackages = "com.baeldung.uuid.repository")
+public class EntityCallbackMongoConfig {
+
+ @Bean
+ public MongoClient mongo() throws Exception {
+ final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
+ final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
+ .uuidRepresentation(UuidRepresentation.STANDARD)
+ .applyConnectionString(connectionString).build();
+ return MongoClients.create(mongoClientSettings);
+ }
+
+ @Bean
+ public MongoTemplate mongoTemplate() throws Exception {
+ return new MongoTemplate(mongo(), "test");
+ }
+
+ @Bean
+ public BeforeConvertCallback beforeSaveCallback() {
+
+ return (entity, collection) -> {
+
+ if(entity.getId() == null) {
+ entity.setId(UUID.randomUUID());
+ }
+ return entity;
+ };
+ }
+
+}
diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/EventMongoConfig.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/EventMongoConfig.java
new file mode 100644
index 0000000000..d26281dd4a
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/uuid/config/EventMongoConfig.java
@@ -0,0 +1,38 @@
+package com.baeldung.uuid.config;
+
+import org.bson.UuidRepresentation;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+import com.baeldung.uuid.event.UuidIdentifiedEntityEventListener;
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+
+@Configuration
+@EnableMongoRepositories(basePackages = "com.baeldung.uuid.repository")
+public class EventMongoConfig {
+
+ @Bean
+ public MongoClient mongo() throws Exception {
+ final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
+ final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
+ .uuidRepresentation(UuidRepresentation.STANDARD)
+ .applyConnectionString(connectionString).build();
+ return MongoClients.create(mongoClientSettings);
+ }
+
+ @Bean
+ public MongoTemplate mongoTemplate() throws Exception {
+ return new MongoTemplate(mongo(), "test");
+ }
+
+ @Bean
+ public UuidIdentifiedEntityEventListener uuidIdentifiedEntityEventListener() {
+
+ return new UuidIdentifiedEntityEventListener();
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md
index acc978c68e..be2071440b 100644
--- a/persistence-modules/spring-data-mongodb/README.md
+++ b/persistence-modules/spring-data-mongodb/README.md
@@ -11,6 +11,7 @@
- [Spring Data MongoDB: Projections and Aggregations](http://www.baeldung.com/spring-data-mongodb-projections-aggregations)
- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
- [Spring Data MongoDB Transactions](https://www.baeldung.com/spring-data-mongodb-transactions)
+- [UUID as Entity ID in MongoDB](https://www.baeldung.com/java-mongodb-uuid)
## Spring Data MongoDB Live Testing
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/Person.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/Person.java
new file mode 100644
index 0000000000..90347859eb
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/Person.java
@@ -0,0 +1,31 @@
+package com.baeldung.serializeentityid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Person {
+
+ /**
+ * This doesn't work without a projection
+ */
+ //@JsonProperty
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String name;
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+}
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonController.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonController.java
new file mode 100644
index 0000000000..890e0318e8
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonController.java
@@ -0,0 +1,27 @@
+package com.baeldung.serializeentityid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.rest.webmvc.RepositoryRestController;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@RepositoryRestController
+public class PersonController {
+
+ @Autowired
+ PersonRepository repository;
+
+ @GetMapping("/persons")
+ ResponseEntity> persons(PagedResourcesAssembler resourcesAssembler) {
+ Page persons = this.repository.findAll(Pageable.ofSize(20));
+ Page personDtos = persons.map(PersonDto::new);
+ PagedModel> pagedModel = resourcesAssembler.toModel(personDtos);
+ return ResponseEntity.ok(pagedModel);
+ }
+
+}
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonDto.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonDto.java
new file mode 100644
index 0000000000..80751cbd6b
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonDto.java
@@ -0,0 +1,21 @@
+package com.baeldung.serializeentityid;
+
+public class PersonDto {
+
+ private final Long id;
+
+ private final String name;
+
+ public PersonDto(Person person) {
+ this.id = person.getId();
+ this.name = person.getName();
+ }
+
+ public Long getId() {
+ return this.id;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+}
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonRepository.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonRepository.java
new file mode 100644
index 0000000000..36c81de2c2
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.serializeentityid;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface PersonRepository extends JpaRepository {
+
+}
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonView.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonView.java
new file mode 100644
index 0000000000..f66e765406
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/PersonView.java
@@ -0,0 +1,15 @@
+package com.baeldung.serializeentityid;
+
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import org.springframework.data.rest.core.config.Projection;
+
+@JsonPropertyOrder({ "id", "name" })
+@Projection(name = "person-view", types = Person.class)
+public interface PersonView {
+
+ Long getId();
+
+ String getName();
+
+}
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/RestConfiguration.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/RestConfiguration.java
new file mode 100644
index 0000000000..dbad6565fc
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/RestConfiguration.java
@@ -0,0 +1,27 @@
+package com.baeldung.serializeentityid;
+
+import javax.persistence.EntityManager;
+import javax.persistence.metamodel.Type;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+
+@Configuration
+public class RestConfiguration implements RepositoryRestConfigurer {
+
+ @Autowired
+ private EntityManager entityManager;
+
+ @Override
+ public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
+ final Class>[] classes = this.entityManager.getMetamodel()
+ .getEntities()
+ .stream()
+ .map(Type::getJavaType)
+ .toArray(Class[]::new);
+ config.exposeIdsFor(classes);
+ }
+}
diff --git a/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/SerializeEntityIdApp.java b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/SerializeEntityIdApp.java
new file mode 100644
index 0000000000..7af12f20b2
--- /dev/null
+++ b/persistence-modules/spring-data-rest-2/src/main/java/com/baeldung/serializeentityid/SerializeEntityIdApp.java
@@ -0,0 +1,32 @@
+package com.baeldung.serializeentityid;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SerializeEntityIdApp {
+
+ private final PersonRepository repository;
+
+ public SerializeEntityIdApp(PersonRepository repository) {
+ this.repository = repository;
+ }
+
+ @PostConstruct
+ void onStart() {
+ final Person person1 = new Person();
+ person1.setName("John Doe");
+ final Person person2 = new Person();
+ person2.setName("Markus Boe");
+
+ this.repository.save(person1);
+ this.repository.save(person2);
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(SerializeEntityIdApp.class, args);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 0801fbab46..6f727d0dd0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
- parent-modules
+ parent-modules
pom
@@ -259,7 +259,7 @@
-
+
@@ -278,7 +278,7 @@
-
+
@@ -397,9 +397,7 @@
geotools
google-cloud
google-web-toolkit
-
-
-
+
graphql-modules
grpc
@@ -505,7 +503,7 @@
protobuffer
quarkus-modules
-
+
rabbitmq
ratpack
@@ -621,7 +619,6 @@
spring-katharsis
spring-mobile
- spring-mockito
spring-native
spring-protobuf
spring-quartz
@@ -831,9 +828,7 @@
geotools
google-cloud
google-web-toolkit
-
-
-
+
graphql-modules
grpc
@@ -1050,7 +1045,6 @@
spring-katharsis
spring-mobile
- spring-mockito
spring-native
spring-protobuf
spring-quartz
@@ -1246,6 +1240,7 @@
core-java-modules/core-java-networking-3
core-java-modules/core-java-strings
core-java-modules/core-java-httpclient
+ spring-core-6
ddd-contexts
docker-modules
apache-httpclient-2
@@ -1328,6 +1323,7 @@
testing-modules/testing-assertions
persistence-modules/fauna
lightrun
+ spring-core-6
@@ -1362,7 +1358,7 @@
1.7.32
- 1.2.6
+ 1.2.7
2.22.2
@@ -1398,6 +1394,7 @@
1.18.20
1.4.200
31.0.1-jre
+ 3.2.2
-
+
\ No newline at end of file
diff --git a/quarkus-modules/pom.xml b/quarkus-modules/pom.xml
index 86e2132035..94fe1ae10f 100644
--- a/quarkus-modules/pom.xml
+++ b/quarkus-modules/pom.xml
@@ -16,10 +16,7 @@
quarkus
quarkus-extension
-
+
-
+
\ No newline at end of file
diff --git a/resteasy/pom.xml b/resteasy/pom.xml
index a8c1f2815c..b12576e583 100644
--- a/resteasy/pom.xml
+++ b/resteasy/pom.xml
@@ -42,7 +42,6 @@
javax.servlet-api
4.0.1
-
diff --git a/rule-engines/jess/pom.xml b/rule-engines/jess/pom.xml
index be26d54a1e..e1c844c452 100644
--- a/rule-engines/jess/pom.xml
+++ b/rule-engines/jess/pom.xml
@@ -14,12 +14,8 @@
1.1
+ local m2, compile errors with this project would go away then gov.sandia
+ jess 7.1p2 -->
diff --git a/rxjava-modules/rxjava-observables/pom.xml b/rxjava-modules/rxjava-observables/pom.xml
index c54df19fa8..15b3ec8e36 100644
--- a/rxjava-modules/rxjava-observables/pom.xml
+++ b/rxjava-modules/rxjava-observables/pom.xml
@@ -6,9 +6,11 @@
rxjava-observables
1.0-SNAPSHOT
rxjava-observables
+
com.baeldung.rxjava-modules
rxjava-modules
0.0.1-SNAPSHOT
+
\ No newline at end of file
diff --git a/rxjava-modules/rxjava-operators/pom.xml b/rxjava-modules/rxjava-operators/pom.xml
index 1859edc23b..7b051c7290 100644
--- a/rxjava-modules/rxjava-operators/pom.xml
+++ b/rxjava-modules/rxjava-operators/pom.xml
@@ -25,4 +25,5 @@
0.20.4
+
\ No newline at end of file
diff --git a/spring-5-reactive-modules/pom.xml b/spring-5-reactive-modules/pom.xml
index 73ba4afd7c..193f3600e6 100644
--- a/spring-5-reactive-modules/pom.xml
+++ b/spring-5-reactive-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.spring.reactive
spring-5-reactive-modules
@@ -58,7 +58,6 @@
-
\ No newline at end of file
diff --git a/spring-5-reactive-modules/spring-5-data-reactive/pom.xml b/spring-5-reactive-modules/spring-5-data-reactive/pom.xml
index ee3c2a83f7..cd77467bc8 100644
--- a/spring-5-reactive-modules/spring-5-data-reactive/pom.xml
+++ b/spring-5-reactive-modules/spring-5-data-reactive/pom.xml
@@ -7,8 +7,6 @@
spring-5-data-reactive
jar
-
-
com.baeldung.spring.reactive
spring-5-reactive-modules
diff --git a/spring-5-reactive-modules/spring-5-reactive-client/pom.xml b/spring-5-reactive-modules/spring-5-reactive-client/pom.xml
index f7ca8a86a5..6d66d30af0 100644
--- a/spring-5-reactive-modules/spring-5-reactive-client/pom.xml
+++ b/spring-5-reactive-modules/spring-5-reactive-client/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-5-reactive-client
spring-5-reactive-client
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index d0a35859b4..3304643ca1 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -44,12 +44,13 @@
spring-boot-groovy
spring-boot-jasypt
+ spring-boot-jsp
spring-boot-keycloak
+ spring-boot-keycloak-2
spring-boot-libraries
spring-boot-libraries-2
spring-boot-libraries-comparison
spring-boot-logging-log4j2
- spring-boot-multiple-datasources
spring-boot-mvc
spring-boot-mvc-2
spring-boot-mvc-3
diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml
index a4fcd0c3f3..cac5016ebd 100644
--- a/spring-boot-modules/spring-boot-data-3/pom.xml
+++ b/spring-boot-modules/spring-boot-data-3/pom.xml
@@ -1,17 +1,20 @@
-
+
4.0.0
-
- com.baeldung.spring-boot-modules
- spring-boot-modules
- 1.0.0-SNAPSHOT
-
com.baeldung
spring-boot-data-3
0.0.1-SNAPSHOT
spring-boot-data-3
spring-boot-data-3
+
+
+ com.baeldung.spring-boot-modules
+ spring-boot-modules
+ 1.0.0-SNAPSHOT
+
+
org.springframework.boot
@@ -21,13 +24,11 @@
org.springframework.boot
spring-boot-starter-data-jpa
-
mysql
mysql-connector-java
runtime
-
org.springframework.boot
spring-boot-starter-test
@@ -44,4 +45,4 @@
-
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/README.md b/spring-boot-modules/spring-boot-jsp/README.md
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/README.md
rename to spring-boot-modules/spring-boot-jsp/README.md
diff --git a/spring-web-modules/spring-boot-jsp/pom.xml b/spring-boot-modules/spring-boot-jsp/pom.xml
similarity index 95%
rename from spring-web-modules/spring-boot-jsp/pom.xml
rename to spring-boot-modules/spring-boot-jsp/pom.xml
index d2a363bafa..ab81d65cc6 100644
--- a/spring-web-modules/spring-boot-jsp/pom.xml
+++ b/spring-boot-modules/spring-boot-jsp/pom.xml
@@ -9,9 +9,9 @@
war
- com.baeldung
- spring-web-modules
- 0.0.1-SNAPSHOT
+ com.baeldung.spring-boot-modules
+ spring-boot-modules
+ 1.0.0-SNAPSHOT
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
similarity index 92%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
index c77554f9f6..98122bed50 100644
--- a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
+++ b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
@@ -8,6 +8,8 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
@SpringBootApplication(scanBasePackages = "com.baeldung.boot.jsp")
public class SpringBootJspApplication extends SpringBootServletInitializer {
+
+ //comment below if deploying outside web container -->
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringBootJspApplication.class);
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java
diff --git a/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/HomeController.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/HomeController.java
new file mode 100644
index 0000000000..7d7b9c3cbd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/HomeController.java
@@ -0,0 +1,15 @@
+package com.baeldung.boot.jsp.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/")
+public class HomeController {
+
+ @GetMapping("")
+ public String index() {
+ return "index";
+ }
+}
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java b/spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java
rename to spring-boot-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java
diff --git a/spring-web-modules/spring-boot-jsp/src/main/resources/application.properties b/spring-boot-modules/spring-boot-jsp/src/main/resources/application.properties
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/resources/application.properties
rename to spring-boot-modules/spring-boot-jsp/src/main/resources/application.properties
diff --git a/spring-web-modules/spring-boot-jsp/src/main/resources/static/css/common.css b/spring-boot-modules/spring-boot-jsp/src/main/resources/static/css/common.css
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/resources/static/css/common.css
rename to spring-boot-modules/spring-boot-jsp/src/main/resources/static/css/common.css
diff --git a/spring-web-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html b/spring-boot-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html
rename to spring-boot-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html
diff --git a/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp b/spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp
rename to spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp
diff --git a/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp b/spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp
rename to spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp
diff --git a/spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/index.jsp
new file mode 100644
index 0000000000..87b6beaf26
--- /dev/null
+++ b/spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/index.jsp
@@ -0,0 +1,10 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+
+ Index page
+
+
+ This is index page
+
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp b/spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp
rename to spring-boot-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java b/spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java
rename to spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java b/spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java
rename to spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java b/spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java
rename to spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java b/spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java
rename to spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java b/spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java
rename to spring-boot-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java
diff --git a/spring-web-modules/spring-boot-jsp/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-jsp/src/test/resources/logback-test.xml
similarity index 100%
rename from spring-web-modules/spring-boot-jsp/src/test/resources/logback-test.xml
rename to spring-boot-modules/spring-boot-jsp/src/test/resources/logback-test.xml
diff --git a/spring-boot-modules/spring-boot-keycloak-2/README.md b/spring-boot-modules/spring-boot-keycloak-2/README.md
new file mode 100644
index 0000000000..d372132a6a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-keycloak-2/README.md
@@ -0,0 +1,6 @@
+## Spring Boot Keycloak
+
+This module contains articles about Keycloak in Spring Boot projects.
+
+## Relevant articles:
+- [Disabling Keycloak Security in Spring Boot](https://www.baeldung.com/spring-keycloak-security-disable)
diff --git a/spring-boot-modules/spring-boot-keycloak-2/pom.xml b/spring-boot-modules/spring-boot-keycloak-2/pom.xml
new file mode 100644
index 0000000000..83c10c1a22
--- /dev/null
+++ b/spring-boot-modules/spring-boot-keycloak-2/pom.xml
@@ -0,0 +1,65 @@
+
+
+ 4.0.0
+ com.baeldung.keycloak
+ spring-boot-keycloak-2
+ 0.0.1
+ spring-boot-keycloak-2
+ jar
+ This is a simple application demonstrating integration between Keycloak and Spring Boot.
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+ 15.0.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.keycloak
+ keycloak-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.keycloak.bom
+ keycloak-adapter-bom
+ ${keycloak-adapter-bom.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/App.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/App.java
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/App.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/App.java
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/User.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/User.java
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/User.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/User.java
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/UserController.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/UserController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/disablingkeycloak/UserController.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/UserController.java
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-disabling-keycloak.properties b/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/main/resources/application-disabling-keycloak.properties
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties
diff --git a/spring-mockito/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/logback.xml
similarity index 100%
rename from spring-mockito/src/main/resources/logback.xml
rename to spring-boot-modules/spring-boot-keycloak-2/src/main/resources/logback.xml
diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/disablingkeycloak/DisablingKeycloakIntegrationTest.java b/spring-boot-modules/spring-boot-keycloak-2/src/test/java/com/baeldung/disablingkeycloak/DisablingKeycloakIntegrationTest.java
similarity index 69%
rename from spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/disablingkeycloak/DisablingKeycloakIntegrationTest.java
rename to spring-boot-modules/spring-boot-keycloak-2/src/test/java/com/baeldung/disablingkeycloak/DisablingKeycloakIntegrationTest.java
index cf70f7e7c3..2f9979baf7 100644
--- a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/disablingkeycloak/DisablingKeycloakIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-keycloak-2/src/test/java/com/baeldung/disablingkeycloak/DisablingKeycloakIntegrationTest.java
@@ -1,28 +1,25 @@
package com.baeldung.disablingkeycloak;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.apache.http.HttpStatus;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-@RunWith(SpringRunner.class)
@ActiveProfiles("disablingkeycloak")
-public class DisablingKeycloakIntegrationTest {
+class DisablingKeycloakIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
- public void givenUnauthenticated_whenGettingUser_shouldReturnUser() {
+ void givenUnauthenticated_whenGettingUser_shouldReturnUser() {
ResponseEntity responseEntity = restTemplate.getForEntity("/users/1", User.class);
assertEquals(HttpStatus.SC_OK, responseEntity.getStatusCodeValue());
diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/resources/application-disablingkeycloak.properties b/spring-boot-modules/spring-boot-keycloak-2/src/test/resources/application-disablingkeycloak.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-keycloak/src/test/resources/application-disablingkeycloak.properties
rename to spring-boot-modules/spring-boot-keycloak-2/src/test/resources/application-disablingkeycloak.properties
diff --git a/spring-boot-modules/spring-boot-keycloak/README.md b/spring-boot-modules/spring-boot-keycloak/README.md
index 97a336c25c..cde11df0fa 100644
--- a/spring-boot-modules/spring-boot-keycloak/README.md
+++ b/spring-boot-modules/spring-boot-keycloak/README.md
@@ -10,4 +10,3 @@ This module contains articles about Keycloak in Spring Boot projects.
- [Customizing Themes for Keycloak](https://www.baeldung.com/spring-keycloak-custom-themes)
- [Securing SOAP Web Services With Keycloak](https://www.baeldung.com/soap-keycloak)
- [Get Keycloak User ID in Spring](https://www.baeldung.com/spring-keycloak-get-user-id)
-- [Disabling Keycloak Security in Spring Boot](https://www.baeldung.com/spring-keycloak-security-disable)
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/.gitignore b/spring-boot-modules/spring-boot-multiple-datasources/.gitignore
deleted file mode 100644
index 87a3fce287..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.local-db
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/pom.xml b/spring-boot-modules/spring-boot-multiple-datasources/pom.xml
deleted file mode 100644
index 9355de8a36..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
- 4.0.0
- spring-boot-multiple-datasources
- 0.1.0-SNAPSHOT
- spring-boot-multiple-datasources
- jar
- Module For Spring Boot With Multiple Datasources
-
-
- com.baeldung.spring-boot-modules
- spring-boot-modules
- 1.0.0-SNAPSHOT
- ../pom.xml
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
- com.h2database
- h2
- provided
-
-
- org.springframework.boot
- spring-boot-devtools
- runtime
- true
-
-
- org.springframework.boot
- spring-boot-starter-test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
-
- 2.6.3
-
-
-
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/Todo.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/Todo.java
deleted file mode 100644
index 6f8557e258..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/Todo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.baeldung.spring.datasources.todos;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-@Entity
-public class Todo {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Long id;
- private String title;
- private boolean completed;
-
- public Todo() {
- }
-
- public Todo(String title) {
- this.title = title;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public boolean isCompleted() {
- return completed;
- }
-
- public void setCompleted(boolean completed) {
- this.completed = completed;
- }
-
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoDatasourceConfiguration.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoDatasourceConfiguration.java
deleted file mode 100644
index 3bfc8e2855..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoDatasourceConfiguration.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.spring.datasources.todos;
-
-import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-import javax.sql.DataSource;
-
-@Configuration
-public class TodoDatasourceConfiguration {
-
- @Bean
- @ConfigurationProperties("spring.datasource.todos")
- public DataSourceProperties todosDataSourceProperties() {
- return new DataSourceProperties();
- }
-
- @Bean
- @Primary
- public DataSource todosDataSource() {
- return todosDataSourceProperties()
- .initializeDataSourceBuilder()
- .build();
- }
-
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoJpaConfiguration.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoJpaConfiguration.java
deleted file mode 100644
index 655a3a55c2..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoJpaConfiguration.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.baeldung.spring.datasources.todos;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.orm.jpa.JpaTransactionManager;
-import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-import javax.sql.DataSource;
-import java.util.Objects;
-
-@Configuration
-@EnableTransactionManagement
-@EnableJpaRepositories(
- basePackageClasses = Todo.class,
- entityManagerFactoryRef = "todosEntityManagerFactory",
- transactionManagerRef = "todosTransactionManager"
-)
-public class TodoJpaConfiguration {
-
- @Bean
- public LocalContainerEntityManagerFactoryBean todosEntityManagerFactory(
- @Qualifier("todosDataSource") DataSource dataSource,
- EntityManagerFactoryBuilder builder) {
- return builder
- .dataSource(dataSource)
- .packages(Todo.class)
- .build();
- }
-
- @Bean
- public PlatformTransactionManager todosTransactionManager(
- @Qualifier("todosEntityManagerFactory") LocalContainerEntityManagerFactoryBean todosEntityManagerFactory) {
- return new JpaTransactionManager(Objects.requireNonNull(todosEntityManagerFactory.getObject()));
- }
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoRepository.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoRepository.java
deleted file mode 100644
index 09fb8c6500..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/todos/TodoRepository.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.baeldung.spring.datasources.todos;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface TodoRepository extends JpaRepository {
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/Topic.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/Topic.java
deleted file mode 100644
index 1d1f20f111..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/Topic.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.baeldung.spring.datasources.topics;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-@Entity
-public class Topic {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Long id;
- private String title;
-
- public Topic() {
- }
-
- public Topic(String title) {
- this.title = title;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicDatasourceConfiguration.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicDatasourceConfiguration.java
deleted file mode 100644
index a06983d681..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicDatasourceConfiguration.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.baeldung.spring.datasources.topics;
-
-import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import javax.sql.DataSource;
-
-@Configuration
-public class TopicDatasourceConfiguration {
-
- @Bean
- @ConfigurationProperties("spring.datasource.topics")
- public DataSourceProperties topicsDataSourceProperties() {
- return new DataSourceProperties();
- }
-
- @Bean
- public DataSource topicsDataSource() {
- return topicsDataSourceProperties()
- .initializeDataSourceBuilder()
- .build();
- }
-
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicJpaConfiguration.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicJpaConfiguration.java
deleted file mode 100644
index d800813b8c..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicJpaConfiguration.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.baeldung.spring.datasources.topics;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.orm.jpa.JpaTransactionManager;
-import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-import javax.sql.DataSource;
-import java.util.Objects;
-
-@Configuration
-@EnableTransactionManagement
-@EnableJpaRepositories(
- basePackageClasses = Topic.class,
- entityManagerFactoryRef = "topicsEntityManagerFactory",
- transactionManagerRef = "topicsTransactionManager"
-)
-public class TopicJpaConfiguration {
-
- @Bean
- public LocalContainerEntityManagerFactoryBean topicsEntityManagerFactory(
- @Qualifier("topicsDataSource") DataSource dataSource,
- EntityManagerFactoryBuilder builder
- ) {
- return builder
- .dataSource(dataSource)
- .packages(Topic.class)
- .build();
- }
-
- @Bean
- public PlatformTransactionManager topicsTransactionManager(
- @Qualifier("topicsEntityManagerFactory") LocalContainerEntityManagerFactoryBean topicsEntityManagerFactory) {
- return new JpaTransactionManager(Objects.requireNonNull(topicsEntityManagerFactory.getObject()));
- }
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicRepository.java b/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicRepository.java
deleted file mode 100644
index 499b72650a..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/topics/TopicRepository.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.baeldung.spring.datasources.topics;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface TopicRepository extends JpaRepository {
-}
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/resources/application.yml b/spring-boot-modules/spring-boot-multiple-datasources/src/main/resources/application.yml
deleted file mode 100644
index 4754acfc0f..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/resources/application.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-spring:
- datasource:
- todos:
- url: jdbc:h2:./.local-db/todos;DB_CLOSE_DELAY=-1;MODE=DB2;AUTO_SERVER=TRUE
- username: sa
- password: null
- driverClassName: org.h2.Driver
- topics:
- url: jdbc:h2:./.local-db/topics;DB_CLOSE_DELAY=-1;MODE=DB2;AUTO_SERVER=TRUE
- username: sa
- password: null
- driverClassName: org.h2.Driver
- h2:
- console:
- enabled: true
- path: /h2-console
- jpa:
- generate-ddl: true
- hibernate:
- ddl-auto: update
- properties:
- hibernate:
- dialect: org.hibernate.dialect.H2Dialect
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/test/java/com/baeldung/spring/datasources/MultipleDatasourcesIntegrationTest.java b/spring-boot-modules/spring-boot-multiple-datasources/src/test/java/com/baeldung/spring/datasources/MultipleDatasourcesIntegrationTest.java
deleted file mode 100644
index 397992f6c8..0000000000
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/test/java/com/baeldung/spring/datasources/MultipleDatasourcesIntegrationTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.baeldung.spring.datasources;
-
-import com.baeldung.spring.datasources.todos.Todo;
-import com.baeldung.spring.datasources.todos.TodoRepository;
-import com.baeldung.spring.datasources.topics.Topic;
-import com.baeldung.spring.datasources.topics.TopicRepository;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
-
-import java.util.Optional;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-@DataJpaTest // no test database!
-class MultipleDatasourcesIntegrationTest {
-
- @Autowired
- TodoRepository todoRepo;
- @Autowired
- TopicRepository topicRepo;
-
- @Test
- void shouldSaveTodoToTodoDB() {
- Todo todo = new Todo("test");
- Todo saved =todoRepo.save(todo);
- Optional result= todoRepo.findById(saved.getId());
- assertThat(result).isPresent();
- }
-
- @Test
- void shouldSaveTopicToTopicDB() {
- Topic todo = new Topic("test");
- Topic saved =topicRepo.save(todo);
- Optional result= topicRepo.findById(saved.getId());
- assertThat(result).isPresent();
- }
-
-}
diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml
index 18b1774920..8cd94179cf 100644
--- a/spring-boot-modules/spring-boot-springdoc/pom.xml
+++ b/spring-boot-modules/spring-boot-springdoc/pom.xml
@@ -1,5 +1,7 @@
-
+
4.0.0
spring-boot-springdoc
0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-testing-2/pom.xml b/spring-boot-modules/spring-boot-testing-2/pom.xml
index e4f3f122af..fbcdc19d56 100644
--- a/spring-boot-modules/spring-boot-testing-2/pom.xml
+++ b/spring-boot-modules/spring-boot-testing-2/pom.xml
@@ -23,6 +23,10 @@
org.springframework.boot
spring-boot-starter-web-services
+
+ org.springframework.boot
+ spring-boot-starter-security
+
org.springframework.boot
spring-boot-starter-data-redis
@@ -43,13 +47,39 @@
test
- org.testcontainers
- testcontainers
- 1.17.2
+ org.keycloak
+ keycloak-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
test
+
+ com.github.dasniko
+ testcontainers-keycloak
+ ${testcontainers-keycloak.version}
+ test
+
+
+ org.testcontainers
+ testcontainers
+ ${testcontainers.version}
+
+
+
+
+ org.keycloak.bom
+ keycloak-adapter-bom
+ ${keycloak-adapter.version}
+ pom
+ import
+
+
+
+
@@ -77,6 +107,9 @@
com.baeldung.boot.Application
+ 1.17.2
+ 1.10.0
+ 13.0.1
-
\ No newline at end of file
+
diff --git a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/MultipleDatasourcesApplication.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/Application.java
similarity index 54%
rename from spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/MultipleDatasourcesApplication.java
rename to spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/Application.java
index efdff387df..6619b9ccae 100644
--- a/spring-boot-modules/spring-boot-multiple-datasources/src/main/java/com/baeldung/spring/datasources/MultipleDatasourcesApplication.java
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/Application.java
@@ -1,13 +1,12 @@
-package com.baeldung.spring.datasources;
+package com.baeldung.keycloaktestcontainers;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
-public class MultipleDatasourcesApplication {
+public class Application {
public static void main(String[] args) {
- SpringApplication.run(MultipleDatasourcesApplication.class, args);
+ SpringApplication.run(Application.class, args);
}
-
}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/configuration/KeycloakConfiguration.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/configuration/KeycloakConfiguration.java
new file mode 100644
index 0000000000..aa12e44cc9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/configuration/KeycloakConfiguration.java
@@ -0,0 +1,14 @@
+package com.baeldung.keycloaktestcontainers.configuration;
+
+import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class KeycloakConfiguration {
+
+ @Bean
+ public KeycloakSpringBootConfigResolver keycloakConfigResolver() {
+ return new KeycloakSpringBootConfigResolver();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/configuration/KeycloakSecurityConfiguration.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/configuration/KeycloakSecurityConfiguration.java
new file mode 100644
index 0000000000..9bbf1b92ab
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/configuration/KeycloakSecurityConfiguration.java
@@ -0,0 +1,46 @@
+package com.baeldung.keycloaktestcontainers.configuration;
+
+import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
+import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+
+@KeycloakConfiguration
+@ConditionalOnProperty(name = "keycloak.enabled", havingValue = "true", matchIfMissing = true)
+public class KeycloakSecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {
+
+ @Autowired
+ public void configureGlobal(AuthenticationManagerBuilder auth) {
+ auth.authenticationProvider(keycloakAuthenticationProvider());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Bean
+ @Override
+ protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
+ return new NullAuthenticatedSessionStrategy();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ super.configure(http);
+
+ http.csrf()
+ .disable()
+ .cors()
+ .and()
+ .authorizeRequests()
+ .anyRequest()
+ .authenticated();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/controller/UserController.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/controller/UserController.java
new file mode 100644
index 0000000000..7eb16a5922
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/controller/UserController.java
@@ -0,0 +1,17 @@
+package com.baeldung.keycloaktestcontainers.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.keycloaktestcontainers.dto.UserDto;
+
+@RestController
+@RequestMapping("/users")
+public class UserController {
+
+ @GetMapping("me")
+ public UserDto getMe() {
+ return new UserDto(1L, "janedoe", "Doe", "Jane", "jane.doe@baeldung.com");
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/dto/UserDto.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/dto/UserDto.java
new file mode 100644
index 0000000000..799db11c37
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/keycloaktestcontainers/dto/UserDto.java
@@ -0,0 +1,57 @@
+package com.baeldung.keycloaktestcontainers.dto;
+
+public class UserDto {
+ private long id;
+ private String username;
+ private String lastname;
+ private String firstname;
+ private String email;
+
+ public UserDto(long id, String username, String lastname, String firstname, String email) {
+ this.id = id;
+ this.username = username;
+ this.lastname = lastname;
+ this.firstname = firstname;
+ this.email = email;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties
index 8b13789179..0076e1252d 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties
@@ -1 +1,4 @@
-
+keycloak.enabled=true
+keycloak.realm=baeldung
+keycloak.resource=baeldung-api
+keycloak.auth-server-url=http://localhost:8081
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/IntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/IntegrationTest.java
new file mode 100644
index 0000000000..902c27b16e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/IntegrationTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.keycloaktestcontainers;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.http.client.utils.URIBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.json.JacksonJsonParser;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.util.TestPropertyValues;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import dasniko.testcontainers.keycloak.KeycloakContainer;
+import io.restassured.RestAssured;
+
+@ContextConfiguration(initializers = { IntegrationTest.Initializer.class })
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+public abstract class IntegrationTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(IntegrationTest.class.getName());
+
+ @LocalServerPort
+ private int port;
+
+ static final KeycloakContainer keycloak = new KeycloakContainer().withRealmImportFile("keycloak/realm-export.json");
+
+ @PostConstruct
+ public void init() {
+ RestAssured.baseURI = "http://localhost:" + port;
+ }
+
+ static class Initializer implements ApplicationContextInitializer {
+
+ public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
+ keycloak.start();
+ TestPropertyValues.of("keycloak.auth-server-url=" + keycloak.getAuthServerUrl())
+ .applyTo(configurableApplicationContext.getEnvironment());
+ }
+ }
+
+ protected String getJaneDoeBearer() {
+
+ try {
+ URI authorizationURI = new URIBuilder(keycloak.getAuthServerUrl() + "/realms/baeldung/protocol/openid-connect/token").build();
+ WebClient webclient = WebClient.builder()
+ .build();
+ MultiValueMap formData = new LinkedMultiValueMap<>();
+ formData.put("grant_type", Collections.singletonList("password"));
+ formData.put("client_id", Collections.singletonList("baeldung-api"));
+ formData.put("username", Collections.singletonList("jane.doe@baeldung.com"));
+ formData.put("password", Collections.singletonList("s3cr3t"));
+
+ String result = webclient.post()
+ .uri(authorizationURI)
+ .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+ .body(BodyInserters.fromFormData(formData))
+ .retrieve()
+ .bodyToMono(String.class)
+ .block();
+
+ JacksonJsonParser jsonParser = new JacksonJsonParser();
+
+ return "Bearer " + jsonParser.parseMap(result)
+ .get("access_token")
+ .toString();
+ } catch (URISyntaxException e) {
+ LOGGER.error("Can't obtain an access token from Keycloak!", e);
+ }
+
+ return null;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerIntegrationTest.java
new file mode 100644
index 0000000000..4015612860
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/keycloaktestcontainers/UserControllerIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.keycloaktestcontainers;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.equalTo;
+
+import org.junit.jupiter.api.Test;
+
+class UserControllerIntegrationTest extends IntegrationTest {
+
+ @Test
+ void givenAuthenticatedUser_whenGetMe_shouldReturnMyInfo() {
+
+ given().header("Authorization", getJaneDoeBearer())
+ .when()
+ .get("/users/me")
+ .then()
+ .body("username", equalTo("janedoe"))
+ .body("lastname", equalTo("Doe"))
+ .body("firstname", equalTo("Jane"))
+ .body("email", equalTo("jane.doe@baeldung.com"));
+
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/redistestcontainers/service/ProductServiceIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/redistestcontainers/service/ProductServiceIntegrationTest.java
new file mode 100644
index 0000000000..519db1b335
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/redistestcontainers/service/ProductServiceIntegrationTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.redistestcontainers.service;
+
+import com.baeldung.redistestcontainers.hash.Product;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.utility.DockerImageName;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+@SpringBootTest
+public class ProductServiceIntegrationTest {
+
+ static {
+ GenericContainer> redis = new GenericContainer<>(DockerImageName.parse("redis:5.0.3-alpine"))
+ .withExposedPorts(6379);
+ redis.start();
+ System.setProperty("spring.redis.host", redis.getHost());
+ System.setProperty("spring.redis.port", redis.getMappedPort(6379).toString());
+ }
+
+ @Autowired
+ private ProductService productService;
+
+ @Test
+ void givenProductCreated_whenGettingProductById_thenProductExistsAndHasSameProperties() {
+ Product product = new Product("1", "Test Product", 10.0);
+ productService.createProduct(product);
+ Product productFromDb = productService.getProduct("1");
+ assertEquals("1", productFromDb.getId());
+ assertEquals("Test Product", productFromDb.getName());
+ assertEquals(10.0, productFromDb.getPrice());
+ }
+
+ @Test
+ void givenProductCreatedAndUpdated_whenGettingTheProduct_thenUpdatedProductReturned() {
+ Product product = new Product("1", "Test Product", 10.0);
+ productService.createProduct(product);
+ Product productFromDb = productService.getProduct("1");
+ assertEquals("1", productFromDb.getId());
+ assertEquals("Test Product", productFromDb.getName());
+ assertEquals(10.0, productFromDb.getPrice());
+ productFromDb.setName("Updated Product");
+ productFromDb.setPrice(20.0);
+ productService.updateProduct(productFromDb);
+ Product updatedProductFromDb = productService.getProduct("1");
+ assertEquals("Updated Product", updatedProductFromDb.getName());
+ assertEquals(20.0, updatedProductFromDb.getPrice());
+ }
+
+ @Test
+ void givenProductCreatedAndDeleted_whenGettingTheProduct_thenNoProductReturned() {
+ Product product = new Product("1", "Test Product", 10.0);
+ productService.createProduct(product);
+ Product productFromDb = productService.getProduct("1");
+ assertEquals("1", productFromDb.getId());
+ assertEquals("Test Product", productFromDb.getName());
+ assertEquals(10.0, productFromDb.getPrice());
+ productService.deleteProduct("1");
+ Product deletedProductFromDb = productService.getProduct("1");
+ assertNull(deletedProductFromDb);
+ }
+
+ @Test
+ void givenProductCreated_whenGettingProductById_thenSameProductReturned() {
+ Product product = new Product("1", "Test Product", 10.0);
+ productService.createProduct(product);
+ Product productFromDb = productService.getProduct("1");
+ assertEquals("1", productFromDb.getId());
+ assertEquals("Test Product", productFromDb.getName());
+ assertEquals(10.0, productFromDb.getPrice());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties
index 2b406d1c6e..0076e1252d 100644
--- a/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties
@@ -1,3 +1,4 @@
-# logging.level.com.baeldung.testloglevel=DEBUG
-
-# logging.level.root=INFO
+keycloak.enabled=true
+keycloak.realm=baeldung
+keycloak.resource=baeldung-api
+keycloak.auth-server-url=http://localhost:8081
diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/resources/keycloak/realm-export.json b/spring-boot-modules/spring-boot-testing-2/src/test/resources/keycloak/realm-export.json
new file mode 100644
index 0000000000..e0cc25d233
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing-2/src/test/resources/keycloak/realm-export.json
@@ -0,0 +1,1803 @@
+{
+ "id": "baeldung",
+ "realm": "baeldung",
+ "notBefore": 0,
+ "defaultSignatureAlgorithm": "RS256",
+ "revokeRefreshToken": false,
+ "refreshTokenMaxReuse": 0,
+ "accessTokenLifespan": 300,
+ "accessTokenLifespanForImplicitFlow": 900,
+ "ssoSessionIdleTimeout": 1800,
+ "ssoSessionMaxLifespan": 36000,
+ "ssoSessionIdleTimeoutRememberMe": 0,
+ "ssoSessionMaxLifespanRememberMe": 0,
+ "offlineSessionIdleTimeout": 2592000,
+ "offlineSessionMaxLifespanEnabled": false,
+ "offlineSessionMaxLifespan": 5184000,
+ "clientSessionIdleTimeout": 0,
+ "clientSessionMaxLifespan": 0,
+ "clientOfflineSessionIdleTimeout": 0,
+ "clientOfflineSessionMaxLifespan": 0,
+ "accessCodeLifespan": 60,
+ "accessCodeLifespanUserAction": 300,
+ "accessCodeLifespanLogin": 1800,
+ "actionTokenGeneratedByAdminLifespan": 43200,
+ "actionTokenGeneratedByUserLifespan": 300,
+ "oauth2DeviceCodeLifespan": 600,
+ "oauth2DevicePollingInterval": 5,
+ "enabled": true,
+ "sslRequired": "external",
+ "registrationAllowed": false,
+ "registrationEmailAsUsername": false,
+ "rememberMe": false,
+ "verifyEmail": false,
+ "loginWithEmailAllowed": true,
+ "duplicateEmailsAllowed": false,
+ "resetPasswordAllowed": false,
+ "editUsernameAllowed": false,
+ "bruteForceProtected": false,
+ "permanentLockout": false,
+ "maxFailureWaitSeconds": 900,
+ "minimumQuickLoginWaitSeconds": 60,
+ "waitIncrementSeconds": 60,
+ "quickLoginCheckMilliSeconds": 1000,
+ "maxDeltaTimeSeconds": 43200,
+ "failureFactor": 30,
+ "defaultRole": {
+ "id": "ae0de638-8b16-4d7f-9c1d-e1a55129f895",
+ "name": "default-roles-baeldung",
+ "description": "${role_default-roles}",
+ "composite": true,
+ "clientRole": false,
+ "containerId": "baeldung"
+ },
+ "requiredCredentials": [
+ "password"
+ ],
+ "otpPolicyType": "totp",
+ "otpPolicyAlgorithm": "HmacSHA1",
+ "otpPolicyInitialCounter": 0,
+ "otpPolicyDigits": 6,
+ "otpPolicyLookAheadWindow": 1,
+ "otpPolicyPeriod": 30,
+ "otpSupportedApplications": [
+ "FreeOTP",
+ "Google Authenticator"
+ ],
+ "webAuthnPolicyRpEntityName": "keycloak",
+ "webAuthnPolicySignatureAlgorithms": [
+ "ES256"
+ ],
+ "webAuthnPolicyRpId": "",
+ "webAuthnPolicyAttestationConveyancePreference": "not specified",
+ "webAuthnPolicyAuthenticatorAttachment": "not specified",
+ "webAuthnPolicyRequireResidentKey": "not specified",
+ "webAuthnPolicyUserVerificationRequirement": "not specified",
+ "webAuthnPolicyCreateTimeout": 0,
+ "webAuthnPolicyAvoidSameAuthenticatorRegister": false,
+ "webAuthnPolicyAcceptableAaguids": [],
+ "webAuthnPolicyPasswordlessRpEntityName": "keycloak",
+ "webAuthnPolicyPasswordlessSignatureAlgorithms": [
+ "ES256"
+ ],
+ "webAuthnPolicyPasswordlessRpId": "",
+ "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified",
+ "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified",
+ "webAuthnPolicyPasswordlessRequireResidentKey": "not specified",
+ "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified",
+ "webAuthnPolicyPasswordlessCreateTimeout": 0,
+ "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false,
+ "webAuthnPolicyPasswordlessAcceptableAaguids": [],
+ "scopeMappings": [
+ {
+ "clientScope": "offline_access",
+ "roles": [
+ "offline_access"
+ ]
+ }
+ ],
+ "clientScopeMappings": {
+ "account": [
+ {
+ "client": "account-console",
+ "roles": [
+ "manage-account"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "id": "f4acf69c-1490-444e-9b1a-dfa4016b54a1",
+ "clientId": "account",
+ "name": "${client_account}",
+ "rootUrl": "${authBaseUrl}",
+ "baseUrl": "/realms/baeldung/account/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "/realms/baeldung/account/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "cbfe941f-fe9a-4b79-aeb6-043b7993ffcc",
+ "clientId": "account-console",
+ "name": "${client_account-console}",
+ "rootUrl": "${authBaseUrl}",
+ "baseUrl": "/realms/baeldung/account/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "/realms/baeldung/account/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "pkce.code.challenge.method": "S256"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "bfff2bda-a626-489f-8b07-9989582dd452",
+ "name": "audience resolve",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-audience-resolve-mapper",
+ "consentRequired": false,
+ "config": {}
+ }
+ ],
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "6c504e4d-4ad5-48ee-a47b-6c31d8d9f67e",
+ "clientId": "admin-cli",
+ "name": "${client_admin-cli}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "c683c33f-a584-46b1-af9f-d401ba93af85",
+ "clientId": "baeldung-api",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "backchannel.logout.session.required": "true",
+ "backchannel.logout.revoke.offline.tokens": "false"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "d71dc523-1f66-4cce-a23f-83a13ba3744b",
+ "clientId": "broker",
+ "name": "${client_broker}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": true,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "36b87703-dfab-4c8e-b2a6-2bd96c89c141",
+ "clientId": "realm-management",
+ "name": "${client_realm-management}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": true,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "440114dd-9b2c-4c4b-b192-8dec233715db",
+ "clientId": "security-admin-console",
+ "name": "${client_security-admin-console}",
+ "rootUrl": "${authAdminUrl}",
+ "baseUrl": "/admin/baeldung/console/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "/admin/baeldung/console/*"
+ ],
+ "webOrigins": [
+ "+"
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "pkce.code.challenge.method": "S256"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "20f83504-601b-43d8-8725-38af0d7471d8",
+ "name": "locale",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "locale",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "locale",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "defaultClientScopes": [
+ "web-origins",
+ "roles",
+ "profile",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ }
+ ],
+ "clientScopes": [
+ {
+ "id": "b7ffedbd-ba94-4fd4-ba1e-0145252e10ef",
+ "name": "email",
+ "description": "OpenID Connect built-in scope: email",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "true",
+ "display.on.consent.screen": "true",
+ "consent.screen.text": "${emailScopeConsentText}"
+ },
+ "protocolMappers": [
+ {
+ "id": "7f93ba40-1f5e-48ff-b332-3cfe659072cb",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "014cf82a-ac04-4fff-880b-019a225d3bbd",
+ "name": "email verified",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "emailVerified",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email_verified",
+ "jsonType.label": "boolean"
+ }
+ }
+ ]
+ },
+ {
+ "id": "0c36e47f-4e3d-4cad-aa18-5521d3bbc7f2",
+ "name": "roles",
+ "description": "OpenID Connect scope for add user roles to the access token",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "false",
+ "display.on.consent.screen": "true",
+ "consent.screen.text": "${rolesScopeConsentText}"
+ },
+ "protocolMappers": [
+ {
+ "id": "abf78f87-6282-4a04-9ea6-4270978c7507",
+ "name": "audience resolve",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-audience-resolve-mapper",
+ "consentRequired": false,
+ "config": {}
+ },
+ {
+ "id": "171f5552-b4dc-45c1-b166-5738b7bbb08d",
+ "name": "realm roles",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-realm-role-mapper",
+ "consentRequired": false,
+ "config": {
+ "user.attribute": "foo",
+ "access.token.claim": "true",
+ "claim.name": "realm_access.roles",
+ "jsonType.label": "String",
+ "multivalued": "true"
+ }
+ },
+ {
+ "id": "92c00b3e-ec76-4497-aa56-3df225e82e24",
+ "name": "client roles",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-client-role-mapper",
+ "consentRequired": false,
+ "config": {
+ "user.attribute": "foo",
+ "access.token.claim": "true",
+ "claim.name": "resource_access.${client_id}.roles",
+ "jsonType.label": "String",
+ "multivalued": "true"
+ }
+ }
+ ]
+ },
+ {
+ "id": "b1856e10-88e1-4f14-b9f0-6673523f6e39",
+ "name": "offline_access",
+ "description": "OpenID Connect built-in scope: offline_access",
+ "protocol": "openid-connect",
+ "attributes": {
+ "consent.screen.text": "${offlineAccessScopeConsentText}",
+ "display.on.consent.screen": "true"
+ }
+ },
+ {
+ "id": "d94d0d20-6329-47ce-a4d4-b0f80d702ab7",
+ "name": "address",
+ "description": "OpenID Connect built-in scope: address",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "true",
+ "display.on.consent.screen": "true",
+ "consent.screen.text": "${addressScopeConsentText}"
+ },
+ "protocolMappers": [
+ {
+ "id": "9dc9f261-26ed-4dab-bdbb-735f7a50f90e",
+ "name": "address",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-address-mapper",
+ "consentRequired": false,
+ "config": {
+ "user.attribute.formatted": "formatted",
+ "user.attribute.country": "country",
+ "user.attribute.postal_code": "postal_code",
+ "userinfo.token.claim": "true",
+ "user.attribute.street": "street",
+ "id.token.claim": "true",
+ "user.attribute.region": "region",
+ "access.token.claim": "true",
+ "user.attribute.locality": "locality"
+ }
+ }
+ ]
+ },
+ {
+ "id": "b9e049bb-7cbf-483a-a55a-c777b7403229",
+ "name": "phone",
+ "description": "OpenID Connect built-in scope: phone",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "true",
+ "display.on.consent.screen": "true",
+ "consent.screen.text": "${phoneScopeConsentText}"
+ },
+ "protocolMappers": [
+ {
+ "id": "35bdeedc-92e7-484b-9282-70574247d263",
+ "name": "phone number",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "phoneNumber",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "phone_number",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "ab2aac65-a55e-406e-b42e-40d42e6c4388",
+ "name": "phone number verified",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "phoneNumberVerified",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "phone_number_verified",
+ "jsonType.label": "boolean"
+ }
+ }
+ ]
+ },
+ {
+ "id": "c8df543e-eb97-42e6-8aa2-63a8252afc9e",
+ "name": "microprofile-jwt",
+ "description": "Microprofile - JWT built-in scope",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "true",
+ "display.on.consent.screen": "false"
+ },
+ "protocolMappers": [
+ {
+ "id": "b8714689-b19f-40da-b184-cc882028e8a4",
+ "name": "groups",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-realm-role-mapper",
+ "consentRequired": false,
+ "config": {
+ "multivalued": "true",
+ "user.attribute": "foo",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "groups",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e00ad84f-2f3c-4f13-be8a-3931103042c6",
+ "name": "upn",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "upn",
+ "jsonType.label": "String"
+ }
+ }
+ ]
+ },
+ {
+ "id": "54a0ac8d-4b46-413a-8d63-1822b424e2f1",
+ "name": "role_list",
+ "description": "SAML role list",
+ "protocol": "saml",
+ "attributes": {
+ "consent.screen.text": "${samlRoleListScopeConsentText}",
+ "display.on.consent.screen": "true"
+ },
+ "protocolMappers": [
+ {
+ "id": "d52bd17c-98c1-4dcc-9e16-5736ddf6347e",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ }
+ ]
+ },
+ {
+ "id": "18f13b5b-b7b3-4daa-afc5-ec25d6395075",
+ "name": "web-origins",
+ "description": "OpenID Connect scope for add allowed web origins to the access token",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "false",
+ "display.on.consent.screen": "false",
+ "consent.screen.text": ""
+ },
+ "protocolMappers": [
+ {
+ "id": "9371941e-b465-4413-a742-1036fafb2485",
+ "name": "allowed web origins",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-allowed-origins-mapper",
+ "consentRequired": false,
+ "config": {}
+ }
+ ]
+ },
+ {
+ "id": "09b1bbe9-5be6-477f-bcf5-bb661d7fe2a2",
+ "name": "profile",
+ "description": "OpenID Connect built-in scope: profile",
+ "protocol": "openid-connect",
+ "attributes": {
+ "include.in.token.scope": "true",
+ "display.on.consent.screen": "true",
+ "consent.screen.text": "${profileScopeConsentText}"
+ },
+ "protocolMappers": [
+ {
+ "id": "58083ae1-5f33-4830-b975-e9f8da33920f",
+ "name": "updated at",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "updatedAt",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "updated_at",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "6a87985d-12e6-4ea6-9e40-14fe46ad4668",
+ "name": "zoneinfo",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "zoneinfo",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "zoneinfo",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "d2393d95-5f3e-4f08-a876-d4971845e5ad",
+ "name": "picture",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "picture",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "picture",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "7ce8e5e6-2f50-4b32-bd0a-7db014146baf",
+ "name": "birthdate",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "birthdate",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "birthdate",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e935814c-cf70-447d-85da-854bee14f403",
+ "name": "nickname",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "nickname",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "nickname",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "b2a73b0c-fd84-4894-85cf-05b9a8b9a329",
+ "name": "profile",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "profile",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "profile",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "1f4d67e2-7083-4bb8-a666-361a6762161d",
+ "name": "website",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "website",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "website",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "5425cfb0-f259-43ba-bd31-8ab2b935e76c",
+ "name": "locale",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "locale",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "locale",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "2fb74508-49c3-46dd-b620-61a4a461c7bc",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "457d4a3f-f47e-4ed4-a7da-5950c822e434",
+ "name": "gender",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "gender",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "gender",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "d2748ba4-aac9-486f-bbfc-ec398e273eec",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": false,
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "6e78fd09-6cac-4c66-84e4-299b58a1eefc",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e44bd071-8a85-49a3-8649-09985f7e8a61",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "da7000a8-8a8b-4df7-a4b9-7f78f3d13406",
+ "name": "middle name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "middleName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "middle_name",
+ "jsonType.label": "String"
+ }
+ }
+ ]
+ }
+ ],
+ "defaultDefaultClientScopes": [
+ "profile",
+ "roles",
+ "web-origins",
+ "role_list",
+ "email"
+ ],
+ "defaultOptionalClientScopes": [
+ "offline_access",
+ "phone",
+ "microprofile-jwt",
+ "address"
+ ],
+ "browserSecurityHeaders": {
+ "contentSecurityPolicyReportOnly": "",
+ "xContentTypeOptions": "nosniff",
+ "xRobotsTag": "none",
+ "xFrameOptions": "SAMEORIGIN",
+ "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';",
+ "xXSSProtection": "1; mode=block",
+ "strictTransportSecurity": "max-age=31536000; includeSubDomains"
+ },
+ "smtpServer": {},
+ "eventsEnabled": false,
+ "eventsListeners": [
+ "jboss-logging"
+ ],
+ "enabledEventTypes": [],
+ "adminEventsEnabled": false,
+ "adminEventsDetailsEnabled": false,
+ "identityProviders": [],
+ "identityProviderMappers": [],
+ "components": {
+ "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [
+ {
+ "id": "80d5424d-79ab-44f4-818e-bc3b593641de",
+ "name": "Allowed Client Scopes",
+ "providerId": "allowed-client-templates",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allow-default-scopes": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "b578a18a-e340-49a1-ace1-8092ed29f28c",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-usermodel-attribute-mapper",
+ "oidc-full-name-mapper",
+ "oidc-sha256-pairwise-sub-mapper",
+ "saml-user-property-mapper",
+ "oidc-usermodel-property-mapper",
+ "saml-role-list-mapper",
+ "oidc-address-mapper",
+ "saml-user-attribute-mapper"
+ ]
+ }
+ },
+ {
+ "id": "9311fd52-8330-4065-b987-7a0ce8589d6a",
+ "name": "Full Scope Disabled",
+ "providerId": "scope",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "dcd5d2fe-da81-492e-ae6b-c026792e3154",
+ "name": "Consent Required",
+ "providerId": "consent-required",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "1ed1d774-d6d9-45ee-8a22-61125a01a479",
+ "name": "Allowed Client Scopes",
+ "providerId": "allowed-client-templates",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allow-default-scopes": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "717825ce-f267-4468-99cb-b09126b00570",
+ "name": "Trusted Hosts",
+ "providerId": "trusted-hosts",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "host-sending-registration-request-must-match": [
+ "true"
+ ],
+ "client-uris-must-match": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "6fb4db12-299d-4b7e-a100-8c318248d5e3",
+ "name": "Max Clients Limit",
+ "providerId": "max-clients",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "max-clients": [
+ "200"
+ ]
+ }
+ },
+ {
+ "id": "bf2d5422-07a0-4317-9e01-0d2a1be9b582",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-usermodel-property-mapper",
+ "saml-role-list-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "saml-user-attribute-mapper",
+ "oidc-address-mapper",
+ "oidc-full-name-mapper",
+ "saml-user-property-mapper",
+ "oidc-sha256-pairwise-sub-mapper"
+ ]
+ }
+ }
+ ],
+ "org.keycloak.keys.KeyProvider": [
+ {
+ "id": "be18f5ef-4151-43e2-a607-1852f53acc76",
+ "name": "rsa-enc-generated",
+ "providerId": "rsa-enc-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ],
+ "algorithm": [
+ "RSA-OAEP"
+ ]
+ }
+ },
+ {
+ "id": "52fb51ee-b5aa-41c3-88d2-a0b11b6d4072",
+ "name": "rsa-generated",
+ "providerId": "rsa-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ]
+ }
+ },
+ {
+ "id": "9e839a58-a36e-420f-bebc-7466c4b578c9",
+ "name": "hmac-generated",
+ "providerId": "hmac-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ],
+ "algorithm": [
+ "HS256"
+ ]
+ }
+ },
+ {
+ "id": "93d3b307-cf5a-484c-a612-43cb4923501a",
+ "name": "aes-generated",
+ "providerId": "aes-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ]
+ }
+ }
+ ]
+ },
+ "internationalizationEnabled": false,
+ "supportedLocales": [],
+ "authenticationFlows": [
+ {
+ "id": "e285f1b9-bc15-4457-851d-abc9cb54953d",
+ "alias": "Account verification options",
+ "description": "Method with which to verity the existing account",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-email-verification",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "Verify Existing Account by Re-authentication",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "65944e23-1f0d-47cf-b5d8-358463b0d382",
+ "alias": "Authentication Options",
+ "description": "Authentication options.",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "basic-auth",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "basic-auth-otp",
+ "authenticatorFlow": false,
+ "requirement": "DISABLED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "auth-spnego",
+ "authenticatorFlow": false,
+ "requirement": "DISABLED",
+ "priority": 30,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "235ca7f6-27ad-4817-a686-cec020f7a091",
+ "alias": "Browser - Conditional OTP",
+ "description": "Flow to determine if the OTP is required for the authentication",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "conditional-user-configured",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "3d8dc16b-07e8-4535-ad1a-4ce79df1dd07",
+ "alias": "Direct Grant - Conditional OTP",
+ "description": "Flow to determine if the OTP is required for the authentication",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "conditional-user-configured",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "direct-grant-validate-otp",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "3fa38b47-45a2-4eea-85a6-620b877db701",
+ "alias": "First broker login - Conditional OTP",
+ "description": "Flow to determine if the OTP is required for the authentication",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "conditional-user-configured",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "126eee75-5f90-4a46-92c5-6fbb209d764a",
+ "alias": "Handle Existing Account",
+ "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-confirm-link",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "Account verification options",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "d9d8e610-41f8-45e3-a097-9961aa5e6d5f",
+ "alias": "Reset - Conditional OTP",
+ "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "conditional-user-configured",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "reset-otp",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "b01b7a9e-597b-4a12-8ccb-bfb707686dbf",
+ "alias": "User creation or linking",
+ "description": "Flow for the existing/non-existing user alternatives",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticatorConfig": "create unique user config",
+ "authenticator": "idp-create-user-if-unique",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "Handle Existing Account",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "33a40ef5-e611-4182-b1a5-55aa930a839b",
+ "alias": "Verify Existing Account by Re-authentication",
+ "description": "Reauthentication of existing account",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-username-password-form",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "CONDITIONAL",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "First broker login - Conditional OTP",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "5e148805-8a3f-4cbd-9a75-862da8e3fcdf",
+ "alias": "browser",
+ "description": "browser based authentication",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-cookie",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "auth-spnego",
+ "authenticatorFlow": false,
+ "requirement": "DISABLED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "identity-provider-redirector",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 25,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "autheticatorFlow": true,
+ "flowAlias": "forms",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "38fd27d7-9914-47b3-aa11-1079cc059236",
+ "alias": "clients",
+ "description": "Base authentication for clients",
+ "providerId": "client-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "client-secret",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "client-jwt",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "client-secret-jwt",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "client-x509",
+ "authenticatorFlow": false,
+ "requirement": "ALTERNATIVE",
+ "priority": 40,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "58a3dcd5-56d1-4003-a1a1-dfafaf71ffa1",
+ "alias": "direct grant",
+ "description": "OpenID Connect Resource Owner Grant",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "direct-grant-validate-username",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "direct-grant-validate-password",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "CONDITIONAL",
+ "priority": 30,
+ "autheticatorFlow": true,
+ "flowAlias": "Direct Grant - Conditional OTP",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "4ed42c08-7dc6-47bf-8ac6-27e262973fdb",
+ "alias": "docker auth",
+ "description": "Used by Docker clients to authenticate against the IDP",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "docker-http-basic-authenticator",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "b4ff61a6-56c7-4160-9047-b9abab13cfd9",
+ "alias": "first broker login",
+ "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticatorConfig": "review profile config",
+ "authenticator": "idp-review-profile",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "User creation or linking",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "68b55fff-3f1e-4cce-a181-0b4fdc8ab1e5",
+ "alias": "forms",
+ "description": "Username, password, otp and other auth forms.",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-username-password-form",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "CONDITIONAL",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "Browser - Conditional OTP",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "d3456a10-f6a1-4767-9385-baed652e82c4",
+ "alias": "http challenge",
+ "description": "An authentication flow based on challenge-response HTTP Authentication Schemes",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "no-cookie-redirect",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": true,
+ "flowAlias": "Authentication Options",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "7b50c4ff-25c2-4ff9-8f4b-95c1144bb30a",
+ "alias": "registration",
+ "description": "registration flow",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "registration-page-form",
+ "authenticatorFlow": true,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": true,
+ "flowAlias": "registration form",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "edc22a19-8b8d-4bca-bdfb-446df319e4b5",
+ "alias": "registration form",
+ "description": "registration form",
+ "providerId": "form-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "registration-user-creation",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "registration-profile-action",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 40,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "registration-password-action",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 50,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "registration-recaptcha-action",
+ "authenticatorFlow": false,
+ "requirement": "DISABLED",
+ "priority": 60,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "b5f2931c-badf-4c09-96fb-7a0af5860b9f",
+ "alias": "reset credentials",
+ "description": "Reset credentials for a user if they forgot their password or something",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "reset-credentials-choose-user",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "reset-credential-email",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticator": "reset-password",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 30,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ },
+ {
+ "authenticatorFlow": true,
+ "requirement": "CONDITIONAL",
+ "priority": 40,
+ "autheticatorFlow": true,
+ "flowAlias": "Reset - Conditional OTP",
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "cc118d9d-31b8-4fa9-ba7c-2fc65936612a",
+ "alias": "saml ecp",
+ "description": "SAML ECP Profile Authentication Flow",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "http-basic-authenticator",
+ "authenticatorFlow": false,
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ }
+ ],
+ "authenticatorConfig": [
+ {
+ "id": "5219b9c4-0664-4b61-8fd4-c9ecc9954c4b",
+ "alias": "create unique user config",
+ "config": {
+ "require.password.update.after.registration": "false"
+ }
+ },
+ {
+ "id": "f48e0b44-86c9-4db0-87da-97433d873b80",
+ "alias": "review profile config",
+ "config": {
+ "update.profile.on.first.login": "missing"
+ }
+ }
+ ],
+ "requiredActions": [
+ {
+ "alias": "CONFIGURE_TOTP",
+ "name": "Configure OTP",
+ "providerId": "CONFIGURE_TOTP",
+ "enabled": true,
+ "defaultAction": false,
+ "priority": 10,
+ "config": {}
+ },
+ {
+ "alias": "terms_and_conditions",
+ "name": "Terms and Conditions",
+ "providerId": "terms_and_conditions",
+ "enabled": false,
+ "defaultAction": false,
+ "priority": 20,
+ "config": {}
+ },
+ {
+ "alias": "UPDATE_PASSWORD",
+ "name": "Update Password",
+ "providerId": "UPDATE_PASSWORD",
+ "enabled": true,
+ "defaultAction": false,
+ "priority": 30,
+ "config": {}
+ },
+ {
+ "alias": "UPDATE_PROFILE",
+ "name": "Update Profile",
+ "providerId": "UPDATE_PROFILE",
+ "enabled": true,
+ "defaultAction": false,
+ "priority": 40,
+ "config": {}
+ },
+ {
+ "alias": "VERIFY_EMAIL",
+ "name": "Verify Email",
+ "providerId": "VERIFY_EMAIL",
+ "enabled": true,
+ "defaultAction": false,
+ "priority": 50,
+ "config": {}
+ },
+ {
+ "alias": "delete_account",
+ "name": "Delete Account",
+ "providerId": "delete_account",
+ "enabled": false,
+ "defaultAction": false,
+ "priority": 60,
+ "config": {}
+ },
+ {
+ "alias": "update_user_locale",
+ "name": "Update User Locale",
+ "providerId": "update_user_locale",
+ "enabled": true,
+ "defaultAction": false,
+ "priority": 1000,
+ "config": {}
+ }
+ ],
+ "browserFlow": "browser",
+ "registrationFlow": "registration",
+ "directGrantFlow": "direct grant",
+ "resetCredentialsFlow": "reset credentials",
+ "clientAuthenticationFlow": "clients",
+ "dockerAuthenticationFlow": "docker auth",
+ "attributes": {
+ "cibaBackchannelTokenDeliveryMode": "poll",
+ "cibaExpiresIn": "120",
+ "cibaAuthRequestedUserHint": "login_hint",
+ "oauth2DeviceCodeLifespan": "600",
+ "oauth2DevicePollingInterval": "5",
+ "parRequestUriLifespan": "60",
+ "cibaInterval": "5"
+ },
+ "keycloakVersion": "17.0.1",
+ "userManagedAccessAllowed": false,
+ "clientProfiles": {
+ "profiles": []
+ },
+ "clientPolicies": {
+ "policies": []
+ },
+ "users": [
+ {
+ "username": "janedoe",
+ "email": "jane.doe@baeldung.com",
+ "firstName": "Jane",
+ "lastName": "Doe",
+ "enabled": true,
+ "credentials": [
+ {
+ "type": "password",
+ "value": "s3cr3t"
+ }
+ ],
+ "clientRoles": {
+ "account": [
+ "view-profile",
+ "manage-account"
+ ]
+ }
+ }
+ ]
+}
diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml
index 77c45eb640..6d44cb015b 100644
--- a/spring-cloud-modules/pom.xml
+++ b/spring-cloud-modules/pom.xml
@@ -22,7 +22,7 @@
spring-cloud-eureka
spring-cloud-hystrix
spring-cloud-bootstrap
- spring-cloud-ribbon-client
+ spring-cloud-ribbon-client
spring-cloud-zookeeper
spring-cloud-gateway
spring-cloud-stream
@@ -94,4 +94,4 @@
3.1.3
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml
index c521b77c4d..9b33411aaa 100644
--- a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml
+++ b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml
@@ -17,13 +17,13 @@
-
- org.springframework.boot
- spring-boot-dependencies
- ${spring-boot.version}
- pom
- import
-
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
org.springframework.cloud
spring-cloud-dataflow-dependencies
diff --git a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml
index 6e6367ecad..ba923c4ae6 100644
--- a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml
+++ b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml
@@ -24,17 +24,16 @@
-
io.rest-assured
rest-assured
${rest-assured.version}
-
-
-
-
-
+
+
+
+
+
net.bytebuddy
byte-buddy
@@ -51,5 +50,4 @@
3.1.0
-
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-gateway/README.md b/spring-cloud-modules/spring-cloud-gateway/README.md
index 808536ce80..5bf416fccd 100644
--- a/spring-cloud-modules/spring-cloud-gateway/README.md
+++ b/spring-cloud-modules/spring-cloud-gateway/README.md
@@ -10,3 +10,4 @@ This module contains articles about Spring Cloud Gateway
- [Spring Cloud Gateway WebFilter Factories](https://www.baeldung.com/spring-cloud-gateway-webfilter-factories)
- [Using Spring Cloud Gateway with OAuth 2.0 Patterns](https://www.baeldung.com/spring-cloud-gateway-oauth2)
- [URL Rewriting With Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-url-rewriting)
+- [Processing the Response Body in Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-response-body)
diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml
index 98828a76f2..8af035e1db 100644
--- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml
+++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml
@@ -86,4 +86,4 @@
1.1.8.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/pom.xml
index ffd9097f2a..ab7685a764 100644
--- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/pom.xml
+++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/pom.xml
@@ -18,4 +18,4 @@
travel-agency-service
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml
index 1e93f7eaac..e5612e8e3d 100644
--- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml
+++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml
@@ -61,4 +61,4 @@
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/pom.xml
index 4550750f58..b778ee1b57 100644
--- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/pom.xml
+++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/pom.xml
@@ -18,4 +18,4 @@
demo-frontend
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-selfhealing/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-selfhealing/pom.xml
index ff49aa12d4..d9e004dea7 100644
--- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-selfhealing/pom.xml
+++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-selfhealing/pom.xml
@@ -18,4 +18,4 @@
readiness-example
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-kubernetes/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/pom.xml
index 1bd1aaeebd..be555d01e9 100644
--- a/spring-cloud-modules/spring-cloud-kubernetes/pom.xml
+++ b/spring-cloud-modules/spring-cloud-kubernetes/pom.xml
@@ -36,4 +36,4 @@
2021.0.0
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml
index 254a0376b6..0d95714bf9 100644
--- a/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml
+++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/pom.xml
@@ -16,12 +16,15 @@
0.0.1-SNAPSHOT
../../parent-boot-2
+
sidecar-demo
echo-demo
+
2.2.10.RELEASE
2.3.12.RELEASE
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml
index 22032d5081..3c8d498456 100644
--- a/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml
+++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/sidecar-demo/pom.xml
@@ -1,16 +1,19 @@
-
+
4.0.0
sidecar-demo
sidecar-demo
Sidecar demo for hello endpoint
+
com.baeldung.cloud
spring-cloud-netflix-sidecar
0.0.1-SNAPSHOT
../pom.xml
+
org.springframework.boot
@@ -41,6 +44,7 @@
test
+
@@ -49,4 +53,5 @@
-
+
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-sleuth/pom.xml b/spring-cloud-modules/spring-cloud-sleuth/pom.xml
index 14db7e02ea..dbc922e446 100644
--- a/spring-cloud-modules/spring-cloud-sleuth/pom.xml
+++ b/spring-cloud-modules/spring-cloud-sleuth/pom.xml
@@ -42,4 +42,4 @@
3.1.0
-
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-stream-starters/pom.xml b/spring-cloud-modules/spring-cloud-stream-starters/pom.xml
index 82252b3a55..845436d4e0 100644
--- a/spring-cloud-modules/spring-cloud-stream-starters/pom.xml
+++ b/spring-cloud-modules/spring-cloud-stream-starters/pom.xml
@@ -34,4 +34,4 @@
2021.0.0
-
+
\ No newline at end of file
diff --git a/spring-core-6/README.md b/spring-core-6/README.md
new file mode 100644
index 0000000000..e5d425aa74
--- /dev/null
+++ b/spring-core-6/README.md
@@ -0,0 +1,3 @@
+
+### Relevant Articles:
+- [Instantiating Multiple Beans of the Same Class with Spring Annotations](https://www.baeldung.com/spring-same-class-multiple-beans)
diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml
new file mode 100644
index 0000000000..92cd343234
--- /dev/null
+++ b/spring-core-6/pom.xml
@@ -0,0 +1,76 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-core-6
+ 0.0.1-SNAPSHOT
+ spring-core-6
+ http://www.baeldung.com
+
+
+ UTF-8
+ 11
+ 11
+
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 2.0.0.RELEASE
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java
new file mode 100644
index 0000000000..04fa6577ac
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/Person.java
@@ -0,0 +1,17 @@
+package com.baeldung.multibeaninstantiation.solution1;
+
+public class Person {
+ private String firstName;
+ private String lastName;
+
+ public Person(String firstName, String secondName) {
+ super();
+ this.firstName = firstName;
+ this.lastName = secondName;
+ }
+
+ @Override
+ public String toString() {
+ return "Person [firstName=" + firstName + ", secondName=" + lastName + "]";
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java
new file mode 100644
index 0000000000..ac05ffc0fa
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/PersonConfig.java
@@ -0,0 +1,17 @@
+package com.baeldung.multibeaninstantiation.solution1;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class PersonConfig {
+ @Bean
+ public Person personOne() {
+ return new Person("Harold", "Finch");
+ }
+
+ @Bean
+ public Person personTwo() {
+ return new Person("John", "Reese");
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java
new file mode 100644
index 0000000000..c2bc70f3ba
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution1/SpringApp1.java
@@ -0,0 +1,11 @@
+package com.baeldung.multibeaninstantiation.solution1;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringApp1 {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringApp1.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java
new file mode 100644
index 0000000000..a1801d1fd2
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/Person.java
@@ -0,0 +1,17 @@
+package com.baeldung.multibeaninstantiation.solution2;
+
+public class Person {
+ private String firstName;
+ private String lastName;
+
+ public Person(String firstName, String secondName) {
+ super();
+ this.firstName = firstName;
+ this.lastName = secondName;
+ }
+
+ @Override
+ public String toString() {
+ return "Person [firstName=" + firstName + ", secondName=" + lastName + "]";
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java
new file mode 100644
index 0000000000..da97314579
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonConfig.java
@@ -0,0 +1,10 @@
+package com.baeldung.multibeaninstantiation.solution2;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan("com.baeldung.multibeaninstantiation.solution2")
+public class PersonConfig {
+
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java
new file mode 100644
index 0000000000..5d56082f71
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonOne.java
@@ -0,0 +1,13 @@
+package com.baeldung.multibeaninstantiation.solution2;
+
+import org.springframework.stereotype.Component;
+
+import com.baeldung.multibeaninstantiation.solution2.Person;
+
+@Component
+public class PersonOne extends Person {
+
+ public PersonOne() {
+ super("Harold", "Finch");
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java
new file mode 100644
index 0000000000..436bd0e96e
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/PersonTwo.java
@@ -0,0 +1,13 @@
+package com.baeldung.multibeaninstantiation.solution2;
+
+import org.springframework.stereotype.Component;
+
+import com.baeldung.multibeaninstantiation.solution2.Person;
+
+@Component
+public class PersonTwo extends Person {
+
+ public PersonTwo() {
+ super("John", "Reese");
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java
new file mode 100644
index 0000000000..328ba32777
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution2/SpringApp2.java
@@ -0,0 +1,11 @@
+package com.baeldung.multibeaninstantiation.solution2;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringApp2 {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringApp2.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java
new file mode 100644
index 0000000000..d73bd9dfdc
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Human.java
@@ -0,0 +1,33 @@
+package com.baeldung.multibeaninstantiation.solution3;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Assert;
+
+public class Human implements InitializingBean {
+
+ private Person personOne;
+
+ private Person personTwo;
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ Assert.notNull(personOne, "Harold is alive!");
+ Assert.notNull(personTwo, "John is alive!");
+ }
+
+ /* Setter injection */
+ @Autowired
+ public void setPersonOne(Person personOne) {
+ this.personOne = personOne;
+ this.personOne.setFirstName("Harold");
+ this.personOne.setSecondName("Finch");
+ }
+
+ @Autowired
+ public void setPersonTwo(Person personTwo) {
+ this.personTwo = personTwo;
+ this.personTwo.setFirstName("John");
+ this.personTwo.setSecondName("Reese");
+ }
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java
new file mode 100644
index 0000000000..1753d28d7e
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/MultiBeanFactory.java
@@ -0,0 +1,9 @@
+package com.baeldung.multibeaninstantiation.solution3;
+
+import java.util.List;
+
+public interface MultiBeanFactory {
+ List getObject(String name) throws Exception;
+
+ Class> getObjectType();
+}
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java
new file mode 100644
index 0000000000..a26aee121f
--- /dev/null
+++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/Person.java
@@ -0,0 +1,49 @@
+package com.baeldung.multibeaninstantiation.solution3;
+
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+@Qualifier(value = "personOne, personTwo")
+public class Person implements FactoryBean
-
org.springframework.boot
spring-boot-starter-test
diff --git a/spring-ejb-modules/pom.xml b/spring-ejb-modules/pom.xml
index 9a4bfa2823..152194e72a 100755
--- a/spring-ejb-modules/pom.xml
+++ b/spring-ejb-modules/pom.xml
@@ -24,7 +24,7 @@
-
junit
@@ -93,4 +93,4 @@
3.2
-
+
\ No newline at end of file
diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index ce718e5661..a75638d085 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -15,20 +15,20 @@
- spring-5-security
- spring-5-security-cognito
- spring-5-security-oauth
- spring-ldap
+ spring-5-security
spring-security-acl
spring-security-auth0
+ spring-security-cognito
spring-security-core
spring-security-core-2
spring-security-ldap
spring-security-legacy-oidc
+ spring-security-oauth2
spring-security-oauth2-sso
spring-security-oidc
spring-security-okta
spring-security-saml
+ spring-security-social-login
spring-security-web-angular
spring-security-web-boot-1
spring-security-web-boot-2
@@ -45,7 +45,6 @@
spring-security-web-sockets
spring-security-web-thymeleaf
spring-security-web-x509
- spring-social-login
spring-security-opa
diff --git a/spring-security-modules/spring-ldap/.gitignore b/spring-security-modules/spring-ldap/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/spring-security-modules/spring-ldap/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.class
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
\ No newline at end of file
diff --git a/spring-security-modules/spring-ldap/README.md b/spring-security-modules/spring-ldap/README.md
deleted file mode 100644
index 4872f897e1..0000000000
--- a/spring-security-modules/spring-ldap/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-## Spring LDAP
-
-This module contains articles about Spring LDAP
-
-### Relevant articles
-
-- [Spring LDAP Overview](https://www.baeldung.com/spring-ldap)
-- [Guide to Spring Data LDAP](https://www.baeldung.com/spring-data-ldap)
diff --git a/spring-security-modules/spring-ldap/pom.xml b/spring-security-modules/spring-ldap/pom.xml
deleted file mode 100644
index 086be2df5a..0000000000
--- a/spring-security-modules/spring-ldap/pom.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
- 4.0.0
- spring-ldap
- 0.1-SNAPSHOT
- spring-ldap
- jar
-
-
- com.baeldung
- spring-security-modules
- 0.0.1-SNAPSHOT
-
-
-
-
- org.springframework.ldap
- spring-ldap-core
- ${spring-ldap.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
- org.springframework
- spring-context
- ${spring-context.version}
-
-
-
- org.springframework.ldap
- spring-ldap-test
- ${spring-ldap.version}
- test
-
-
- commons-logging
- commons-logging
-
-
-
-
-
- org.apache.directory.server
- apacheds-core
- ${apacheds.version}
- test
-
-
- org.apache.directory.server
- apacheds-core-entry
- ${apacheds.version}
- test
-
-
- org.apache.directory.server
- apacheds-protocol-shared
- ${apacheds.version}
- test
-
-
- org.apache.directory.server
- apacheds-protocol-ldap
- ${apacheds.version}
- test
-
-
- org.apache.directory.server
- apacheds-server-jndi
- ${apacheds.version}
- test
-
-
- org.apache.directory.shared
- shared-ldap
- ${shared-ldap.version}
- test
-
-
-
- org.springframework.data
- spring-data-ldap
- ${spring-data-ldap.version}
-
-
- org.springframework.data
- spring-data-jpa
- ${spring-data-jpa.version}
-
-
-
-
- spring-ldap
-
-
-
-
- live
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
- **/*LiveTest.java
-
-
-
-
-
-
-
-
-
-
-
- 2.3.1.RELEASE
- 4.3.6.RELEASE
- 1.5.5
- 0.9.15
- 1.0.6.RELEASE
- 1.11.6.RELEASE
-
-
-
\ No newline at end of file
diff --git a/spring-security-modules/spring-ldap/src/main/resources/application.properties b/spring-security-modules/spring-ldap/src/main/resources/application.properties
deleted file mode 100644
index 670fb79234..0000000000
--- a/spring-security-modules/spring-ldap/src/main/resources/application.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-ldap.partitionSuffix=dc=example,dc=com
-ldap.partition=example
-ldap.principal=uid=admin,ou=system
-ldap.password=secret
-ldap.port=18889
-ldap.url=ldap://localhost:18889
\ No newline at end of file
diff --git a/spring-security-modules/spring-ldap/src/main/resources/logback.xml b/spring-security-modules/spring-ldap/src/main/resources/logback.xml
deleted file mode 100644
index 7bd5154680..0000000000
--- a/spring-security-modules/spring-ldap/src/main/resources/logback.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-security-modules/spring-ldap/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-ldap/src/test/java/org/baeldung/SpringContextTest.java
deleted file mode 100644
index 8f0c3d4612..0000000000
--- a/spring-security-modules/spring-ldap/src/test/java/org/baeldung/SpringContextTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.baeldung;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.baeldung.ldap.javaconfig.AppConfig;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = AppConfig.class)
-public class SpringContextTest {
-
- @Test
- public void whenSpringContextIsBootstrapped_thenNoExceptions() {
- }
-}
diff --git a/spring-security-modules/spring-5-security-cognito/README.md b/spring-security-modules/spring-security-cognito/README.md
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/README.md
rename to spring-security-modules/spring-security-cognito/README.md
diff --git a/spring-security-modules/spring-5-security-cognito/pom.xml b/spring-security-modules/spring-security-cognito/pom.xml
similarity index 96%
rename from spring-security-modules/spring-5-security-cognito/pom.xml
rename to spring-security-modules/spring-security-cognito/pom.xml
index 4da8b2fae5..56754ddf99 100644
--- a/spring-security-modules/spring-5-security-cognito/pom.xml
+++ b/spring-security-modules/spring-security-cognito/pom.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- spring-5-security-cognito
+ spring-security-cognito
0.0.1-SNAPSHOT
- spring-5-security-cognito
+ spring-security-cognito
jar
spring 5 security oauth cognito sample project
diff --git a/spring-security-modules/spring-5-security-cognito/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java
rename to spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java
diff --git a/spring-security-modules/spring-5-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java
rename to spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java
diff --git a/spring-security-modules/spring-5-security-cognito/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java
rename to spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java
diff --git a/spring-security-modules/spring-5-security-cognito/src/main/resources/application.yml b/spring-security-modules/spring-security-cognito/src/main/resources/application.yml
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/src/main/resources/application.yml
rename to spring-security-modules/spring-security-cognito/src/main/resources/application.yml
diff --git a/spring-security-modules/spring-5-security-cognito/src/main/resources/logback.xml b/spring-security-modules/spring-security-cognito/src/main/resources/logback.xml
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/src/main/resources/logback.xml
rename to spring-security-modules/spring-security-cognito/src/main/resources/logback.xml
diff --git a/spring-security-modules/spring-5-security-cognito/src/main/resources/templates/home.html b/spring-security-modules/spring-security-cognito/src/main/resources/templates/home.html
similarity index 100%
rename from spring-security-modules/spring-5-security-cognito/src/main/resources/templates/home.html
rename to spring-security-modules/spring-security-cognito/src/main/resources/templates/home.html
diff --git a/spring-security-modules/spring-security-core-2/pom.xml b/spring-security-modules/spring-security-core-2/pom.xml
index cf150bfd42..e540d7bc01 100644
--- a/spring-security-modules/spring-security-core-2/pom.xml
+++ b/spring-security-modules/spring-security-core-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-security-core-2
0.1-SNAPSHOT
@@ -52,7 +52,7 @@
- spring-security-core
+ spring-security-core-2
src/main/resources
diff --git a/spring-security-modules/spring-security-ldap/README.md b/spring-security-modules/spring-security-ldap/README.md
index 288791b389..d396d67f56 100644
--- a/spring-security-modules/spring-security-ldap/README.md
+++ b/spring-security-modules/spring-security-ldap/README.md
@@ -8,8 +8,9 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com
### Relevant Article:
-- [Spring Security – security none, filters none, access permitAll](https://www.baeldung.com/security-none-filters-none-access-permitAll)
- [Intro to Spring Security LDAP](https://www.baeldung.com/spring-security-ldap)
+- [Spring LDAP Overview](https://www.baeldung.com/spring-ldap)
+- [Guide to Spring Data LDAP](https://www.baeldung.com/spring-data-ldap)
### Notes
diff --git a/spring-security-modules/spring-security-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml
index 3755c33125..73b77184d1 100644
--- a/spring-security-modules/spring-security-ldap/pom.xml
+++ b/spring-security-modules/spring-security-ldap/pom.xml
@@ -44,6 +44,27 @@
apacheds-server-jndi
${apacheds.version}
+
+
+ org.springframework.data
+ spring-data-ldap
+
+
+ org.springframework.data
+ spring-data-jpa
+
+
+
+ org.springframework.ldap
+ spring-ldap-test
+ test
+
+
+ commons-logging
+ commons-logging
+
+
+
diff --git a/spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/client/LdapClient.java
diff --git a/spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/repository/User.java
diff --git a/spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/repository/UserRepository.java
diff --git a/spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/service/LdapClient.java
diff --git a/spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/data/service/UserService.java
diff --git a/spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java
rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/ldap/javaconfig/AppConfig.java
diff --git a/spring-security-modules/spring-security-ldap/src/main/resources/application.properties b/spring-security-modules/spring-security-ldap/src/main/resources/application.properties
index 3d0221bb7b..cbe57f420f 100644
--- a/spring-security-modules/spring-security-ldap/src/main/resources/application.properties
+++ b/spring-security-modules/spring-security-ldap/src/main/resources/application.properties
@@ -1 +1,8 @@
-management.health.ldap.enabled=false
\ No newline at end of file
+management.health.ldap.enabled=false
+
+ldap.partitionSuffix=dc=example,dc=com
+ldap.partition=example
+ldap.principal=uid=admin,ou=system
+ldap.password=secret
+ldap.port=18889
+ldap.url=ldap://localhost:18889
\ No newline at end of file
diff --git a/spring-security-modules/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java
rename to spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/ldap/client/LdapClientLiveTest.java
diff --git a/spring-security-modules/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryIntegrationTest.java b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryIntegrationTest.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryIntegrationTest.java
rename to spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/ldap/client/LdapDataRepositoryIntegrationTest.java
diff --git a/spring-security-modules/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java
similarity index 100%
rename from spring-security-modules/spring-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java
rename to spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/ldap/javaconfig/TestConfig.java
diff --git a/spring-security-modules/spring-ldap/src/test/resources/test.ldif b/spring-security-modules/spring-security-ldap/src/test/resources/test.ldif
similarity index 100%
rename from spring-security-modules/spring-ldap/src/test/resources/test.ldif
rename to spring-security-modules/spring-security-ldap/src/test/resources/test.ldif
diff --git a/spring-security-modules/spring-ldap/src/test/resources/test_application.properties b/spring-security-modules/spring-security-ldap/src/test/resources/test_application.properties
similarity index 100%
rename from spring-security-modules/spring-ldap/src/test/resources/test_application.properties
rename to spring-security-modules/spring-security-ldap/src/test/resources/test_application.properties
diff --git a/spring-security-modules/spring-5-security-oauth/README.md b/spring-security-modules/spring-security-oauth2/README.md
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/README.md
rename to spring-security-modules/spring-security-oauth2/README.md
diff --git a/spring-security-modules/spring-5-security-oauth/pom.xml b/spring-security-modules/spring-security-oauth2/pom.xml
similarity index 97%
rename from spring-security-modules/spring-5-security-oauth/pom.xml
rename to spring-security-modules/spring-security-oauth2/pom.xml
index 8449b01ec0..e2ff51f98f 100644
--- a/spring-security-modules/spring-5-security-oauth/pom.xml
+++ b/spring-security-modules/spring-security-oauth2/pom.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- spring-5-security-oauth
+ spring-5-oauth2
0.0.1-SNAPSHOT
- spring-5-security-oauth
+ spring-security-oauth2
jar
spring 5 security oauth sample project
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/JerseyApplication.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/JerseyApplication.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/JerseyApplication.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/JerseyApplication.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/JerseyResource.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/JerseyResource.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/JerseyResource.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/JerseyResource.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/RestConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/RestConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/RestConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/RestConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/jersey/SecurityConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/SecurityConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LoginController.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/LoginController.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LoginController.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/LoginController.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/MvcConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/MvcConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/MvcConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/MvcConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SecurityConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/AppController.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/AppController.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/AppController.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/AppController.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/GithubRepo.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/GithubRepo.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/GithubRepo.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/GithubRepo.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/SpringSecurityOauth2ClientApplication.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SpringSecurityOauth2ClientApplication.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/java/com/baeldung/oauth2resttemplate/SpringSecurityOauth2ClientApplication.java
rename to spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SpringSecurityOauth2ClientApplication.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2-extractors-baeldung.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-baeldung.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2-extractors-baeldung.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-baeldung.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2-extractors-github.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-github.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2-extractors-github.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-github.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2-rest-template.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-rest-template.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2-rest-template.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-rest-template.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/application-oauth2.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/application.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/application.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/application.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/default-application.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/default-application.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/default-application.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/default-application.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/jersey-application.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/jersey-application.properties
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/jersey-application.properties
rename to spring-security-modules/spring-security-oauth2/src/main/resources/jersey-application.properties
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/logback.xml b/spring-security-modules/spring-security-oauth2/src/main/resources/logback.xml
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/logback.xml
rename to spring-security-modules/spring-security-oauth2/src/main/resources/logback.xml
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/static/css/main.css b/spring-security-modules/spring-security-oauth2/src/main/resources/static/css/main.css
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/static/css/main.css
rename to spring-security-modules/spring-security-oauth2/src/main/resources/static/css/main.css
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/index.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/index.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/index.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/index.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/loginFailure.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/loginFailure.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/loginFailure.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/loginFailure.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/loginSuccess.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/loginSuccess.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/loginSuccess.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/loginSuccess.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2_extractors.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2_extractors.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2_extractors.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2_extractors.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/error.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/error.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/error.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/error.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/home.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/home.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/home.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/home.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/index.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/index.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/index.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/index.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/repositories.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/repositories.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth2resttemplate/repositories.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth2resttemplate/repositories.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth_login.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth_login.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/oauth_login.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/oauth_login.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/main/resources/templates/securedPage.html b/spring-security-modules/spring-security-oauth2/src/main/resources/templates/securedPage.html
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/main/resources/templates/securedPage.html
rename to spring-security-modules/spring-security-oauth2/src/main/resources/templates/securedPage.html
diff --git a/spring-security-modules/spring-5-security-oauth/src/test/java/com/baeldung/jersey/JerseyResourceUnitTest.java b/spring-security-modules/spring-security-oauth2/src/test/java/com/baeldung/jersey/JerseyResourceUnitTest.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/test/java/com/baeldung/jersey/JerseyResourceUnitTest.java
rename to spring-security-modules/spring-security-oauth2/src/test/java/com/baeldung/jersey/JerseyResourceUnitTest.java
diff --git a/spring-security-modules/spring-5-security-oauth/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java b/spring-security-modules/spring-security-oauth2/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java
similarity index 100%
rename from spring-security-modules/spring-5-security-oauth/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java
rename to spring-security-modules/spring-security-oauth2/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java
diff --git a/spring-security-modules/spring-social-login/README.md b/spring-security-modules/spring-security-social-login/README.md
similarity index 100%
rename from spring-security-modules/spring-social-login/README.md
rename to spring-security-modules/spring-security-social-login/README.md
diff --git a/spring-security-modules/spring-social-login/pom.xml b/spring-security-modules/spring-security-social-login/pom.xml
similarity index 94%
rename from spring-security-modules/spring-social-login/pom.xml
rename to spring-security-modules/spring-security-social-login/pom.xml
index ad4b7c72a6..ddda4235be 100644
--- a/spring-security-modules/spring-social-login/pom.xml
+++ b/spring-security-modules/spring-security-social-login/pom.xml
@@ -3,8 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- spring-social-login
- spring-social-login
+ spring-security-social-login
+ spring-security-social-login
war
@@ -66,7 +66,7 @@
- spring-social-login
+ spring-security-social-login
src/main/resources
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/config/Application.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/config/Application.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/config/Application.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/config/Application.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/config/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/config/SecurityConfig.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/config/WebConfig.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/config/WebConfig.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/config/WebConfig.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/config/WebConfig.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/persistence/model/User.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/persistence/model/User.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/persistence/model/User.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/persistence/model/User.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java
diff --git a/spring-security-modules/spring-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java b/spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java
rename to spring-security-modules/spring-security-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java
diff --git a/spring-security-modules/spring-social-login/src/main/resources/application.properties b/spring-security-modules/spring-security-social-login/src/main/resources/application.properties
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/resources/application.properties
rename to spring-security-modules/spring-security-social-login/src/main/resources/application.properties
diff --git a/spring-security-modules/spring-social-login/src/main/resources/data.sql b/spring-security-modules/spring-security-social-login/src/main/resources/data.sql
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/resources/data.sql
rename to spring-security-modules/spring-security-social-login/src/main/resources/data.sql
diff --git a/spring-security-modules/spring-social-login/src/main/resources/logback.xml b/spring-security-modules/spring-security-social-login/src/main/resources/logback.xml
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/resources/logback.xml
rename to spring-security-modules/spring-security-social-login/src/main/resources/logback.xml
diff --git a/spring-security-modules/spring-social-login/src/main/resources/templates/index.html b/spring-security-modules/spring-security-social-login/src/main/resources/templates/index.html
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/resources/templates/index.html
rename to spring-security-modules/spring-security-social-login/src/main/resources/templates/index.html
diff --git a/spring-security-modules/spring-social-login/src/main/resources/templates/login.html b/spring-security-modules/spring-security-social-login/src/main/resources/templates/login.html
similarity index 100%
rename from spring-security-modules/spring-social-login/src/main/resources/templates/login.html
rename to spring-security-modules/spring-security-social-login/src/main/resources/templates/login.html
diff --git a/spring-security-modules/spring-social-login/src/test/java/com/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-social-login/src/test/java/com/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-security-modules/spring-social-login/src/test/java/com/baeldung/SpringContextTest.java
rename to spring-security-modules/spring-security-social-login/src/test/java/com/baeldung/SpringContextTest.java
diff --git a/spring-security-modules/spring-security-web-angular/pom.xml b/spring-security-modules/spring-security-web-angular/pom.xml
index 18d35708f6..cf23501dff 100644
--- a/spring-security-modules/spring-security-web-angular/pom.xml
+++ b/spring-security-modules/spring-security-web-angular/pom.xml
@@ -18,4 +18,4 @@
server
-
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-mvc/README.md b/spring-security-modules/spring-security-web-mvc/README.md
index bb4cfe1a4f..49831ea970 100644
--- a/spring-security-modules/spring-security-web-mvc/README.md
+++ b/spring-security-modules/spring-security-web-mvc/README.md
@@ -11,6 +11,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com
- [HttpSessionListener Example – Monitoring](https://www.baeldung.com/httpsessionlistener_with_metrics)
- [Control the Session with Spring Security](https://www.baeldung.com/spring-security-session)
- [The Clear-Site-Data Header in Spring Security](https://www.baeldung.com/spring-security-clear-site-data-header)
+- [Spring Security – security none, filters none, access permitAll](https://www.baeldung.com/security-none-filters-none-access-permitAll)
### Build the Project
diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml
index 24726985f6..faf4b33e08 100644
--- a/spring-vault/pom.xml
+++ b/spring-vault/pom.xml
@@ -15,7 +15,7 @@
0.0.1-SNAPSHOT
../parent-boot-2
-
+
diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml
index a2bdc9035e..62be6fbb3c 100644
--- a/spring-web-modules/pom.xml
+++ b/spring-web-modules/pom.xml
@@ -47,7 +47,6 @@
spring-thymeleaf-3
spring-thymeleaf-4
spring-thymeleaf-5
- spring-boot-jsp
spring-web-url
diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md
index 5101f92928..1f78e7c9c6 100644
--- a/testing-modules/junit-5/README.md
+++ b/testing-modules/junit-5/README.md
@@ -1,7 +1,6 @@
### Relevant Articles:
- [A Guide to JUnit 5 Extensions](https://www.baeldung.com/junit-5-extensions)
- [Inject Parameters into JUnit Jupiter Unit Tests](https://www.baeldung.com/junit-5-parameters)
-- [Mockito and JUnit 5 – Using ExtendWith](https://www.baeldung.com/mockito-junit-5-extension)
- [The Order of Tests in JUnit](https://www.baeldung.com/junit-5-test-order)
- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java)
- [Testing an Abstract Class With JUnit](https://www.baeldung.com/junit-test-abstract-class)
diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md
index 4bd2ff9759..6fd71bf305 100644
--- a/testing-modules/mockito-2/README.md
+++ b/testing-modules/mockito-2/README.md
@@ -6,7 +6,5 @@
- [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis)
- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value)
- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers)
-- [Mockito – Using Spies](https://www.baeldung.com/mockito-spy)
-- [Using Mockito ArgumentCaptor](https://www.baeldung.com/mockito-argumentcaptor)
- [Difference Between when() and doXxx() Methods in Mockito](https://www.baeldung.com/java-mockito-when-vs-do)
- [Overview of Mockito MockSettings](https://www.baeldung.com/mockito-mocksettings)
diff --git a/testing-modules/mockito-3/.gitignore b/testing-modules/mockito-3/.gitignore
deleted file mode 100644
index 38fe5148c1..0000000000
--- a/testing-modules/mockito-3/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-/.settings/
-/.classpath
-/.project
\ No newline at end of file
diff --git a/testing-modules/mockito-3/README.md b/testing-modules/mockito-3/README.md
deleted file mode 100644
index c9766031a3..0000000000
--- a/testing-modules/mockito-3/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Mocking Static Methods With Mockito](https://www.baeldung.com/mockito-mock-static-methods)
diff --git a/testing-modules/mockito-3/pom.xml b/testing-modules/mockito-3/pom.xml
deleted file mode 100644
index 70c76f15ff..0000000000
--- a/testing-modules/mockito-3/pom.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
- 4.0.0
- mockito-3
- 0.0.1-SNAPSHOT
- mockito-3
- jar
-
-
- com.baeldung
- testing-modules
- 1.0.0-SNAPSHOT
-
-
-
-
- org.mockito
- mockito-inline
- ${mockito.version}
- test
-
-
-
-
\ No newline at end of file
diff --git a/testing-modules/mockito-simple/README.md b/testing-modules/mockito-simple/README.md
new file mode 100644
index 0000000000..56b3482c60
--- /dev/null
+++ b/testing-modules/mockito-simple/README.md
@@ -0,0 +1,23 @@
+### Mockito Articles that are also part of the e-book
+
+This module contains articles about Mockito that are also part of an Ebook.
+
+## Relevant articles:
+
+- [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](https://www.baeldung.com/mockito-annotations)
+- [Mockito When/Then Cookbook](https://www.baeldung.com/mockito-behavior)
+- [Mockito’s Mock Methods](https://www.baeldung.com/mockito-mock-methods)
+- [Mockito Verify Cookbook](https://www.baeldung.com/mockito-verify)
+- [Mockito ArgumentMatchers](https://www.baeldung.com/mockito-argument-matchers)
+- [Mockito – Using Spies](https://www.baeldung.com/mockito-spy)
+- [Using Mockito ArgumentCaptor](https://www.baeldung.com/mockito-argumentcaptor)
+- [Mocking Void Methods with Mockito](https://www.baeldung.com/mockito-void-methods)
+- [Mocking Static Methods With Mockito](https://www.baeldung.com/mockito-mock-static-methods)
+- [Mock Final Classes and Methods with Mockito](https://www.baeldung.com/mockito-final)
+- [Mocking Exception Throwing using Mockito](https://www.baeldung.com/mockito-exceptions)
+- [Mockito and JUnit 5 – Using ExtendWith](https://www.baeldung.com/mockito-junit-5-extension)
+
+
+### NOTE:
+
+Since this is a module tied to an e-book, it should **not** be moved or used to store the code for any further article.
diff --git a/testing-modules/mockito-simple/pom.xml b/testing-modules/mockito-simple/pom.xml
new file mode 100644
index 0000000000..af0c63520a
--- /dev/null
+++ b/testing-modules/mockito-simple/pom.xml
@@ -0,0 +1,88 @@
+
+
+ 4.0.0
+ mockito-simple
+ mockito-simple
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.springframework
+ spring-web
+ ${spring-framework.version}
+
+
+ org.springframework
+ spring-core
+ ${spring-framework.version}
+
+
+ org.springframework
+ spring-context
+ ${spring-framework.version}
+
+
+ org.springframework.data
+ spring-data-jpa
+ ${spring-data.version}
+
+
+ org.eclipse.persistence
+ javax.persistence
+ ${javax.persistence.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot.version}
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring-boot.version}
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ ${mockito.version}
+ test
+
+
+
+
+ mockito-simple
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 2.0.4.RELEASE
+ 5.0.8.RELEASE
+ 2.0.9.RELEASE
+
+ 2.0.2
+ 2.1.1
+
+
+
diff --git a/spring-mockito/src/main/java/com/baeldung/app/api/Flower.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/app/api/Flower.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/app/api/Flower.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/app/api/Flower.java
diff --git a/spring-mockito/src/main/java/com/baeldung/app/api/MessageApi.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/app/api/MessageApi.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/app/api/MessageApi.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/app/api/MessageApi.java
diff --git a/spring-mockito/src/main/java/com/baeldung/app/rest/FlowerController.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/app/rest/FlowerController.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/app/rest/FlowerController.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/app/rest/FlowerController.java
diff --git a/spring-mockito/src/main/java/com/baeldung/app/rest/MessageController.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/app/rest/MessageController.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/app/rest/MessageController.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/app/rest/MessageController.java
diff --git a/spring-mockito/src/main/java/com/baeldung/domain/model/Message.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/domain/model/Message.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/domain/model/Message.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/domain/model/Message.java
diff --git a/spring-mockito/src/main/java/com/baeldung/domain/service/FlowerService.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/domain/service/FlowerService.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/domain/service/FlowerService.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/domain/service/FlowerService.java
diff --git a/spring-mockito/src/main/java/com/baeldung/domain/service/MessageService.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/domain/service/MessageService.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/domain/service/MessageService.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/domain/service/MessageService.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/User.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/User.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/service/Errors.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/service/Errors.java
diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/service/UserService.java
similarity index 100%
rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/junit5/mockito/service/UserService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/AuthenticationStatus.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/AuthenticationStatus.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/AuthenticationStatus.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/AuthenticationStatus.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/Credentials.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/Credentials.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/Credentials.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/Credentials.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/DeliveryPlatform.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/DeliveryPlatform.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/DeliveryPlatform.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/DeliveryPlatform.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/Email.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/Email.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/Email.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/Email.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/EmailService.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/EmailService.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/EmailService.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/EmailService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/Format.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/Format.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/Format.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/Format.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/ServiceStatus.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/ServiceStatus.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/argumentcaptor/ServiceStatus.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/argumentcaptor/ServiceStatus.java
diff --git a/testing-modules/mockito-3/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java b/testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java
similarity index 100%
rename from testing-modules/mockito-3/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java
rename to testing-modules/mockito-simple/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java
diff --git a/spring-mockito/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java
similarity index 100%
rename from spring-mockito/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java
diff --git a/spring-mockito/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java
similarity index 100%
rename from spring-mockito/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java
diff --git a/spring-mockito/src/main/java/com/baeldung/domain/util/MessageMatcher.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/domain/util/MessageMatcher.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/domain/util/MessageMatcher.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/domain/util/MessageMatcher.java
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java
similarity index 100%
rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/FinalList.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/FinalList.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinals.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinals.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInitWithMockitoJUnitRuleUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MyDictionary.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MyDictionary.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MyList.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MyList.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java
diff --git a/testing-modules/mockito-3/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java
similarity index 100%
rename from testing-modules/mockito-3/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java
similarity index 100%
rename from testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java
rename to testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java
diff --git a/testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-modules/mockito-simple/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
similarity index 100%
rename from testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
rename to testing-modules/mockito-simple/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md
index 38fb8225a6..6cc6bb8955 100644
--- a/testing-modules/mockito/README.md
+++ b/testing-modules/mockito/README.md
@@ -4,12 +4,5 @@
### Relevant Articles:
-- [Mockito Verify Cookbook](https://www.baeldung.com/mockito-verify)
-- [Mockito When/Then Cookbook](https://www.baeldung.com/mockito-behavior)
-- [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](https://www.baeldung.com/mockito-annotations)
-- [Mockito’s Mock Methods](https://www.baeldung.com/mockito-mock-methods)
-- [Mocking Exception Throwing using Mockito](https://www.baeldung.com/mockito-exceptions)
-- [Mocking Void Methods with Mockito](https://www.baeldung.com/mockito-void-methods)
-- [Mock Final Classes and Methods with Mockito](https://www.baeldung.com/mockito-final)
- [Testing Callbacks with Mockito](https://www.baeldung.com/mockito-callbacks)
- [Quick Guide to BDDMockito](https://www.baeldung.com/bdd-mockito)
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java
deleted file mode 100644
index 94054d1cbb..0000000000
--- a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package com.baeldung.mockito;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.*;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-
-//@RunWith(MockitoJUnitRunner.class)
-public class MockitoAnnotationIntegrationTest {
-
- @Mock
- private List mockedList;
-
- @Spy
- private List spiedList = new ArrayList<>();
-
- @Before
- public void init() {
- MockitoAnnotations.initMocks(this);
- }
-
- // tests
-
- @Test
- public void whenNotUseMockAnnotation_thenCorrect() {
- final List mockList = Mockito.mock(List.class);
- mockList.add("one");
- Mockito.verify(mockList).add("one");
- assertEquals(0, mockList.size());
-
- Mockito.when(mockList.size()).thenReturn(100);
- assertEquals(100, mockList.size());
- }
-
- @Test
- public void whenUseMockAnnotation_thenMockIsInjected() {
- mockedList.add("one");
- Mockito.verify(mockedList).add("one");
- assertEquals(0, mockedList.size());
-
- Mockito.when(mockedList.size()).thenReturn(100);
- assertEquals(100, mockedList.size());
- }
-
- @Test
- public void whenNotUseSpyAnnotation_thenCorrect() {
- final List spyList = Mockito.spy(new ArrayList());
- spyList.add("one");
- spyList.add("two");
-
- Mockito.verify(spyList).add("one");
- Mockito.verify(spyList).add("two");
-
- assertEquals(2, spyList.size());
-
- Mockito.doReturn(100).when(spyList).size();
- assertEquals(100, spyList.size());
- }
-
- @Test
- public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() {
- spiedList.add("one");
- spiedList.add("two");
-
- Mockito.verify(spiedList).add("one");
- Mockito.verify(spiedList).add("two");
-
- assertEquals(2, spiedList.size());
-
- Mockito.doReturn(100).when(spiedList).size();
- assertEquals(100, spiedList.size());
- }
-
- @Test
- public void whenNotUseCaptorAnnotation_thenCorrect() {
- final List mockList = Mockito.mock(List.class);
- final ArgumentCaptor arg = ArgumentCaptor.forClass(String.class);
- mockList.add("one");
- Mockito.verify(mockList).add(arg.capture());
-
- assertEquals("one", arg.getValue());
- }
-
- @Captor
- private
- ArgumentCaptor argCaptor;
-
- @Test
- public void whenUseCaptorAnnotation_thenTheSam() {
- mockedList.add("one");
- Mockito.verify(mockedList).add(argCaptor.capture());
-
- assertEquals("one", argCaptor.getValue());
- }
-
- @Mock
- private Map wordMap;
-
- @InjectMocks
- private MyDictionary dic = new MyDictionary();
-
- @Test
- public void whenUseInjectMocksAnnotation_thenCorrect() {
- Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning");
-
- assertEquals("aMeaning", dic.getMeaning("aWord"));
- }
-
-}
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java
deleted file mode 100644
index b9df6a456c..0000000000
--- a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.baeldung.mockito;
-
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.*;
-
-public class MockitoConfigExamplesIntegrationTest {
-
- // tests
-
- @Test
- public final void whenMockReturnBehaviorIsConfigured_thenBehaviorIsVerified() {
- final MyList listMock = Mockito.mock(MyList.class);
- when(listMock.add(anyString())).thenReturn(false);
-
- final boolean added = listMock.add(randomAlphabetic(6));
- assertThat(added, is(false));
- }
-
- @Test
- public final void whenMockReturnBehaviorIsConfigured2_thenBehaviorIsVerified() {
- final MyList listMock = Mockito.mock(MyList.class);
- doReturn(false).when(listMock).add(anyString());
-
- final boolean added = listMock.add(randomAlphabetic(6));
- assertThat(added, is(false));
- }
-
- @Test(expected = IllegalStateException.class)
- public final void givenMethodIsConfiguredToThrowException_whenCallingMethod_thenExceptionIsThrown() {
- final MyList listMock = Mockito.mock(MyList.class);
- when(listMock.add(anyString())).thenThrow(IllegalStateException.class);
-
- listMock.add(randomAlphabetic(6));
- }
-
- @Test(expected = NullPointerException.class)
- public final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() {
- final MyList listMock = Mockito.mock(MyList.class);
- doThrow(NullPointerException.class).when(listMock).clear();
-
- listMock.clear();
- }
-
- @Test
- public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingOnlyOnce_thenNoExceptionIsThrown() {
- final MyList listMock = Mockito.mock(MyList.class);
- when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class);
-
- listMock.add(randomAlphabetic(6));
- }
-
- @Test(expected = IllegalStateException.class)
- public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingTwice_thenExceptionIsThrown() {
- final MyList listMock = Mockito.mock(MyList.class);
- when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class);
-
- listMock.add(randomAlphabetic(6));
- listMock.add(randomAlphabetic(6));
- }
-
- @Test
- public final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() {
- final MyList listMock = Mockito.mock(MyList.class);
- when(listMock.size()).thenCallRealMethod();
-
- assertThat(listMock.size(), equalTo(1));
- }
-
- @Test
- public final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() {
- final MyList listMock = Mockito.mock(MyList.class);
- doAnswer(invocation -> "Always the same").when(listMock).get(anyInt());
-
- final String element = listMock.get(1);
- assertThat(element, is(equalTo("Always the same")));
- }
-
- @Test(expected = NullPointerException.class)
- public final void givenSpy_whenConfiguringBehaviorOfSpy_thenCorrectlyConfigured() {
- final MyList instance = new MyList();
- final MyList spy = Mockito.spy(instance);
-
- doThrow(NullPointerException.class).when(spy).size();
- spy.size();
- }
-
-}
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java
deleted file mode 100644
index 23fcba60b8..0000000000
--- a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.baeldung.mockito;
-
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.*;
-
-public class MockitoExceptionIntegrationTest {
-
- @Test(expected = NullPointerException.class)
- public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
- MyDictionary dictMock = mock(MyDictionary.class);
- when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class);
-
- dictMock.getMeaning("word");
- }
-
- @Test(expected = IllegalStateException.class)
- public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() {
- MyDictionary dictMock = mock(MyDictionary.class);
- doThrow(IllegalStateException.class).when(dictMock)
- .add(anyString(), anyString());
-
- dictMock.add("word", "meaning");
- }
-
- @Test(expected = NullPointerException.class)
- public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() {
- MyDictionary dictMock = mock(MyDictionary.class);
- when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred"));
-
- dictMock.getMeaning("word");
- }
-
- @Test(expected = IllegalStateException.class)
- public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() {
- MyDictionary dictMock = mock(MyDictionary.class);
- doThrow(new IllegalStateException("Error occurred")).when(dictMock)
- .add(anyString(), anyString());
-
- dictMock.add("word", "meaning");
- }
-
- // =====
-
- @Test(expected = NullPointerException.class)
- public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
- MyDictionary dict = new MyDictionary();
- MyDictionary spy = Mockito.spy(dict);
-
- when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class);
- spy.getMeaning("word");
- }
-}
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java
deleted file mode 100644
index 6dfe7f9d6b..0000000000
--- a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.baeldung.mockito;
-
-import com.google.common.collect.Lists;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
-import org.mockito.Mockito;
-import org.mockito.exceptions.verification.NoInteractionsWanted;
-
-import java.util.List;
-
-import static org.hamcrest.Matchers.hasItem;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.*;
-
-public class MockitoVerifyExamplesIntegrationTest {
-
- // tests
-
- @Test
- public final void givenInteractionWithMockOccurred_whenVerifyingInteraction_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.size();
- verify(mockedList).size();
- }
-
- @Test
- public final void givenOneInteractionWithMockOccurred_whenVerifyingNumberOfInteractions_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.size();
- verify(mockedList, times(1)).size();
- }
-
- @Test
- public final void givenNoInteractionWithMockOccurred_whenVerifyingInteractions_thenCorrect() {
- final List mockedList = mock(MyList.class);
- verifyNoInteractions(mockedList);
- }
-
- @Test
- public final void givenNoInteractionWithMethodOfMockOccurred_whenVerifyingInteractions_thenCorrect() {
- final List mockedList = mock(MyList.class);
- verify(mockedList, times(0)).size();
- }
-
- @Test(expected = NoInteractionsWanted.class)
- public final void givenUnverifiedInteraction_whenVerifyingNoUnexpectedInteractions_thenFail() {
- final List mockedList = mock(MyList.class);
- mockedList.size();
- mockedList.clear();
-
- verify(mockedList).size();
- verifyNoMoreInteractions(mockedList);
- }
-
- @Test
- public final void whenVerifyingOrderOfInteractions_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.size();
- mockedList.add("a parameter");
- mockedList.clear();
-
- final InOrder inOrder = Mockito.inOrder(mockedList);
- inOrder.verify(mockedList).size();
- inOrder.verify(mockedList).add("a parameter");
- inOrder.verify(mockedList).clear();
- }
-
- @Test
- public final void whenVerifyingAnInteractionHasNotOccurred_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.size();
-
- verify(mockedList, never()).clear();
- }
-
- @Test
- public final void whenVerifyingAnInteractionHasOccurredAtLeastOnce_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.clear();
- mockedList.clear();
- mockedList.clear();
-
- verify(mockedList, atLeast(1)).clear();
- verify(mockedList, atMost(10)).clear();
- }
-
- // with arguments
-
- @Test
- public final void whenVerifyingAnInteractionWithExactArgument_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.add("test");
-
- verify(mockedList).add("test");
- }
-
- @Test
- public final void whenVerifyingAnInteractionWithAnyArgument_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.add("test");
-
- verify(mockedList).add(anyString());
- }
-
- @Test
- public final void whenVerifyingAnInteractionWithArgumentCapture_thenCorrect() {
- final List mockedList = mock(MyList.class);
- mockedList.addAll(Lists.newArrayList("someElement"));
- final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(List.class);
- verify(mockedList).addAll(argumentCaptor.capture());
- final List capturedArgument = argumentCaptor.>getValue();
- assertThat(capturedArgument, hasItem("someElement"));
- }
-
-}
diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml
index 3d5db76827..f931cf6947 100644
--- a/testing-modules/pom.xml
+++ b/testing-modules/pom.xml
@@ -30,8 +30,8 @@
junit5-migration
load-testing-comparison
mockito-2
- mockito-3
mockito
+ mockito-simple
mocks
mockserver
parallel-tests-junit
@@ -39,6 +39,7 @@
rest-assured
rest-testing
selenium-junit-testng
+ spring-mockito
spring-testing-2
spring-testing
test-containers
@@ -50,4 +51,4 @@
zerocode
-
\ No newline at end of file
+
diff --git a/spring-mockito/.gitignore b/testing-modules/spring-mockito/.gitignore
similarity index 100%
rename from spring-mockito/.gitignore
rename to testing-modules/spring-mockito/.gitignore
diff --git a/spring-mockito/README.md b/testing-modules/spring-mockito/README.md
similarity index 70%
rename from spring-mockito/README.md
rename to testing-modules/spring-mockito/README.md
index 0ad8e05ce3..3fda392c0f 100644
--- a/spring-mockito/README.md
+++ b/testing-modules/spring-mockito/README.md
@@ -4,4 +4,3 @@ This module contains articles about Spring with Mockito
### Relevant Articles:
- [Injecting Mockito Mocks into Spring Beans](https://www.baeldung.com/injecting-mocks-in-spring)
-- [Mockito ArgumentMatchers](https://www.baeldung.com/mockito-argument-matchers)
diff --git a/spring-mockito/pom.xml b/testing-modules/spring-mockito/pom.xml
similarity index 94%
rename from spring-mockito/pom.xml
rename to testing-modules/spring-mockito/pom.xml
index e0d7bee6f3..117da9478e 100644
--- a/spring-mockito/pom.xml
+++ b/testing-modules/spring-mockito/pom.xml
@@ -13,7 +13,7 @@
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../../parent-boot-2
diff --git a/spring-mockito/src/main/java/com/baeldung/MocksApplication.java b/testing-modules/spring-mockito/src/main/java/com/baeldung/MocksApplication.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/MocksApplication.java
rename to testing-modules/spring-mockito/src/main/java/com/baeldung/MocksApplication.java
diff --git a/spring-mockito/src/main/java/com/baeldung/NameService.java b/testing-modules/spring-mockito/src/main/java/com/baeldung/NameService.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/NameService.java
rename to testing-modules/spring-mockito/src/main/java/com/baeldung/NameService.java
diff --git a/spring-mockito/src/main/java/com/baeldung/UserService.java b/testing-modules/spring-mockito/src/main/java/com/baeldung/UserService.java
similarity index 100%
rename from spring-mockito/src/main/java/com/baeldung/UserService.java
rename to testing-modules/spring-mockito/src/main/java/com/baeldung/UserService.java
diff --git a/spring-mockito/src/main/resources/application.properties b/testing-modules/spring-mockito/src/main/resources/application.properties
similarity index 100%
rename from spring-mockito/src/main/resources/application.properties
rename to testing-modules/spring-mockito/src/main/resources/application.properties
diff --git a/testing-modules/mockito-3/src/main/resources/logback.xml b/testing-modules/spring-mockito/src/main/resources/logback.xml
similarity index 100%
rename from testing-modules/mockito-3/src/main/resources/logback.xml
rename to testing-modules/spring-mockito/src/main/resources/logback.xml
diff --git a/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java b/testing-modules/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java
similarity index 100%
rename from spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java
rename to testing-modules/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java
diff --git a/spring-mockito/src/test/java/com/baeldung/UserServiceUnitTest.java b/testing-modules/spring-mockito/src/test/java/com/baeldung/UserServiceUnitTest.java
similarity index 100%
rename from spring-mockito/src/test/java/com/baeldung/UserServiceUnitTest.java
rename to testing-modules/spring-mockito/src/test/java/com/baeldung/UserServiceUnitTest.java
diff --git a/spring-mockito/src/test/java/org/baeldung/SpringContextTest.java b/testing-modules/spring-mockito/src/test/java/org/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-mockito/src/test/java/org/baeldung/SpringContextTest.java
rename to testing-modules/spring-mockito/src/test/java/org/baeldung/SpringContextTest.java
diff --git a/undertow/pom.xml b/undertow/pom.xml
index 9ec3aa8e6c..8bbdfe6e29 100644
--- a/undertow/pom.xml
+++ b/undertow/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.undertow
undertow
@@ -26,20 +27,10 @@
${project.artifactId}
-
+
org.apache.maven.plugins
maven-jar-plugin
@@ -57,7 +48,7 @@
1.4.18.Final
-
+
3.0.2
diff --git a/xml-2/pom.xml b/xml-2/pom.xml
index 025ad682ad..c4882b0a53 100644
--- a/xml-2/pom.xml
+++ b/xml-2/pom.xml
@@ -20,6 +20,12 @@
dom4j
${dom4j.version}
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter.version}
+ test
+
diff --git a/xml-2/src/main/java/com/baeldung/xml/validation/XmlErrorHandler.java b/xml-2/src/main/java/com/baeldung/xml/validation/XmlErrorHandler.java
new file mode 100644
index 0000000000..2a4651a029
--- /dev/null
+++ b/xml-2/src/main/java/com/baeldung/xml/validation/XmlErrorHandler.java
@@ -0,0 +1,35 @@
+package com.baeldung.xml.validation;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class XmlErrorHandler implements ErrorHandler {
+
+ private List exceptions;
+
+ public XmlErrorHandler() {
+ this.exceptions = new ArrayList<>();
+ }
+
+ public List getExceptions() {
+ return exceptions;
+ }
+
+ @Override
+ public void warning(SAXParseException exception) {
+ exceptions.add(exception);
+ }
+
+ @Override
+ public void error(SAXParseException exception) {
+ exceptions.add(exception);
+ }
+
+ @Override
+ public void fatalError(SAXParseException exception) {
+ exceptions.add(exception);
+ }
+}
diff --git a/xml-2/src/main/java/com/baeldung/xml/validation/XmlValidator.java b/xml-2/src/main/java/com/baeldung/xml/validation/XmlValidator.java
new file mode 100644
index 0000000000..7d8f531bfa
--- /dev/null
+++ b/xml-2/src/main/java/com/baeldung/xml/validation/XmlValidator.java
@@ -0,0 +1,62 @@
+package com.baeldung.xml.validation;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import javax.xml.XMLConstants;
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class XmlValidator {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(XmlValidator.class);
+
+ private String xsdPath;
+ private String xmlPath;
+
+ public XmlValidator(String xsdPath, String xmlPath) {
+ this.xsdPath = xsdPath;
+ this.xmlPath = xmlPath;
+ }
+
+ public boolean isValid() throws IOException, SAXException {
+ Validator validator = initValidator(xsdPath);
+ try {
+ validator.validate(new StreamSource(getFile(xmlPath)));
+ return true;
+ } catch (SAXException e) {
+ return false;
+ }
+ }
+
+ public List listParsingExceptions() throws IOException, SAXException {
+ XmlErrorHandler xsdErrorHandler = new XmlErrorHandler();
+ Validator validator = initValidator(xsdPath);
+ validator.setErrorHandler(xsdErrorHandler);
+ try {
+ validator.validate(new StreamSource(getFile(xmlPath)));
+ } catch (SAXParseException e) {}
+ xsdErrorHandler.getExceptions().forEach(e -> LOGGER.info(e.getMessage()));
+ return xsdErrorHandler.getExceptions();
+ }
+
+ private Validator initValidator(String xsdPath) throws SAXException {
+ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ Source schemaFile = new StreamSource(getFile(xsdPath));
+ Schema schema = factory.newSchema(schemaFile);
+ return schema.newValidator();
+ }
+
+ private File getFile(String location) {
+ return new File(getClass().getClassLoader().getResource(location).getFile());
+ }
+
+}
diff --git a/xml-2/src/main/resources/xml/validation/baeldung.xml b/xml-2/src/main/resources/xml/validation/baeldung.xml
new file mode 100644
index 0000000000..31ae4b4aa6
--- /dev/null
+++ b/xml-2/src/main/resources/xml/validation/baeldung.xml
@@ -0,0 +1,8 @@
+
+
+ Baeldung
+
+ 00001
+ New York
+
+
\ No newline at end of file
diff --git a/xml-2/src/main/resources/xml/validation/full-person.xsd b/xml-2/src/main/resources/xml/validation/full-person.xsd
new file mode 100644
index 0000000000..ea268c3a47
--- /dev/null
+++ b/xml-2/src/main/resources/xml/validation/full-person.xsd
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/xml-2/src/main/resources/xml/validation/person.xsd b/xml-2/src/main/resources/xml/validation/person.xsd
new file mode 100644
index 0000000000..22c41b6a22
--- /dev/null
+++ b/xml-2/src/main/resources/xml/validation/person.xsd
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/xml-2/src/test/java/com/baeldung/xml/validation/XmlValidatorUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/validation/XmlValidatorUnitTest.java
new file mode 100644
index 0000000000..2eb20a9bf2
--- /dev/null
+++ b/xml-2/src/test/java/com/baeldung/xml/validation/XmlValidatorUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.xml.validation;
+
+import org.junit.jupiter.api.Test;
+import org.xml.sax.SAXException;
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class XmlValidatorUnitTest {
+
+ private static final String BAELDUNG_XML_PATH = "xml/validation/baeldung.xml";
+ private static final String PERSON_XSD_PATH = "xml/validation/person.xsd";
+ private static final String FULL_PERSON_XSD_PATH = "xml/validation/full-person.xsd";
+
+ @Test
+ public void givenValidXML_WhenIsValid_ThenTrue() throws IOException, SAXException {
+ assertTrue(new XmlValidator(PERSON_XSD_PATH, BAELDUNG_XML_PATH).isValid());
+ }
+
+ @Test
+ public void givenInvalidXML_WhenIsValid_ThenFalse() throws IOException, SAXException {
+ assertFalse(new XmlValidator(FULL_PERSON_XSD_PATH, BAELDUNG_XML_PATH).isValid());
+ }
+
+ @Test
+ public void givenValidXML_WhenListParsingExceptions_ThenNone() throws IOException, SAXException {
+ assertEquals(0, new XmlValidator(PERSON_XSD_PATH, BAELDUNG_XML_PATH).listParsingExceptions().size());
+ }
+
+ @Test
+ public void givenInvalidXML_WhenListParsingExceptions_ThenHasThree() throws IOException, SAXException {
+ assertEquals(3, new XmlValidator(FULL_PERSON_XSD_PATH, BAELDUNG_XML_PATH).listParsingExceptions().size());
+ }
+
+}