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 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 { + private String firstName; + private String secondName; + + public Person() { + // initialization code (optional) + } + + @Override + public Class getObjectType() { + return Person.class; + } + + @Override + public Object getObject() throws Exception { + return new Person(); + } + + public boolean isSingleton() { + return true; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getSecondName() { + return secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + @Override + public String toString() { + return "Person [firstName=" + firstName + ", secondName=" + secondName + "]"; + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java new file mode 100644 index 0000000000..12b93ff860 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class PersonConfig { + @Bean + public PersonFactoryPostProcessor PersonFactoryPostProcessor() { + return new PersonFactoryPostProcessor(); + } + + @Bean + public Person person() { + return new Person(); + } + + @Bean + public Human human() { + return new Human(); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java new file mode 100644 index 0000000000..7eb124e1b0 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/PersonFactoryPostProcessor.java @@ -0,0 +1,33 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import java.util.Map; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; + +public class PersonFactoryPostProcessor implements BeanFactoryPostProcessor { + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + Map map = beanFactory.getBeansWithAnnotation(Qualifier.class); + for (Map.Entry entry : map.entrySet()) { + createInstances(beanFactory, entry.getKey(), entry.getValue()); + } + } + + private void createInstances(ConfigurableListableBeanFactory beanFactory, String beanName, Object bean) { + Qualifier qualifier = bean.getClass() + .getAnnotation(Qualifier.class); + for (String name : extractNames(qualifier)) { + Object newBean = beanFactory.getBean(beanName); + beanFactory.registerSingleton(name.trim(), newBean); + } + } + + private String[] extractNames(Qualifier qualifier) { + return qualifier.value() + .split(","); + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java new file mode 100644 index 0000000000..10cb6c0c1a --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/multibeaninstantiation/solution3/SpringApp3.java @@ -0,0 +1,11 @@ +package com.baeldung.multibeaninstantiation.solution3; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringApp3 { + public static void main(String[] args) { + SpringApplication.run(SpringApp3.class, args); + } +} \ No newline at end of file diff --git a/spring-di-2/src/main/java/com/baeldung/constructordi/service/UserRepository.java b/spring-di-2/src/main/java/com/baeldung/constructordi/service/UserRepository.java new file mode 100644 index 0000000000..aec9e51af9 --- /dev/null +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/service/UserRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.constructordi.service; + +import org.springframework.stereotype.Repository; + +@Repository +public class UserRepository { +} diff --git a/spring-di-2/src/main/java/com/baeldung/constructordi/service/UserService.java b/spring-di-2/src/main/java/com/baeldung/constructordi/service/UserService.java new file mode 100644 index 0000000000..7762ff324c --- /dev/null +++ b/spring-di-2/src/main/java/com/baeldung/constructordi/service/UserService.java @@ -0,0 +1,11 @@ +package com.baeldung.constructordi.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + @Autowired + private UserRepository userRepository; +} diff --git a/spring-di-3/pom.xml b/spring-di-3/pom.xml index c6a2687606..2d635d1f85 100644 --- a/spring-di-3/pom.xml +++ b/spring-di-3/pom.xml @@ -38,7 +38,6 @@ org.springframework.boot spring-boot-starter-web - 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()); + } + +}